Julia: sum|mapreduce ๋Œ€ unrolled for ๋ฃจํ”„. ์„ฑ๋Šฅ ๊ฒฉ์ฐจ

์— ๋งŒ๋“  2017๋…„ 02์›” 08์ผ  ยท  3์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: JuliaLang/julia

mapreduce ๋Š” for -loop๋ณด๋‹ค ํ›จ์”ฌ ๋Š๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž‘์€( ์‹ค์ œ ) ์˜ˆ:

function dsum(A::Matrix)
    z = zero(A[1,1])
    n = Base.LinAlg.checksquare(A)
    B = Vector{typeof(z)}(n)

    <strong i="9">@inbounds</strong> for j in 1:n
        B[j] = mapreduce(k -> A[j,k]*A[k,j], +, z, 1:j)
    end
    B
end
function dfor(A::Matrix)
    z = zero(A[1,1])
    n = Base.LinAlg.checksquare(A)
    B = Vector{typeof(z)}(n)

    <strong i="10">@inbounds</strong> for j in 1:n
        d = z
        for k in 1:j
            d += A[j,k]*A[k,j]
        end
        B[j] = d
    end
    B
end

A = randn(127,127)
time(median(<strong i="11">@benchmark</strong> dsum(A)))/time(median(<strong i="12">@benchmark</strong> dfor(A)))

Julia 0.5, juliabox.com์—์„œ ์•ฝ x50์˜ ์„ฑ๋Šฅ ๋น„์œจ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. for -loop ์ด ์ž๋™์œผ๋กœ simd ๊ฐ€ ๋  ์ˆ˜ ์žˆ๊ณ  mapreduce๋Š” ๊ทธ๋ ‡์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ผ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. A = randn(N,N) ์™€ N ๊ฐ€ 16 ์ผ ๋•Œ ์ฐจ์ด๋Š” ์•ฝ x75์ด๊ณ  N = 10000 ์˜ ๊ฒฝ์šฐ ์ฐจ์ด๋Š” ์•ฝ x25์ž…๋‹ˆ๋‹ค. ์–ด๋ ˆ์ด ์•ก์„ธ์Šค A[j,k] ๋ฅผ A[rand(1:size(A,1)),rand(1:size(A,2))] ๋ฐ”๊พธ๋ฉด ๋‘˜ ๋‹ค ์„ฑ๋Šฅ์ด ์ €ํ•˜๋˜์ง€๋งŒ ๋น„์œจ์€ x1์ด ๋ฉ๋‹ˆ๋‹ค.

  1. simd ๊ฐ€ x50 ๋” ๋น ๋ฅธ ์ด์œ ์ž…๋‹ˆ๊นŒ?
  2. ์„ฑ๋Šฅ ํŒ ์— ์„ค๋ช…ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? mapreduce ์€ sum $ ์˜ ๊ธฐ์ดˆ๊ฐ€ ๋˜๋ฏ€๋กœ ํ˜„์žฌ ์–ธ๊ธ‰๋˜์ง€ ์•Š์€ ์ธ๊ธฐ ์žˆ๋Š” ํ•จ์ •์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  3. ์œ ์šฉํ•œ ๋ฒค์น˜๋งˆํฌ๊ฐ€ ๋ ๊นŒ์š”? ๋‚˜๋…ธ์†”์ ธ?
  4. ์„ฑ๋Šฅ ์ฐจ์ด๊ฐ€ ๋” ์ž‘์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

( mapreduce ๋Œ€ for -๋ฐฐ์—ด ์•ก์„ธ์Šค ์—†๋Š” ๋ฃจํ”„ ๋ฒค์น˜๋งˆํ‚น, ์—ฌ์ „ํžˆ x2 ์„ฑ๋Šฅ ์ฐจ์ด๊ฐ€ ๋ณด์ž…๋‹ˆ๋‹ค. ์˜ˆ: mapreduce(identity, +, 0, i for i in 1:n) ๋Œ€ ๋™๋“ฑํ•œ ์ •์ˆ˜ ํ•ฉ์‚ฐ for ๋ฃจํ”„. ์ด ๊ฒฉ์ฐจ ๊ฐ€ ๋” ์ž‘ ์•˜๋˜ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๊นŒ? CI์—์„œ ๋˜ ๋‹ค๋ฅธ ๋ฒค์น˜๋งˆํฌ ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?)

performance

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

BaseBenchmarks์— ์ด์— ๋Œ€ํ•œ ๋ฒค์น˜๋งˆํฌ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด +1์ด ๋ฉ๋‹ˆ๋‹ค. PR์€ ํ›Œ๋ฅญํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ชจ๋“  3 ๋Œ“๊ธ€

https://github.com/JuliaLang/julia/issues/15276์˜ ์ค‘๋ณต์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

ํ–‰์œ„:

function dsum(A::Matrix)
    z = zero(A[1,1])
    n = Base.LinAlg.checksquare(A)
    B = Vector{typeof(z)}(n)
    <strong i="8">@inbounds</strong> for j::Int in 1:n
        B[j] = _help(A, j, z)
    end
    B
end

_help(A, j, z) = mapreduce(k -> A[j,k]*A[k,j], +, z, 1:j)

์ค€๋‹ค

julia> time(median(<strong i="12">@benchmark</strong> dsum(A)))/time(median(<strong i="13">@benchmark</strong> dfor(A)))
1.0013213312412255

@code_warntype ๋กœ Core.Box ๋ฅผ ์ฐพ์•„ ๋ฌธ์ œ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

BaseBenchmarks์— ์ด์— ๋Œ€ํ•œ ๋ฒค์น˜๋งˆํฌ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด +1์ด ๋ฉ๋‹ˆ๋‹ค. PR์€ ํ›Œ๋ฅญํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

#15276์˜ ์ค‘๋ณต์œผ๋กœ ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰

๊ด€๋ จ ๋ฌธ์ œ

TotalVerb picture TotalVerb  ยท  3์ฝ”๋ฉ˜ํŠธ

sbromberger picture sbromberger  ยท  3์ฝ”๋ฉ˜ํŠธ

omus picture omus  ยท  3์ฝ”๋ฉ˜ํŠธ

i-apellaniz picture i-apellaniz  ยท  3์ฝ”๋ฉ˜ํŠธ

yurivish picture yurivish  ยท  3์ฝ”๋ฉ˜ํŠธ