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์ด ๋ฉ๋๋ค.
simd
๊ฐ x50 ๋ ๋น ๋ฅธ ์ด์ ์
๋๊น?mapreduce
์ sum
$ ์ ๊ธฐ์ด๊ฐ ๋๋ฏ๋ก ํ์ฌ ์ธ๊ธ๋์ง ์์ ์ธ๊ธฐ ์๋ ํจ์ ์ผ ์ ์์ต๋๋ค.( mapreduce
๋ for
-๋ฐฐ์ด ์ก์ธ์ค ์๋ ๋ฃจํ ๋ฒค์น๋งํน, ์ฌ์ ํ x2 ์ฑ๋ฅ ์ฐจ์ด๊ฐ ๋ณด์
๋๋ค. ์: mapreduce(identity, +, 0, i for i in 1:n)
๋ ๋๋ฑํ ์ ์ ํฉ์ฐ for
๋ฃจํ. ์ด ๊ฒฉ์ฐจ ๊ฐ ๋ ์ ์๋ ๊ฒ ๊ฐ์ต๋๊น? CI์์ ๋ ๋ค๋ฅธ ๋ฒค์น๋งํฌ ๊ฐ์น๊ฐ ์์ต๋๊น?)
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์ ์ค๋ณต์ผ๋ก ์ข ๋ฃ๋ฉ๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
BaseBenchmarks์ ์ด์ ๋ํ ๋ฒค์น๋งํฌ๋ฅผ ์ถ๊ฐํ๋ฉด +1์ด ๋ฉ๋๋ค. PR์ ํ๋ฅญํ ๊ฒ์ ๋๋ค.