Main Content

配列の分散および SPMD の実行

分散配列

並列プールのワーカーは相互に通信を行うので、配列を複数のワーカーに分散することが可能となります。各ワーカーは配列の一部を保持し、どのワーカーも、各ワーカーが配列のどの部分を保持しているかを認識しています。

関数 distributed を使用して、配列をワーカー間に分散します。

M = magic(4) % a 4-by-4 magic square in the client workspace
MM = distributed(M)

ここで、MMM と等価な分散配列であり、他の配列と同様にその要素の操作や要素へのアクセスを行うことができます。

M2 = 2*MM;  % M2 is also distributed, calculation performed on workers
x = M2(1,1) % x on the client is set to first element of M2

Single Program Multiple Data (spmd)

Single Program Multiple Data (spmd) 構成を使用すると、並列プールのすべてのワーカーで並列に実行されるコード ブロックを定義できます。spmd ブロックはプール内の一部またはすべてのワーカーで実行できます。

spmd     % By default creates pool and uses all workers
    R = rand(4);
end

このコードによりプールの各ワーカーで、乱数からなる 4 行 4 列の行列 R が個別に作成されます。

Composite

spmd ステートメントの後、クライアントでは、ブロックからの値が実際にはワーカーに保存されているときでもそのデータにアクセスできます。クライアントでは、こうした変数は Composite (複合) オブジェクトと呼ばれます。Composite の各要素は、プールのワーカーにある値 (データ) を参照する記号です。変数が一部のワーカーで定義されていないために、Composite に未定義の要素が含まれる場合があることに注意してください。

上記の例に戻ると、クライアントにおいて、Composite R にはワーカーごとに 1 つの要素があります。

X = R{3};  % Set X to the value of R from worker 3.

上のコードでは、ワーカー 3 からデータを取得して X の値に代入します。次のコードはデータをワーカー 3 に送信します。

X = X + 2;
R{3} = X; % Send the value of X from the client to worker 3.

並列プールが spmd ステートメント間で開いたままで同じワーカーが使用される場合、各ワーカーのデータは spmd ステートメント間で保持されます。

spmd
    R = R + spmdIndex  % Use values of R from previous spmd.
end

spmd の典型的な使用方法は、同じコードを、異なるデータセットにアクセスする複数のワーカーで実行することです。以下に例を示します。

spmd
    INP = load(['somedatafile' num2str(spmdIndex) '.mat']);
    RES = somefun(INP)
end

これにより、ワーカー 1 の RES{1}、ワーカー 2 の RES{2} など、ワーカー上の RES の値がクライアントからアクセス可能になります。

cell 配列にインデックスを付ける場合と同様に、Composite にインデックスを付ける方法には 2 とおりあります。

  • AA{n} はワーカー n から AA の値を返します。

  • AA(n) はワーカー n から AA の内容の cell 配列を返します。

並列プールが開いている限り、データは spmd ブロック間でワーカーに保持されますが、並列プールのインスタンス間では保持されません。すなわち、プールが削除されてから新規のプールが作成された場合、最初のプールのデータはすべて失われます。

分散配列、spmd および Composite の使用方法の詳細については、分散配列を参照してください。

参考

| |

関連するトピック