Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

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

Composite の紹介

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

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

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

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

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

spmd ステートメントの後、これらのデータ値は Composite としてクライアント上でアクセス可能になります。Composite オブジェクトは cell 配列に似ており、同様に動作します。クライアントにおいて、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
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 labindex > 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 labindex == 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("local",4)

spmd
    AA = labindex; % 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 の作成

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

PP = Composite()

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

for ii = 1:numel(PP)
    PP{ii} = ii; 
end