围绕此代码,我已经在墙上撞了几天:
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的情况下,我认为这是范围的问题,花了几天时间来阅读@。@
答案 0 :(得分:2)
@distributed
和带有减速器功能的@distributed (+)
将被同步,而没有减速器功能的@distributed
将被异步启动。
在您的@sync
前面放置一个@distributed
应该可以使代码按照您希望的方式运行。
文档here中也对此有所说明:
请注意,如果没有reducer函数,则@distributed异步执行,即它在所有可用的worker上生成独立的任务并立即返回而无需等待完成。要等待完成,请在呼叫前添加@sync