Я несколько дней хожу на стену вокруг этого кода:
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 of120, что правильно).Третий - 0 или 10,95 (если 2 - 0)
Таким образом, кажется, что код печати (@mainthread?) Может быть запущен до того, как все рабочие закончат работу.Есть ли в любом случае код печати для правильной работы в первый раз (без команды ожидания)
Без нескольких println я подумал, что это проблема с областью действия, и потратил несколько дней, читая об этом @. @