2016-12-07 12 views
0

私は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人の作業者)で、長さnlstの場合、10^8, という非常に大きいので、同じインデックスを取得することができます。 これは時間の偶然のためだけに起こることがあります。つまり、2つのタスクはほとんど同じ時点で式idx = iを受け取り、コードは安定しません。 私はそうですか?

+0

[this](http://stackoverflow.com/questions/37287020/how-and-when-to-use-async-and-sync-in-julia)の_excellent_答えを読むことを検討してください。 @ sync'と '\ @ async'です。あなたが引用した 'pmap'の例では、各プロセスは他のプロセスとは別に' nextidx() 'から' idx'を取得します。 –

+0

私は答えを読んで、\ @syncと\ @asyncの基本的な機能を知っています。しかし、私はまだ別のタスクが同じインデックスidxを取得する可能性が懸念しています。上記の私の多くの発見を参照してください。どうもありがとう。 – user7261265

答えて

0

ジョブを正しくスケジュールする限り、いいえ。 pmapdocumentationは、マスタプロセスがジョブを連続的にスケジュールすることを指摘します。並列実行のみが非同期です。 pmapは、正しいジョブスケジューリングを保証するためにスレッドロックを必要としません。 sleepnextidxを追加すると、意図的にこの機能が中断され、観察している競合状態が発生します。すべてのプロセスが状態を共有していると仮定すると(つまり、nextidx関数の目的)、マスタプロセスは同じジョブを2回スケジュールしません。

+0

なぜ私の心配が不要なのかまだ分かりません。たぶんそれは、上記のコードがどのようにスケジューリングし、スレッドが何であるかなど、ジュリアとコンピュータの基礎となるボトムメカニズムについての知識が不足しているからです。 何か、あなたの答えは大変ありがとうございます。 – user7261265

+0

いいえ、あなたの心配は正当です。あなたが実証したように、競合条件を並列コードに導入することは困難ではありません。 Juliaの 'pmap'はそれらを避けるようにコード化されています。更新された回答をご覧ください。 –

+0

また、この回答が満足できるものであれば、それを受け入れることを検討してください。 –