Julia: sum|mapreduce versus unrolled for-loop. perbedaan kinerja

Dibuat pada 8 Feb 2017  ·  3Komentar  ·  Sumber: JuliaLang/julia

mapreduce bisa jauh lebih lambat daripada for yang setara -loop. Contoh kecil ( kehidupan nyata ):

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)))

memberi saya rasio kinerja sekitar x50 pada Julia 0,5, juliabox.com. Saya pikir ini bisa jadi karena for -loop dapat secara otomatis simd , dan mapreduce bukan? Ketika A = randn(N,N) dan N adalah 16 , selisihnya sekitar x75, dan untuk N = 10000 , selisihnya sekitar x25. Mengganti akses array A[j,k] dengan A[rand(1:size(A,1)),rand(1:size(A,2))] merusak kinerja keduanya, tetapi rasionya menjadi x1.

  1. Apakah simd alasan mengapa seseorang x50 lebih cepat?
  2. Haruskah ini dijelaskan dalam Kiat Kinerja ? mapreduce mendasari sum , jadi ini bisa menjadi jebakan populer yang saat ini tidak disebutkan
  3. Apakah ini akan menjadi tolok ukur yang berguna? pada tentara nano?
  4. Bisakah kesenjangan kinerja lebih kecil?

(Pembandingan mapreduce versus for -loop tanpa akses array, saya masih melihat kesenjangan kinerja x2. Misalnya mapreduce(identity, +, 0, i for i in 1:n) versus loop penjumlahan bilangan bulat for yang setara. Sepertinya celah ini dulunya lebih kecil ? Layak benchmark lain di CI?)

performance

Komentar yang paling membantu

+1 untuk menempatkan tolok ukur ini di BaseBenchmarks; PR di sana akan sangat bagus.

Semua 3 komentar

Sepertinya dup dari https://github.com/JuliaLang/julia/issues/15276.

Sedang mengerjakan:

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)

memberi

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

Anda dapat melihat masalahnya dengan @code_warntype dan mencari Core.Box .

+1 untuk menempatkan tolok ukur ini di BaseBenchmarks; PR di sana akan sangat bagus.

Ditutup sebagai duplikat dari #15276.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

iamed2 picture iamed2  ·  3Komentar

i-apellaniz picture i-apellaniz  ·  3Komentar

wilburtownsend picture wilburtownsend  ·  3Komentar

tkoolen picture tkoolen  ·  3Komentar

helgee picture helgee  ·  3Komentar