Main Content

spmdReceive

spmd ブロックの別のワーカーからデータを受信する

R2022b 以降

    説明

    B = spmdReceive は、現在の spmd ブロックまたは通信ジョブ内の任意のワーカーから現在のワーカーに送信されたデータ B を受信します。

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

    ワーカーが spmdReceive を実行すると、この関数は、そのワーカーがデータを受信するまで他のコマンドの実行をブロックします。

    spmdReceive を使用するには、現在の spmd ブロックを実行しているワーカーの数が 1 より大きくなければなりません。現在の spmd ブロックを実行しているワーカーの数を取得するには、関数 spmdSize を使用します。

    B = spmdReceive(source) は、インデックスが source と等しいワーカーから送信されたデータを受信します。ワーカーのインデックスを取得するには、関数 spmdIndex を使用します。

    B = spmdReceive('any') は任意のワーカーからデータを受信します。

    B = spmdReceive('any',tag) は、任意のワーカーからタグ tag を指定して送信されたデータを受信します。

    B = spmdReceive(source,tag) は、インデックスが source と等しいワーカーからタグ tag を指定して送信されたデータを受信します。

    [B,sourceOut,tagOut] = spmdReceive(___) は、別のワーカーから送信されたデータを受信し、ソース ワーカーのインデックス sourceOut を返し、データと共にタグ tagOut を返します。

    すべて折りたたむ

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

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

    parpool(4);

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

    spmd ブロックを作成します。インデックスが 1 と等しいワーカー上で、配列を作成します。spmdSend を使用して、インデックスが 2 と等しいワーカーに配列を送信し、spmdReceive を使用してデータを収集します。

    spmd
        switch spmdIndex
            case 1
                A = magic(3)
                spmdSend(A,2);
            case 2
                B = spmdReceive
        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 つのワーカーをもつ並列プールを作成します。

    parpool(4);

    spmd ブロックを作成します。インデックスが 1 と等しいワーカー上で、2 つの配列 A1A2 を作成します。配列の作成前と作成間に、関数 pause を使用して実行を一時停止し、何らかの作業をシミュレートします。次に、spmdSend を使用して、インデックスが 2 と等しいワーカーに行列を送信します。

    各行列に整数でタグを付けます。インデックスが 2 と等しいワーカー上で、spmdReceive を使用してデータを収集します。

    tic
    spmd
        switch spmdIndex
            case 1
                pause(5);
                A1 = magic(1)
                pause(5);
                A2 = magic(2)
                spmdSend(A1,2,1);
                spmdSend(A2,2,2);
            case 2
                B1 = spmdReceive('any',1)
                B2 = spmdReceive('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 つのワーカーから別のワーカーに移動することで、コードのパフォーマンスを改善することができます。一部の作業を、インデックスが 1 と等しいワーカーから、インデックスが 2 と等しいワーカーに移します。タグを使用すると、受信側ワーカーでコードを更新せずに、1 つのワーカーから別のワーカーへ計算を容易に移動することができます。

    tic
    spmd
        switch spmdIndex
            case 1
                pause(5);
                A1 = magic(1)
                spmdSend(A1,2,1);
            case 2
                B2 = spmdReceive('any',2)
                B1 = spmdReceive('any',1)
            case 3
                pause(5);
                A2 = magic(2)
                spmdSend(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.

    入力引数

    すべて折りたたむ

    データを送信しているワーカーのインデックス。正の整数または 'any' として指定します。この入力の値は、現在の spmd ブロックまたは通信ジョブを実行しているワーカーの数以下でなければなりません。

    この入力を指定した場合、spmdReceive は、インデックスが source と等しいワーカーから送信されたデータを返します。

    この入力を 'any' として指定した場合、spmdReceive は任意のワーカーから送信されたデータを返します。

    この入力を指定しない場合、spmdReceive は任意のワーカーから送信されたデータを返します。

    例: 1

    メッセージ タグ。非負の整数として指定します。この入力を指定した場合、spmdReceive は、関数 spmdSend を使用して現在のワーカーに送信されたデータを返します。tag 引数は、現在のワーカーに送信された tag と等しくなります。

    例: 314159

    出力引数

    すべて折りたたむ

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

    例: magic(3)

    データを送信しているワーカーのインデックス。正の整数または 'any' として返されます。この入力の値は、受信データを送信したワーカーのインデックスと等しくなります。

    現在のワーカーが受信するデータのメッセージ タグ。非負の整数として返されます。

    ヒント

    タグには次のような多くの用途があります。

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

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

    拡張機能

    バージョン履歴

    R2022b で導入