Main Content

parfeval

並列プール ワーカーで関数を実行

説明

F = parfeval(fcn,numFcnOut,X1,...,Xm) は、関数 fcn の実行をスケジュールします。使用可能な並列プールがある場合、MATLAB® はそれを使用してこの関数を実行します。それ以外の場合、この関数は逐次実行されます。

この構文を使用する並列コードは、Parallel Computing Toolbox™ を保有していない MATLAB ユーザーと共有できます。

MATLAB は、指定した入力引数 X1,…Xm を用いて各ワーカー上で関数 fcn を非同期で評価し、numFcnOut 出力引数を返します。

MATLAB は、関数 fcn の実行が完了する前に、Future オブジェクト F を返します。fetchOutputs を使用すると、Future から結果を取得できます。関数 fcn の実行を停止するには、関数 cancel を使用します。Future の詳細については、Future を参照してください。

並列プールが開いている場合、MATLAB はその並列プールを使用して関数 fcn を実行します。

並列プールが開いていない場合、動作はプールの自動作成が有効かどうかによって異なります。

  • プールの自動作成が有効であれば、MATLAB は既定のクラスター プロファイルを使用して並列プールを開始し、その後その並列プールを使用して関数 fcn を実行します。既定では、プールの自動作成は有効になっています。

    parpool をプール引数 pool に指定することで、この動作を手動により強制できます。

  • プールの自動作成が無効であれば、MATLAB は遅延実行を使用して関数 fcn を実行します。

    parallel.Pool.empty をプール引数 pool に指定することで、この動作を手動により強制できます。

F = parfeval(pool,fcn,numFcnOut,X1,...,Xm) は、関数 fcn がプール pool を使用して実行されるようにスケジュールします。この構文は、実行時にプールを指定する場合に使用します。

コードをバックグラウンドで実行するには、MATLAB 関数 parfeval のページを参照してください。

すべて折りたたむ

parfeval を使用して、ワーカー上での関数の非同期実行を要求します。

並列プールに 1 件の要求を投入します。関数 fetchOutputs を使用して出力を取得します。

f = parfeval(@magic,1,10);
Starting parallel pool (parpool) using the 'Processes' profile ...
Connected to parallel pool with 6 workers.
value = fetchOutputs(f);
value(1)
ans = 92

for ループで複数の Future 要求を指定し、結果が使用可能になった時点で、それらをベクトル形式で収集します。効率性を高めるため、ループを開始する前に、Future オブジェクトの配列を事前に割り当てます。

f(1:10) = parallel.FevalFuture;
for idx = 1:10
    f(idx) = parfeval(@magic,1,idx);
end

fetchNext を使用して、個々の Future 出力が使用可能になった時点で取得します。fetchNext を呼び出したときにオブジェクト配列 FevalFuture の要素が使用できない場合、MATLAB は要素が使用可能になるまで待機します。

magicResults = cell(1,10);
for idx = 1:10
    [completedIdx,value] = fetchNext(f);
    magicResults{completedIdx} = value;
    fprintf("Got result with index: %d.\n",completedIdx)
end
Got result with index: 1.
Got result with index: 2.
Got result with index: 3.
Got result with index: 7.
Got result with index: 8.
Got result with index: 9.
Got result with index: 10.
Got result with index: 4.
Got result with index: 5.
Got result with index: 6.

リモート クラスター プロファイル myMJSCluster を使用して並列プールを起動します。

myClusterPool = parpool(myMJSCluster,15);
Starting parallel pool (parpool) using the 'myMJSCluster' profile ...
Connected to parallel pool with 15 workers.

parfeval を使用して、プール myClusterPool 上の 1000 行 1000 列の行列の各列の要素の合計を計算します。結果を取得します。

f = parfeval(myClusterPool,@sum,1,rand(1000));
results = fetchOutputs(f)'
results = 1000×1

  509.8296
  483.2762
  505.1542
  479.3408
  489.2463
  512.2336
  495.8580
  499.5442
  487.5374
  491.4364
      ⋮

この例では、計算の完了時にユーザー インターフェイスを更新する方法を説明します。parfeval を使用して計算をワーカーにオフロードすると、ワーカーが計算を実行中にすべてのユーザー インターフェイスが応答可能な状態になります。waitbar を使用すると単純なユーザー インターフェイスを作成できます。

  • それぞれの計算が完了するたびにユーザー インターフェイスを更新するには、afterEach を使用します。

  • すべての計算が完了した後にユーザー インターフェイスを更新するには、afterAll を使用します。

waitbar を使用して Figure ハンドル h を作成します。afterEach または afterAll を使用すると、関数 waitbar は Figure ハンドルを更新します。ハンドル オブジェクトの詳細については、ハンドル オブジェクトの動作を参照してください。

h = waitbar(0,'Waiting...');

parfeval を使用して、乱数行列の固有値の実数部を計算します。既定の基本設定では、並列プールがまだ作成されていなければ、parfeval によって自動的に作成されます。効率性を高めるため、Future オブジェクトの配列を事前に割り当てます。

f(1:100) = parallel.FevalFuture;
for idx = 1:100
    f(idx) = parfeval(@(n) real(eig(randn(n))),1,5e2); 
end

afterEach を使用して、parfeval の各計算結果に対して自動的に関数を呼び出すことができます。f 内の各 future が完了するたびに、afterEach を使用して別の future オブジェクトのセットをスケジュールし、各出力配列内の最大値を計算します。

maxFuture = afterEach(f,@max,1);

State プロパティを使用して、future のステータスを取得できます。ウェイト バー h の割合の長さを、実行が終了した Future オブジェクトの割合に更新する無名関数を定義します。無名関数 updateWaitbar は、f の対応する Future オブジェクトの State プロパティが "finished" の場合に要素が true である logical 配列の平均値を計算します。

updateWaitbar = @(~) waitbar(mean({f.State} == "finished"),h);

maxFuture の各 future が完了するたびに、afterEachupdateWaitbar を使用してウェイト バーの割合の長さを更新します。すべての計算が完了したら、afterAlldelete を使用してウェイト バーを閉じます。

updateWaitbarFutures = afterEach(f,updateWaitbar,0);
afterAll(updateWaitbarFutures,@(~) delete(h),0)

すべての future が完了したら、afterAllhistogram を使用して maxFuture の結果のヒストグラムを表示します。

showsHistogramFuture = afterAll(maxFuture,@histogram,0);

入力引数

すべて折りたたむ

ワーカーで実行する関数。関数ハンドルとして指定します。

例: fcn = @sum

データ型: function_handle

関数 fcn から要求された出力引数の数。非負の整数として指定します。

numFcnOut は、fcn(X1,...,Xm) を実行するときに要求する出力引数の数です。

データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

入力引数。変数または式のコンマ区切りリストとして指定します。並列プールのワーカーは、これらの引数を関数 fcn に入力します。

プール。parallel.Pool オブジェクトとして指定します。

  • 並列プールを作成するには、parpool を使用。

  • バックグラウンド プールを取得するには、backgroundPool を使用。

例: parpool("Processes");

例: backgroundPool;

出力引数

すべて折りたたむ

Future。parallel.FevalFuture オブジェクトとして返されます。

  • F から結果を取得するには、fetchOutputs または fetchNext を使用。

  • F が 1 つの計算またはすべての計算を完了したときに関数を実行するには、それぞれ afterEach または afterAll を使用。

拡張機能

バージョン履歴

R2013b で導入

すべて展開する