Main Content

labSend

spmd ブロックの別のワーカーにデータを送信する

    説明

    labSend(A,destination) は、spmd ブロックまたは通信ジョブの現在のワーカーからデータ A を送信します。

    ヒント

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

    関数 labSend は、destination によって指定されたワーカーにデータを送信します。

    labSend を使用するには、numlabs1 より大きくなければなりません。

    labSend(___,tag) は、タグ tag が付いたデータを送信します。labSend を使用してワーカー間でデータを送信する場合、データの複数の項目が収集されるのを待機することができます。データの複数の項目をワーカーに送信する場合、各項目にタグを付加して項目間の区別をつけます。

    すべて折りたたむ

    この例では、spmd ブロックまたは通信ジョブのワーカー間でデータを送信する方法を説明します。

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

    parpool(4);

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

    spmd ブロックを作成します。labindex1 と等しいワーカー上で、配列を作成します。labSend を使用して、labindex が 2 と等しいワーカーに配列を送信します。

    labReceive を使用してデータを収集します。

    spmd
        switch labindex
            case 1
                A = magic(3)
                labSend(A,2);
            case 2
                B = labReceive
        end
    end
    Worker 1: 
      
      A =
      
           8     1     6
           3     5     7
           4     9     2
      
    Worker 2: 
      
      B =
      
           8     1     6
           3     5     7
           4     9     2
      

    この例では、spmd ブロックまたは通信ジョブのワーカー間で、データにタグを付加して送信する方法を説明します。

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

    parpool(4);

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

    spmd ブロックを作成します。labindex1 と等しいワーカー上で、2 つの配列 A1A2 を作成します。配列の作成前と作成間に、再度 pause を使用して何らかの作業をシミュレートします。次に、labSend を使用して、labindex2 と等しいワーカーに行列を送信します。

    各行列に整数でタグを付けます。以下を含め、タグには多くの用途があります。

    • タグを使用して、データが必要なときにのみワーカーに配列を読み込むことで、メモリを節約。

    • タグを使用して、送信側ワーカーのインデックスに依存しないコードを作成。

    labindex2 と等しいワーカー上で、labReceive を使用してデータを収集します。

    tic
    spmd
        switch labindex
            case 1
                pause(5);
                A1 = magic(1)
                pause(5);
                A2 = magic(2)
                labSend(A1,2,1);
                labSend(A2,2,2);
            case 2
                B1 = labReceive('any',1)
                B2 = labReceive('any',2)
        end
    end
    toc
    Worker 1: 
      
      A1 =
      
           1
      
      
      A2 =
      
           1     3
           4     2
      
    Worker 2: 
    
      B1 =
      
           1
      
      B2 =
      
           1     3
           4     2
      
      
      
    Elapsed time is 10.061523 seconds.

    場合によっては、一部の作業を 1 つのワーカーから別のワーカーに移動することで、コードのパフォーマンスを改善することができます。一部の作業を、labindex1 と等しいワーカーから、labindex3 と等しいワーカーに移します。タグを使用すると、受信側ワーカーでコードを更新せずに、1 つのワーカーから別のワーカーへ計算を容易に移動することができます。

    tic
    spmd
        switch labindex
            case 1
                pause(5);
                A1 = magic(1)
                labSend(A1,2,1);
            case 2
                B2 = labReceive('any',2)
                B1 = labReceive('any',1)
            case 3
                pause(5);
                A2 = magic(2)
                labSend(A2,2,2);
        end
    end
    toc
    Worker 1: 
      
      A1 =
      
           1
      
    Worker 2: 
      
      B2 =
      
           1     3
           4     2
      
      
      B1 =
      
           1
      
    Worker 3: 
      
      A2 =
      
           1     3
           4     2
      
    Elapsed time is 5.117787 seconds.

    入力引数

    すべて折りたたむ

    現在のワーカーから送信するデータ。スカラー、ベクトル、行列、多次元配列、table、timetable、または任意の MATLAB 変数として指定します。

    例: magic(3)

    データを受信するワーカーのインデックス。正の整数スカラーまたはベクトルとして指定します。値は、現在の spmd ブロックまたは通信ジョブを実行しているワーカーの数である、numlabs で指定された値以下でなければなりません。

    例: [2 3 4]

    データに付加されたタグ。0 または正の整数スカラーとして指定します。指定した場合、labReceive は、tag 引数を tag として指定した labSend を使用して、現在のワーカーに送信されたデータを返します。

    例: 314159

    ヒント

    labSend を使用してデータを送信するワーカーは、受信側ワーカーがそのデータを受信する前に戻る場合があります。共有リソースを閉じる場合など、spmd ブロックまたは通信ジョブのワーカーを同期する必要があるときは、labSend および labReceive を呼び出した後に labBarrier を使用します。

    拡張機能

    バージョン履歴

    R2006a より前に導入