Main Content

非分散配列と分散配列

はじめに

MATLAB® ソフトウェアでサポートされている多くの組み込みデータ型およびデータ構造は、MATLAB 並列計算環境でもサポートされています。これには、数値、文字、論理値、セルまたは構造体を含む任意の次元数の配列が含まれます。これらの基本構成に加え、MATLAB 並列計算環境にはさまざまな"タイプ" の配列も用意されています。

非分散配列

非分散配列を作成すると、MATLAB ではすべてのワーカーで同じ変数名を使用して、独立の配列が各ワーカーのワークスペースに作成されます。この変数に対して実行される演算は、それに代入される個々の配列のすべてに影響を与えます。この変数に代入される値をワーカー 1 から表示すると、これに応答して、すべてのワーカーがそれぞれのワークスペースにある同名の配列を表示します。

非分散配列の状態は、各ワーカーのワークスペースにおけるその配列の値に依存します。

複製された配列

"複製された配列" はすべてのワーカーのワークスペースにあり、そのサイズと内容はすべてのワーカーで同一です。この配列を作成すると、MATLAB はすべてのワーカーで同じ変数にこれを代入します。この変数に代入される値を spmd で表示すると、すべてのワーカーが同じ配列を表示して応答します。

spmd, A = magic(3), end

 WORKER 1      WORKER 2      WORKER 3      WORKER 4
           |             |             |
8   1   6  |  8   1   6  |  8   1   6  |  8   1   6
3   5   7  |  3   5   7  |  3   5   7  |  3   5   7
4   9   2  |  4   9   2  |  4   9   2  |  4   9   2

バリアント配列

"バリアント配列" もすべてのワーカーのワークスペースに所在しますが、その内容は 1 つ以上のワーカーで異なります。この配列を作成すると、すべてのワーカーで MATLAB は同じ変数に異なる値を代入します。この変数に代入される値を表示すると、すべてのワーカーが配列の独自のバージョンを表示して応答します。

spmd, A = magic(3) + spmdIndex - 1, end

 WORKER 1      WORKER 2      WORKER 3      WORKER 4
           |             |             |
8   1   6  |  9   2   7  | 10   3   8  | 11   4   9
3   5   7  |  4   6   9  |  5   7   9  |  6   8  10
4   9   2  |  5  10   3  |  6  11   4  |  7  12   5

複製された配列は、その値が各ワーカーで一意になるとバリアント配列となります。

spmd
    B = magic(3);      %replicated on all workers
    B = B + spmdIndex;  %now a variant array, different on each worker
end

プライベート配列

"プライベート配列" はすべてのワーカーでは定義されず、1 つ以上のワーカーで定義されます。この配列を作成するには、次に示すように条件付きステートメントで spmdIndex を使用します。

spmd
    if spmdIndex >= 3, A = magic(3) + spmdIndex - 1, end
end

 WORKER 1       WORKER 2        WORKER 3       WORKER 4
            |              |              |
  A is      |    A is      |  10   3   8  |  11   4   9
undefined   |  undefined   |   5   7   9  |   6   8  10
                           |   6  11   4  |   7  12   5

対話型分散配列

複製された配列およびバリアント配列では、配列の全内容が各ワーカーのワークスペースに格納されます。一方、"対話型分散配列" はセグメントに分割され、各セグメントが別々のワーカーのワークスペースに配置されます。各ワーカーは独自の配列セグメントを扱います。各ワーカーが保管し処理しなければならない配列のサイズを縮小することにより、特に大規模なデータセットに対し、メモリ使用の効率化や処理の高速化が行われます。

次の例では、3 行 10 列の複製された配列 A を 4 つのワーカーに分散しています。結果として得られる配列 D のサイズも 3 行 10 列ですが、配列全体の 1 つのセグメントのみが各ワーカーに配置されます。

spmd
    A = [11:20; 21:30; 31:40];
    D = codistributed(A);
    getLocalPart(D)
end

  WORKER 1       WORKER 2   WORKER 3   WORKER 4
            |              |          |
11  12  13  |  14  15  16  |  17  18  |  19  20
21  22  23  |  24  25  26  |  27  28  |  29  30
31  32  33  |  34  35  36  |  37  38  |  39  40

対話型分散配列の使用についての詳細は、対話型分散配列の取り扱いを参照してください。