Julia: sum | mapreduceと展開されたforループ。 パフォーマンスの不一致

作成日 2017年02月08日  ·  3コメント  ·  ソース: JuliaLang/julia

mapreduceは、同等のforループよりもはるかに遅くなる可能性があります。 小さな(実際の)例:

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ループが自動的にsimdになる可能性があり、mapreduceがそうではないためだと思いますか? A = randn(N,N)N16の場合、ギャップは約x75であり、 N = 10000の場合、ギャップは約x25です。 アレイアクセスA[j,k]A[rand(1:size(A,1)),rand(1:size(A,2))]に置き換えると、両方のパフォーマンスが低下しますが、比率はx1になります。

  1. simdがx50速い理由ですか?
  2. これはパフォーマンスのヒントで説明する必要がありますか? mapreducesum $の根底にあるため、これは現在言及されていない人気のある罠である可能性があります
  3. これは有用なベンチマークでしょうか? ナノソルジャーに?
  4. パフォーマンスのギャップを小さくすることはできますか?

mapreduceforのベンチマーク-配列アクセスのないループでも、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_warntypeCore.Boxを探すことで、問題を確認できます。

これのベンチマークをBaseBenchmarksに配置するための+1。 そこにPRは素晴らしいでしょう。

#15276の重複として終了します。

このページは役に立ちましたか?
0 / 5 - 0 評価