配列の分散および SPMD の実行
分散配列
並列プールのワーカーは相互に通信を行うので、配列を複数のワーカーに分散することが可能となります。各ワーカーは配列の一部を保持し、どのワーカーも、各ワーカーが配列のどの部分を保持しているかを認識しています。
関数 distributed
を使用して、配列をワーカー間に分散します。
M = magic(4) % a 4-by-4 magic square in the client workspace
MM = distributed(M)
ここで、MM
は M
と等価な分散配列であり、他の配列と同様にその要素の操作や要素へのアクセスを行うことができます。
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 の使用方法の詳細については、分散配列を参照してください。
参考
distributed
| spmd
| Composite