Julia @distributed: последующий код запускается до того, как все рабочие закончат - PullRequest
0 голосов
/ 12 ноября 2018

Я несколько дней хожу на стену вокруг этого кода:

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 я подумал, что это проблема с областью действия, и потратил несколько дней, читая об этом @. @

1 Ответ

0 голосов
/ 12 ноября 2018

@distributed с функцией редуктора, то есть @distributed (+), будет синхронизироваться, тогда как @distributed без функции редуктора будет запускаться асинхронно.

Помещение @sync перед @distributed должен заставить код вести себя так, как вы хотите.

Это также отмечено в документации здесь :

Обратите внимание, что без функции редуктора,@distributed выполняется асинхронно, т. е. порождает независимые задачи для всех доступных работников и немедленно возвращается, не дожидаясь завершения.Чтобы дождаться завершения, введите префикс @ sync

.
...