Composite を使用するワーカー変数へのアクセス
Composite の紹介
MATLAB® クライアント セッションの Composite オブジェクトを使用して、ワーカーのデータ値に直接アクセスできます。通常、これらの変数は spmd
ステートメント内で割り当てられます。Composite は、表示と使用法において cell 配列と似ています。Composite を作成するには、2 つの方法があります。
spmd ステートメントでの Composite の作成
spmd
ステートメント内で変数の値を定義または代入すると、データの値はワーカーに格納されます。
spmd
ステートメントの後、これらのデータ値は Composite としてクライアント上でアクセス可能になります。Composite オブジェクトは cell 配列に似ており、同様に動作します。クライアントにおいて、Composite には各ワーカーにつき 1 つの要素があります。たとえば、3 つのローカル ワーカーからなる並列プールを作成し、そのプールで spmd
ステートメントを実行する場合は、次のようになります。
parpool("Processes",3) spmd % Uses all 3 workers MM = magic(spmdIndex+2); % MM is a variable on each worker end MM{1} % In the client, MM is a Composite with one element per worker
ans = 8 1 6 3 5 7 4 9 2
MM{2}
ans = 16 2 3 13 5 11 10 8 9 7 6 12 4 14 15 1
一部のワーカーでは変数が定義されない場合があります。変数が定義されていないワーカーの場合、対応する Composite 要素には値がありません。この要素を読み取ろうとすると、エラーがスローされます。
spmd if spmdIndex > 1 HH = rand(4); end end HH
HH = Worker 1: No data Worker 2: class = double, size = [4 4] Worker 3: class = double, size = [4 4]
Composite 要素の値はクライアントからも設定できます。これによりデータが転送され、spmd
ステートメント内で実行されない場合でも、値が適切なワーカーに格納されます。
MM{3} = eye(4);
この場合、MM
は Composite として既に存在していなければなりません。存在していないと、MATLAB により cell 配列として解釈されます。
次に、spmd
ステートメントを入力する際、ワーカー 3 の変数 MM
の値は次のように設定されます。
spmd if spmdIndex == 3, MM, end end
Worker 3: MM = 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1
Composite 要素を使用してクライアント ワークスペースで変数を明示的に割り当てると、データがワーカーからクライアントに転送されます。
M = MM{1} % Transfer data from worker 1 to variable M on the client
M = 8 1 6 3 5 7 4 9 2
Composite 全体を別の Composite に割り当てても、データは転送されません。代わりに、クライアントはワーカーに格納された該当データへの参照として Composite を単純に複製します。
NN = MM % Set entire Composite equal to another, without transfer
ただし、他の Composite に値を代入するために Composite の要素にアクセスする場合は、代入が同じワーカーに行われる場合でも、データがワーカーからクライアントに "転送されます"。この場合、NN
は Composite として既に存在していなければなりません。
NN{1} = MM{1} % Transfer data to the client and then to worker
作業が終了したら、プールを削除することができます。
delete(gcp)
変数の持続と spmd のシーケンス
ワーカーに格納された値は、異なる spmd
ステートメントの間で保持されます。このため、複数の spmd
ステートメントを連続的に使用して、前の spmd
ブロックで定義された同じ変数を引き続き使用できます。
ワーカーで値が保持されるのは、対応する Composite がクライアントで消去されるか、または並列プールが削除されるまでです。以下の例では、4 つのワーカーからなるプールを使用して、spmd
ブロックでのデータ値のライフスパンを示します。
parpool('Processes',4) spmd AA = spmdIndex; % Initial setting end AA(:) % Composite
ans = 4×1 cell array {[1]} {[2]} {[3]} {[4]}
spmd AA = AA * 2; % Multiply existing value end AA(:) % Composite
ans = 4×1 cell array {[2]} {[4]} {[6]} {[8]}
clear AA % Clearing in client also clears on workers spmd AA = AA * 2; end % Generates error delete(gcp)
Analyzing and transferring files to the workers ...done. Error detected on workers 2 3 4. Caused by: An UndefinedFunction error was thrown on the workers for 'AA'. This may be because the file containing 'AA' is not accessible on the workers. Specify the required files for this parallel pool using the command: addAttachedFiles(pool, ...). See the documentation for parpool for more details. Unrecognized function or variable 'AA'.
spmd ステートメント外での Composite の作成
関数 Composite
は spmd
ステートメントを使用せずに Composite オブジェクトを作成します。これは、spmd
ステートメントの実行がワーカーで開始される前にワーカーの変数に値をあらかじめ入力しておくために役立ちます。並列プールが既に開いていることを前提とします。
PP = Composite()
既定では、これにより並列プールの各ワーカーの要素をもつ Composite が作成されます。プールのワーカーのサブセットだけに基づく Composite を作成することもできます。詳細は、Composite のリファレンス ページを参照してください。Composite の要素は、クライアントで通常どおり設定することも、spmd
ステートメント内で変数として設定することもできます。Composite の要素を設定すると、データは直ちに適切なワーカーに転送されます。
for ii = 1:numel(PP) PP{ii} = ii; end