【问题标题】:Julia parallelism: @distributed (+) slower than serial?Julia 并行性:@distributed (+) 比串行慢?
【发布时间】:2018-10-22 19:06:30
【问题描述】:

在网上看了几个关于 Julia 并行的教程后,我决定实现一个小的并行 sn-p 来计算谐波级数。

序列号为:

harmonic = function (n::Int64)
    x = 0
    for i in n:-1:1 # summing backwards to avoid rounding errors
        x +=1/i
    end
    x
end

我制作了 2 个并行版本,一个使用 @distributed 宏,另一个使用 @everywhere 宏 (julia -p 2 btw):

@everywhere harmonic_ever = function (n::Int64)
    x = 0
    for i in n:-1:1
        x +=1/i
    end
    x
end

harmonic_distr = function (n::Int64)
    x = @distributed (+) for i in n:-1:1
        x = 1/i
    end
    x
end

但是,当我运行上面的代码和@time 时,我没有得到任何加速 - 事实上,@distributed 版本的运行速度要慢得多!

@time harmonic(10^10)
>>> 53.960678 seconds (29.10 k allocations: 1.553 MiB) 23.60306659488827
job = @spawn harmonic_ever(10^10)
@time fetch(job)
>>> 46.729251 seconds (309.01 k allocations: 15.737 MiB) 23.60306659488827
@time harmonic_distr(10^10)
>>> 143.105701 seconds (1.25 M allocations: 63.564 MiB, 0.04% gc time) 23.603066594889185

让我完全困惑的是“0.04% gc time”。我显然遗漏了一些东西,而且我看到的示例不是针对 1.0.1 版本的(例如使用了@parallel)。

【问题讨论】:

    标签: parallel-processing julia


    【解决方案1】:

    你的分布式版本应该是

    function harmonic_distr2(n::Int64)
        x = @distributed (+) for i in n:-1:1
            1/i # no x assignment here
        end
        x
    end
    

    @distributed 循环将在每个工作进程上累积 1/i 的值,然后最终在主进程上。

    请注意,通常最好使用BenchmarkTools@btime 宏而不是@time 进行基准测试:

    julia> using Distributed; addprocs(4);
    
    julia> @btime harmonic(1_000_000_000); # serial
      1.601 s (1 allocation: 16 bytes)
    
    julia> @btime harmonic_distr2(1_000_000_000); # parallel
      754.058 ms (399 allocations: 36.63 KiB)
    
    julia> @btime harmonic_distr(1_000_000_000); # your old parallel version
      4.289 s (411 allocations: 37.13 KiB)
    

    如果只在一个进程上运行,并行版本当然会更慢:

    julia> rmprocs(workers())
    Task (done) @0x0000000006fb73d0
    
    julia> nprocs()
    1
    
    julia> @btime harmonic_distr2(1_000_000_000); # (not really) parallel
      1.879 s (34 allocations: 2.00 KiB)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-06-16
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      • 2021-01-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多