Julia @distributed:在所有工作人员完成之前运行后续代码

时间:2018-11-12 14:08:44

标签: asynchronous julia distributed

围绕此代码,我已经在墙上撞了几天:

using Distributed
using SharedArrays

# Dimension size
M=10;
N=100;

z_ijw = zeros(Float64,M,N,M)
z_ijw_tmp = SharedArray{Float64}(M*M*N)
i2s = CartesianIndices(z_ijw)

@distributed for iall=1:(M*M*N)
    # get index
    i=i2s[iall][1]
    j=i2s[iall][2]
    w=i2s[iall][3]
    # Assign function value
    z_ijw_tmp[iall]=sqrt(i+j+w) # Any random function would do
end

# Print the last element of the array
println(z_ijw_tmp[end])
println(z_ijw_tmp[end])
println(z_ijw_tmp[end])

第一个打印出的数字始终为0,第二个打印出的数字为0或10.95 ...(sqrt为120,是正确的)。第三个是0或10.95(如果第二个是0)

因此,似乎允许所有工作者完成之前运行打印代码(@mainthread?)。无论如何,第一次打印代码是否可以正常运行(没有等待命令)

在没有多个println的情况下,我认为这是范围的问题,花了几天时间来阅读@。@

1 个答案:

答案 0 :(得分:2)

@distributed和带有减速器功能的@distributed (+)将被同步,而没有减速器功能的@distributed将被异步启动。

在您的@sync前面放置一个@distributed应该可以使代码按照您希望的方式运行。

文档here中也对此有所说明:

  

请注意,如果没有reducer函数,则@distributed异步执行,即它在所有可用的worker上生成独立的任务并立即返回而无需等待完成。要等待完成,请在呼叫前添加@sync