Julia: sum|mapreduce 与展开的 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)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

最有用的评论

+1 用于将此基准放在 BaseBenchmarks 中; 一个公关会很棒。

所有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

+1 用于将此基准放在 BaseBenchmarks 中; 一个公关会很棒。

关闭为#15276 的副本。

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

StefanKarpinski picture StefanKarpinski  ·  249评论

IainNZ picture IainNZ  ·  109评论

juliohm picture juliohm  ·  146评论

mbauman picture mbauman  ·  276评论

tknopp picture tknopp  ·  171评论