ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

Composite を使用するワーカー変数へのアクセス

Composite の紹介

MATLAB® クライアント セッションの Composite オブジェクトを使用して、ワーカーのデータ値に直接アクセスできます。通常、これらの変数は spmd ステートメント内で割り当てられます。Composite は、表示と使用法においてセル配列と似ています。Composite を作成するには、2 つの方法があります。

  • クライアントでの関数 Composite の使用。Composite 要素に代入された値はワーカーに格納されます。

  • spmd ステートメント内でのワーカー上の変数の定義。spmd ステートメントの後、格納されている値は Composite としてクライアント上でアクセス可能になります。

spmd ステートメントでの Composite の作成

spmd ステートメント内で変数の値を定義または代入すると、データの値はワーカーに格納されます。

spmd ステートメントの後、これらのデータ値は Composite としてクライアント上でアクセス可能になります。Composite オブジェクトはセル配列に似ており、同様に動作します。クライアントにおいて、Composite には各ワーカーにつき 1 つの要素があります。たとえば、3 つのローカル ワーカーからなる並列プールを作成し、そのプールで spmd ステートメントを実行する場合は、次のようになります。

parpool('local',3)

spmd  % Uses all 3 workers
    MM = magic(labindex+2); % MM is a variable on each worker
end
MM{1} % In the client, MM is a Composite with one element per worker
     8     1     6
     3     5     7
     4     9     2
MM{2}
    16     2     3    13
     5    11    10     8
     9     7     6    12
     4    14    15     1

一部のワーカーでは変数が定義されない場合があります。変数が定義されていないワーカーの場合、対応する Composite 要素には値がありません。この要素を読み取ろうとすると、エラーがスローされます。

spmd
    if labindex > 1
         HH = rand(4);
    end
end
HH
     Lab 1: No data
     Lab 2: class = double, size = [4  4]
     Lab 3: class = double, size = [4  4] 

Composite 要素の値はクライアントからも設定できます。これによりデータが転送され、spmd ステートメント内で実行されない場合でも、値が適切なワーカーに格納されます。

MM{3} = eye(4);

この場合、MM は Composite として既に存在していなければなりません。存在していないと、MATLAB によりセル配列として解釈されます。

次に、spmd ステートメントを入力する際、ワーカー 3 の変数 MM の値は次のように設定されます。

spmd
    if labindex == 3, MM, end
end
Lab 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
     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('local',4)

spmd
    AA = labindex; % Initial setting
end
AA(:)  % Composite
    [1]
    [2]
    [3]
    [4]
spmd
    AA = AA * 2; % Multiply existing value
end
AA(:)  % Composite
    [2]
    [4]
    [6]
    [8]
clear AA % Clearing in client also clears on workers

spmd; AA = AA * 2; end   % Generates error

delete(gcp)

spmd ステートメント外での Composite の作成

関数 Compositespmd ステートメントを使用せずに Composite オブジェクトを作成します。これは、spmd ステートメントの実行がワーカーで開始される前にワーカーの変数に値をあらかじめ入力しておくために役立ちます。並列プールが既に開いていることを前提とします。

PP = Composite()

既定では、これにより並列プールの各ワーカーの要素をもつ Composite が作成されます。プールのワーカーのサブセットだけに基づく Composite を作成することもできます。詳細は、Composite のリファレンス ページを参照してください。Composite の要素は、クライアントで通常どおり設定することも、spmd ステートメント内で変数として設定することもできます。Composite の要素を設定すると、データは直ちに適切なワーカーに転送されます。

for ii = 1:numel(PP)
    PP{ii} = ii; 
end
この情報は役に立ちましたか?