ドキュメンテーション センター

  • 評価版
  • 製品アップデート

Composite によるデータへのアクセス

はじめに

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

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

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

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

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

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

matlabpool open 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

作業が終了したら、プールを閉じてください。

matlabpool close

変数の持続と spmd のシーケンス

ワーカーに格納された値は、異なる spmd ステートメントの間で保持されます。このため、複数の spmd ステートメントを連続的に使用して、前の spmd ブロックで定義された同じ変数を引き続き使用できます。

ワーカーで値が保持されるのは、対応する Composite がクライアントで消去されるか、または MATLAB プールが閉じるまでです。以下の例では、4 つのワーカーからなるプールを使用して、spmd ブロックでのデータ値のライフスパンを示します。

matlabpool open 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

matlabpool close

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

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

PP = Composite()

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

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