我一直在尝试学习如何在 Julia 中执行分布式并行编程,并想澄清一些疑问。
using Distributed
addprocs(4)
@everywhere function foo(n)
sleep(0.001)
return randn(10)
end
function inner_loop(func, n_times)
out = @distributed (+) for var = [10 for i=1:n_times]
func(var);
end
end
function main(n_outer_loops)
out=zeros(10);
for i=1:n_outer_loops
out += inner_loop(foo, 10)
end
return out;
end
r = main(4)
我的内部循环与
@distributed
宏和 reduction
(+)
并行运行。该函数是否会等到每个处理器中的每个 func
完成,然后将其添加到解决方案中?
对于 var=1
,Worker1
完成 func
,…WorkerN
完成 func
。然后,将所有内容添加到out
。
或者一旦
func
在工作人员中完成,它就会添加到解决方案中吗? Worker1
完成 func
,添加到 out
,… WorkerN
完成 func
添加到 out
。
由于这仅并行化内部循环,这是一个合适的实现吗?或者 Julia 是否在每个
outer_loop
处创建和销毁并行部分,从而产生不小的开销?如果是的话,是否可以创建一次,然后在inner_loops中分配作业?
请注意,两个
out
是不同的局部变量,您碰巧命名相同,但不相关。
内循环自动返回最新值,您将其命名为
out
,就像外循环中的名称一样..
因此,每个“inner out”的计算都是并行的,当每个进程完成后,ot的值就会被添加到“ourr out”中,并开始新的并行计算。