私はJuliaを初めて使い、Julia並列計算を勉強しています。 関連文書を読んだあと、\@sync
と\@async
というマクロを含むJuliaの並列性の正確なメカニズムについてはまだわかりません。Julia並列計算の同時実行
次はJulia v0.5 documentationからpmap
機能である:異なる2つのプロセッサ/労働者が同じidx = j
を得ると同時に、nextidx()
を呼び出すため
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
それは可能ですか?はいの場合、results[j]
は2回計算され、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
です。 これにより、2つのタスクが関数nextidx()
を呼び出す期間が重複する可能性があります。だから、最初のコードでは、 np = 3
(つまり2人の作業者)で、長さn
がlst
の場合、10^8, という非常に大きいので、同じインデックスを取得することができます。 これは時間の偶然のためだけに起こることがあります。つまり、2つのタスクはほとんど同じ時点で式idx = i
を受け取り、コードは安定しません。 私はそうですか?
[this](http://stackoverflow.com/questions/37287020/how-and-when-to-use-async-and-sync-in-julia)の_excellent_答えを読むことを検討してください。 @ sync'と '\ @ async'です。あなたが引用した 'pmap'の例では、各プロセスは他のプロセスとは別に' nextidx() 'から' idx'を取得します。 –
私は答えを読んで、\ @syncと\ @asyncの基本的な機能を知っています。しかし、私はまだ別のタスクが同じインデックスidxを取得する可能性が懸念しています。上記の私の多くの発見を参照してください。どうもありがとう。 – user7261265