Я новичок в Джулии и изучаю недавно параллельные вычисления Julia. Я до сих пор не совсем понял, насколько точно механизм параллелизма Юлии включает макросы \@sync
и \@async
после того, как я прочитал соответствующие документы.Согласование параллельных вычислений Julia
Ниже приводится pmap
функции от Julia v0.5 documentation:
function pmap(f, lst)
np = nprocs() # determine the number of processes available
n = length(lst)
results = Vector{Any}(n)
i = 1
# function to produce the next work item from the queue.
# in this case it's just an index.
nextidx() = (idx=i; i+=1; idx)
@sync begin
for p=1:np
if p != myid() || np == 1
@async begin
while true
idx = nextidx()
if idx > n
break
end
results[idx] = remotecall_fetch(f, p, lst[idx])
end
end
end
end
end
results
end
Возможно ли разные два процессора/рабочие называют nextidx()
в то же время получать те же idx = j
? Если да, то я чувствую, что results[j]
будет вычислен дважды и result[j+1]
не будет вычислен.
Большое спасибо.
Более выводы:
function f1()
i=1
nextidx()=(idx=i;sleep(1);i+=1;idx)
for p=1:2
@async begin
idx=nextidx()
println(idx)
end
end
end
f1()
В результате 1 1
. С помощью этого я нахожу периоды времени, в течение которых две задачи, вызывающие функцию nextidx()
, могут перекрываться. Поэтому я чувствую, что в первом коде , если np = 3
(т. Е. Два работника), а длина n
из lst
очень велика, скажем, 10^8, , возможно, чтобы задачи получили тот же самый индекс. Это может произойти только из-за совпадения во времени, то есть две задачи принимают выражение idx = i
почти в тот же момент времени, поэтому код нестабилен. Я прав?
Рассмотрите вопрос об ответе _excellent_ на [this] (http://stackoverflow.com/questions/37287020/how-and-when-to-use-async-and-sync-in-julia) Вопрос о '\ @ sync' и '\ @ async'. в примере «pmap», который вы цитируете, каждый процесс получает 'idx' из' nextidx() 'отдельно от других процессов. –
Я прочитал ответ и теперь знаю основные функции \ @sync и \ @async. Тем не менее, я по-прежнему отношусь к разным задачам, может получить один и тот же индекс idx. Смотрите мои дальнейшие выводы выше. Большое спасибо. – user7261265