Main Content

spmdSend

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

R2022b 以降

    説明

    spmdSend(A,destination) は、spmd ブロックまたは通信ジョブの現在のワーカーから destination によって指定されたワーカーにデータ A を送信します。

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

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

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

    すべて折りたたむ

    この例では、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.

    入力引数

    すべて折りたたむ

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

    例: magic(3)

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

    例: [2 3 4]

    メッセージ タグ。非負の整数として指定します。この入力を指定した場合、spmdSend はこのタグが付いたデータを送信します。spmdReceive を使用して別のワーカーのデータを受信する場合、その関数はこのタグを tagOut 出力に返します。

    例: 314159

    ヒント

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

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

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

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

    拡張機能

    バージョン履歴

    R2022b で導入