Main Content

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

parallel.pool.Constant

データまたは関数ハンドルからの parallel.pool.Constant のビルド

構文

C = parallel.pool.Constant(X)
C = parallel.pool.Constant(FH)
C = parallel.pool.Constant(FH,CLEANUP)
C = parallel.pool.Constant(COMP)

説明

C = parallel.pool.Constant(X) は、値 X を各ワーカーにコピーし、parallel.pool.Constant オブジェクト C を返します。このオブジェクトによって、各ワーカーは、プロパティ C.Value を使用して並列言語構成 (parforspmdparfeval) 内で値 X にアクセスできるようになります。これにより、X のワーカーへの転送が 1 度のみになるため、同じ定数データセットにアクセスする複数の parfor ループがある場合にパフォーマンスが向上します。

C = parallel.pool.Constant(FH) は、各ワーカーの関数ハンドル FH を評価して、結果を C.Value に保存します。これも、ファイル ハンドルやデータベース接続など、あらゆるハンドル型リソースを作成してワーカー上で使用する場合に役立ちます。

C = parallel.pool.Constant(FH,CLEANUP) は、各ワーカーの関数ハンドル FH を評価して、結果を C.Value に保存します。C が消去されている場合、関数ハンドル CLEANUP は、各ワーカーの単一の引数 C.Value を使用して評価されます。

C = parallel.pool.Constant(COMP) は、Composite COMP に保存された値を使用し、それらの値を各ワーカーの C.Value に保存します。これは、データが大きすぎてクライアントには適さない場合や、ワーカーのみがアクセスできるファイルからデータを読み込み中である場合など、parfor ループ内部で使用する必要があるデータをワーカー上にしか作成できない場合に特に役立ちます。COMP に各ワーカー上で定義された値が含まれていない場合はエラーになります。

ヒント

parallel.pool.Constant は MATLAB クライアント セッション内で呼び出されなければなりません。

parallel.pool.Constant は、既に実行中の並列プール、または後続の並列プールと共に使用できます。

クライアント内の配列からの parallel.pool.Constant の作成

この例では、数値による parallel.pool.Constant を作成し、同じプールの複数の parfor ループで使用する方法を説明します。

まず、クライアント上に何らかの大規模データを作成し、次に parallel.pool.Constant をビルドして、データを 1 度だけプールに転送します。

data = rand(1000);
c = parallel.pool.Constant(data);
for ii = 1:10
    % Run multiple PARFOR loops accessing the data.
    parfor jj = 1:10
        x(ii,jj) = c.Value(ii,jj);
    end
end

関数ハンドルからの parallel.pool.Constant の作成

この例では、関数ハンドルとクリーンアップ関数を使用して parallel.pool.Constant を作成する方法を説明します。

各ワーカー上に一時ファイルを作成します。@fclose を 2 番目の引数として渡すことで、c がスコープ外になった時にファイルが自動的に閉じられるようにします。

c = parallel.pool.Constant(@() fopen(tempname(pwd),'wt'),@fclose);
spmd
   disp(fopen(c.Value)); % Displays the temporary filenames.
end

parfor idx = 1:1000
   fprintf(c.Value,'Iteration: %d\n',idx);
end
clear c;   % Closes the temporary files.

Composite からの parallel.pool.Constant の作成

この例では、Composite として大規模なデータセットを spmd ブロック内のプール ワーカーに作成し、そのデータを parallel.pool.Constant として parfor ループ内で使用する方法を説明します。

spmd
  if spmdIndex == 1
    x = spmdBroadcast(1,rand(5000));
  else
    x = spmdBroadcast(1);
  end
end
xc = parallel.pool.Constant(x);
parfor idx = 1:10
  s(idx) = sum(xc.Value(:,idx));
end
s
s =
   1.0e+03 *

    2.5108    2.5031    2.5123    2.4909    2.4957    2.5462    2.4859    2.5320    2.5076    2.5432

バージョン履歴

R2015b で導入