在 Julia 中并行化内部循环

问题描述 投票:0回答:1

我一直在尝试学习如何在 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中分配作业?

julia
1个回答
0
投票

请注意,两个

out
是不同的局部变量,您碰巧命名相同,但不相关。

内循环自动返回最新值,您将其命名为

out
,就像外循环中的名称一样..

因此,每个“inner out”的计算都是并行的,当每个进程完成后,ot的值就会被添加到“ourr out”中,并开始新的并行计算。

© www.soinside.com 2019 - 2024. All rights reserved.