2016-06-27 12 views
2

確率的アルゴリズムの結果を複数回計算する必要があります。最終的には、すべての結果を配列にまとめたいと思っています。アルゴリズムの実行は、互いに独立しています。ジュリアでは、これは、このようなforループの並列で簡単に並列化することができます。Juliaで並列ループを返す配列を最適化する

@parallel (vcat) for i=1:10 
    rand() # or any other algorithm yielding a number 
end 

しかし、それは、あるスレッドが別のスレッドの結果を取得する場合少し非効率ですし、二つの結果がためのすべての繰り返しの後にマージされますループ。 これが正しいですか?この場合、1つのスレッドが100要素の配列を生成し、もう1つのスレッドが200要素の配列を持ち、これらの配列が300要素の配列にマージされる可能性があります。 何とかこれを防ぎ、上記のコードを書き直して複数の配列の割り当てを防止し、forループ内で計算された結果を事前に割り当てられた配列に入れることができますか? 還元演算子をもっとスマートにすることはできますか?

答えて

3

これにはpmapを使用できます。ワーカーは作業者に作業を並行して配布し、各ジョブの結果をアレイの別々の要素として保存することができます。この配列を最後に組み合わせることができます。

addprocs(3) 

Results = pmap(rand, 1:10) 

Result = vcat(Results...) ## array of length 55. 

pmapとすぐ、それが終了するように、各ワーカーにジョブを割り当てる:

全ては端部に結合され、各ジョブは異なる長さのランダムベクトルを作成することであり、この例を考えそれが働いている仕事。そのため、ジョブの長さが可変であれば、@parallelより効率的です。 (詳細はhereを参照)。

...の構文は、Resultsの要素(すなわち、可変長の10個のベクトル)を別々の引数に分割して、vcat関数に供給します。

+1

ありがとうございました。私は 'pmap'を知らなかった。あなたの他の答えへのリンクもとても役に立ちました! – esel

関連する問題