Main Content

spmdBarrier

spmd ブロックにおけるワーカーの同期

R2022b 以降

    説明

    spmdBarrier は、現在の spmd ブロックまたは通信ジョブ内のすべてのワーカーに対し、各ワーカーが spmdBarrier を呼び出すまでコードを実行できないようにします。

    parforparfeval を使用して計算をオフロードする場合、各計算は一度に 1 つのワーカーによってのみ実行されます。これらのワーカーは独立しており、相互の通信は行われません。これらのワーカーに spmdBarrier を適用する場合、この関数による影響はありません。

    たとえば、ワーカーがファイル ハンドルのような共有リソースを使用する場合などに、spmdBarrier を使用してワーカーを同期します。

    現在の spmd ブロックで 1 つのワーカーのみが実行されている場合、実行は直ちに続行されます。現在の spmd ブロックを実行しているワーカーの数を調べるには、関数 spmdSize を使用します。関数 spmdSize は、spmd ブロックまたは通信ジョブの外部では値 1 を返します。

    すべて折りたたむ

    この例では、spmdBarrier を使用して spmd ブロックでワーカーを同期する方法を説明します。

    4 つのワーカーをもつ並列プールを作成します。

    parpool(4);

    並列プールの作成後に spmd ブロックを実行すると、既定ではそのプール内のすべての使用可能なワーカーで、spmd ブロック内のコードが実行されます。

    spmd ブロックを作成します。各ワーカーをランダムな長さの時間一時停止して、計算量が多い何らかの作業をシミュレートします。tictoc を使用して、各ワーカー上での実行時間を測定します。

    spmd
        tic
        pause(5*rand);
        toc
    end
    Worker 2: 
      Elapsed time is 0.702969 seconds.
    Worker 3: 
      Elapsed time is 1.807292 seconds.
    Worker 1: 
      Elapsed time is 4.651690 seconds.
    Worker 4: 
      Elapsed time is 4.694443 seconds.

    各ワーカーが pause を実行した後にワーカーを同期するには、spmdBarrier を使用します。最も遅いワーカーが計算を終了するまですべてのワーカーが待機します。小さな数値的ノイズを除いて、各ワーカーでの経過時間は同じになっています。

    spmd
        tic
        pause(5*rand);
        spmdBarrier;
        toc
    end
    Worker 1: 
      Elapsed time is 4.758529 seconds.
    Worker 2: 
      Elapsed time is 4.758529 seconds.
    Worker 3: 
      Elapsed time is 4.743785 seconds.
    Worker 4: 
      Elapsed time is 4.743739 seconds.

    拡張機能

    バージョン履歴

    R2022b で導入