2016-09-21 11 views
3

私はjuliaで並列計算で初めて遊んでいます。私は少し頭痛があります。だから私がjuliaを次のように始めるとしよう:julia -p 4。それから私はすべてのプロセッサのための関数を宣言し、次にpmap@parallel forと一緒に使用します。Julia並列マクロが動作しないようです

@everywhere function count_heads(n) 
    c::Int = 0 
    for i=1:n 
     c += rand(Bool) 
    end 
    n, c # tuple (input, output) 
end 

###### first part ###### 
v=pmap(count_heads, 50000:1000:70000) 
println("Result first part") 
println(v) 

###### second part ###### 
println("Result second part") 
@parallel for i in 50000:1000:70000 
    println(count_heads(i)) 
end 

結果は以下のとおりです。

Result first part 
Counting heads function 
Any[(50000,24894),(51000,25559),(52000,26141),(53000,26546),(54000,27056),(55000,27426),(56000,28024),(57000,28380),(58000,29001),(59000,29398),(60000,30100),(61000,30608),(62000,31001),(63000,31520),(64000,32200),(65000,32357),(66000,33063),(67000,33674),(68000,34085),(69000,34627),(70000,34902)] 
Result second part 
    From worker 4: (61000, From worker 5: (66000, From worker 2: (50000, From worker 3: (56000 

したがって、funcion pmapは明らかに正常に動作しているが、@parallel forが停止しているか、それは私に結果を与えるものではありません。私は何か間違っているのですか?

ありがとうございます!

アップデートは、コードの最後に、私はsleep(10)を置く場合。それは正しく働きます。

From worker 5: (66000,33182) 
From worker 3: (56000,27955) 
............ 
From worker 3: (56000,27955) 
+0

また、変数に物事を割り当て、返されたものをチェックする(またはフェッチされたリモート参照を使用する)場合は、printlnではなく、おそらくもっと便利で、おそらくより良い方法を試してみようとしています。私はあなたが後でそれらを使用するものになる可能性が高いと思うので –

答えて

5

私のラップトップでは、両方の例が適切に動作するので、わかりませんが、この回答があなたの問題を解決できると思います!

期待どおりジュリア並列コンピューティングドキュメントhttp://docs.julialang.org/en/release-0.4/manual/parallel-computing/から@parallel for

@syncを追加する場合、それが動作するはずです:それは必要 ではない場合

...リダクション演算子を省略することができます。その場合、ループは非同期に実行されます。つまり、利用可能なすべてのワーカーに対して 独立タスクを生成し、完了を待たずにすぐに RemoteRefの配列を返します。呼び出し元は の後でRemoteRef補完を待つことができます。fetch() を呼び出すか、ループの最後に@Sync @parallel forなどの@syncを接頭辞として、 の接頭辞を付けることで完了します。

したがって、完了する前にRemoteRefでprintlnと呼んでいる可能性があります。

+0

ありがとう!私は '@parallel'を' @sync @ parallel'に置き換えました。それはうまく動作します。一般的な質問と同じです。なぜそれが必要ですか? – silgon

+0

ドキュメントは意味がありませんか? @syncがなければ、ループは即座に(つまり、作業者が関数の実行を完了していなくても)いくつかのオブジェクト(RemoteRef)を返します。答えを返す/印刷する前にそれらが完了するのを待つために、 'fetch()'を使うか、@syncを使ってループの最後を待つことができます。 –

関連する問題