gpt4 book ai didi

performance - Julia 中的并行实现比串行慢

转载 作者:行者123 更新时间:2023-12-03 14:06:58 25 4
gpt4 key购买 nike

为什么在下面的 Julia 代码中,并行实现比串行运行慢?

using Distributed

@everywhere function ext(i::Int64)
callmop = `awk '{ sum += $1 } END { print sum }' infile_$(i)`
run(callmop)
end

function fpar()
@sync @distributed for i = 1:10
ext(i)
end
end

function fnopar()
for i = 1:10
ext(i)
end
end

val, t_par, bytes, gctime, memallocs = @timed fpar()
val, t_nopar, bytes, gctime, memallocs = @timed fnopar()

println("Parallel: $(t_par) s. Serial: $(t_nopar) s")
# Parallel: 0.448290379 s. Serial: 0.028704802 s

文件 infile_$(i)包含一列实数。经过一番研究,我遇到了这个 post而这个 other post ) 处理类似问题。不过,如果考虑到 Julia 的开发速度,它们似乎有点过时了。有没有办法改进这个平行部分?非常感谢您提前。

最佳答案

您的代码是正确的,但您错误地衡量了性能。

请注意,对于此用例场景(调用外部进程),您应该可以使用绿色线程 - 根本不需要分配负载!

当 Julia 函数第一次执行时,它正在被编译。当您在多个并行进程上执行它时,所有这些进程都需要编译同一段代码。

最重要的是第一个 @distribution宏运行也需要很长时间来编译。
因此在使用之前 @timed你应该调用 fparnofpar职能。

最后但并非最不重要的是,没有 addprocs在您的代码中,但我假设您已经使用了 -p将工作进程添加到 Julia 主进程的 Julia 选项。顺便说一句,您没有提到您拥有多少个工作进程。

我通常这样测试代码:

@time fpar()
@time fpar()
@time fnopar()
@time fnopar()

第一个措施是了解编译时间,第二个措施是了解运行时间。

也值得一看 BenchmarkTools包和 @btime宏。

关于性能测试 @distributed有很大的通信开销。在某些情况下,这可以通过使用 SharedArrays 来缓解。在其他人中使用 Thread.@threads .但是,在您的情况下,最快的代码是使用绿色线程的代码:
function ffast()
@sync for i = 1:10
@async ext(i)
end
end

关于performance - Julia 中的并行实现比串行慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62479912/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com