Main Content

labBarrier

(非推奨) spmd ブロックにおけるワーカーの同期

    labBarrier は推奨されません。代わりに spmdBarrier を使用してください。詳細については、バージョン履歴を参照してください。

    説明

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

    ヒント

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

    ワーカーがファイル ハンドルのような共有リソースを使用する場合など、ワーカーを同期する必要がある場合に labBarrier を使用します。

    numlabs1 と等しい場合、実行は直ちに続行されます。numlabs は、spmd ブロックまたは通信ジョブの外部では 1 と等しくなります。

    すべて折りたたむ

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

    4 つのワーカーをもつ並列プールを作成します。既定では、spmd はプロセスベースのすべてのプールでサポートされています。

    parpool(4);

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

    spmd ブロックを作成し、各ワーカー上で pause をランダムな長さの時間実行して、計算量が多い何らかの作業をシミュレートします。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 を実行した後にワーカーを同期するには、labBarrier を使用します。次のコードでは、最も遅いワーカーが計算を終了するまですべてのワーカーが待機します。わずかな数値的ノイズを除いて、各ワーカーでの経過時間は同じになっています。

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

    バージョン履歴

    R2006a より前に導入

    すべて折りたたむ

    R2022b: 関数 labBarrier は非推奨

    spmd ブロック内で使用するものであることがわかるように、labBarrier の名前が spmdBarrier に変更されました。labBarrier は引き続き使用できますが、非推奨になっています。コードを更新するには、labBarrier のすべてのインスタンスを spmdBarrier に置き換えてください。labBarrier を削除する予定はありません。