2

これは過去に尋ねられたかもしれないが、私はJuliaの絶対初心者です。Juliaの非同期多重計算の並列コード

私はジュリアに、私が並行して走りたいという単純なコードを持っています。あなたが見ることができるように、vt_1ct_1の計算は(vt_1計算のct_1計算待ちをせずに、同じループの中に)を同時に行うことができる

#--Two Calculations during the Loop-- 

vt_0=0 
ct_0=0 

for i=1:10 

#--Calculation vt_1 
vt_1=max(rand(1:i),vt_0,ct_0) 


#--Calculation ct_1 
ct_1=min(rand(1:i),vt_0,ct_0) 

ct_0=ct_1 
vt_0=vt_1 

end 

このコードを変更して並列実行することは誰にでも助けられますか? Juliaスクリプト/ライブラリをダウンロードする必要がありますか? (私は動的計画法のために非常に大きく、複雑なコードを持っていますが、本質は同じである。)

これに対する実際の良い答えがあります場合、私は好奇心旺盛になるだろう、事前に

+1

基本ループの人々はあなたが(私が理解に対し、別々のコア上で、ループの各反復を意味推測並列化することによりとしてあなたはタイトルを変更したい場合があります)は、複数の式を非同期で実行し、すべての答えを待つだけです。 –

+0

完了。それが今より意味をなさないことを願っています。 – Gunnar

答えて

3

これはあなたの探しているものですか?おそらく私はここにあるのと同じくらい無名の関数を使用しないほうが速いでしょうが、それ以外は。

addprocs(2)   
vt_0 = 0; ct_0 = 0; 
for i=1:10 
    #--Calculation vt_1 
    vt_1 = remotecall((x,y)->max(rand(1:i),x,y), 2, vt_0, ct_0) 

    #--Calculation ct_1 
    ct_1 = remotecall((x,y)->min(rand(1:i),x,y), 3, vt_0, ct_0) 

    ct_0 = fetch(ct_1) 
    vt_0 = fetch(vt_1) 
end 

または匿名のfuncsなし:

addprocs(2) 
@everywhere minrand(i,x,y) = min(rand(1:i),x,y) 
@everywhere maxrand(i,x,y) = max(rand(1:i),x,y) 
vt_0 = 0; ct_0 = 0; 

for i=1:10 
    #--Calculation vt_1 
    vt_1 = remotecall(maxrand, 2, i, vt_0, ct_0) 

    #--Calculation ct_1 
    ct_1 = remotecall(minrand, 3, i, vt_0, ct_0) 

    ct_0 = fetch(ct_1) 
    vt_0 = fetch(vt_1) 
end 
+0

まさに私が探していたもの!どうもありがとう。 – Gunnar

+0

こんにちは!私はこれらの2つのパラレルバージョン(異なるパラメータを使用)を試してきました。並列に計算するのに要する時間は、逐次よりずっと長くなりました。たとえば、反復回数を10から10000に変更すると、単純なシーケンシャルコードでは平均で0.010秒、並列コードでは2番目のコードでは平均で27秒かかります。私は何か間違っていると思いますか?おそらく私は何かを欠いているでしょうか?私はジュピターノートを使用しています。 TIA! – Gunnar

+0

だから27秒という音が大きすぎるので、そこに何か他のものがあるかもしれませんが...この場合は計算を分割することよりゲインを上回る別のプロセッサとの間でデータをやりとりするためのオーバヘッド(IO関連) 。 (各ループに20個の表現が分かれていれば、その物語は違うかもしれません)。あなたはマルチスレッドを試してみると良いかもしれません - そうでない場合は、タイミングが最速であることを伝えてください! –

2

、ありがとうございました。 Juliaでの通常の並列実行はBaseの一部なので、特別なライブラリは必要ありません。しかし、ユースケースは並列実行IIUCの典型的なケースではありません。通常、並列forループは同じ式を異なる値で呼び出すことを繰り返します。つまり、あるコアでi = 1、別のコアでi = 2に関連する式を実行し、結果をマージします。ここで良い説明があります:https://docs.julialang.org/en/latest/manual/parallel-computing/#Parallel-Map-and-Loops-1

あなたが示唆しているのは、異なるコア上でプログラムの異なるビット(異なる式)を実行することです。編集:アレキサンダーの応答でそれを行う方法の良い説明があります。

+0

何か不足していますか?それとも私が置いたことが意味をなさないでしょうか? –

+0

AFAICSそれは完璧な意味を持っています:-)私はこのようなことをするユースケースがあるかもしれません。 –

関連する問題