【发布时间】:2020-06-19 23:32:17
【问题描述】:
为什么在下面的 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 的开发速度,它们似乎有点过时了。有什么办法可以改善这个平行部分吗?非常感谢您。
【问题讨论】:
-
恕我直言,这不是测试并发性的最佳示例。生成一个外部进程并同时访问同一个文件(文件/文件 IO 也有锁)同时打开了太多的蠕虫罐并掩盖了问题。此外,工作量(10 个数字)太小,多线程的开销不太可能摊销。最好将/更多数据读入一个数组,然后用它来比较单线程和多线程执行。
-
@BitTickler 感谢您的评论。上面的代码是对实际问题的简化:我绝对需要使用输入文件调用外部进程(实际上,我调用了量子化学包MOPAC)并且由于所有输入都是独立的,在我看来它是一个尴尬的平行问题。我使用了
awk命令,因为它确实与我的情况有一些相似之处。
标签: performance parallel-processing julia external-process