ドキュメンテーション

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

afterAll

すべての parallel.Future の完了後に呼び出す関数を指定

説明

outputFuture = afterAll(futures,funtocall,nout) は、futures のすべての Future が完了した後に、それらの出力引数について自動的に funtocall を評価し、outputFuture を返して結果を格納します。afterAll は、すべての Future の出力引数の垂直連結について funtocall を評価します。Future の要素の出力引数の数が異なる場合、afterAll は最小数を使用し、最後の出力引数を無視します。afterAll は、出力引数 nout を指定して funtocall を呼び出します。

afterAll は、parfeval を使用した並列計算時に、プロットやアプリなどのユーザー インターフェイスの更新に使用すると便利です。たとえば、parfeval を使用して複数の計算をワーカーに送信し、すべてが完了したら afterAll を使用してユーザー インターフェイスを更新できます。

passFuturefalse の場合、outputFuture = afterAll(futures,funtocall,nout,'PassFuture',passFuture) は同様に動作します。passFuturetrue の場合、afterAll は Future の出力引数ではなく、これらの配列 futures に対して funtocall を呼び出します。これは、futures の要素でエラーが発生した場合でも発生します。

すべて折りたたむ

afterAll を使用して、parfeval の計算の出力すべての結合に対して自動的に関数を呼び出すことができます。

parfeval を使用して、ワーカーで乱数ベクトルを計算します。parfevalparpool が作成されていなければ、自動的に既定の設定で作成します。

for idx = 1:10
    f(idx) = parfeval(@rand, 1, 1000, 1);
end

ベクトルの作成後、これらすべての最大要素を表示します。afterAll は、すべての Future が使用可能になったら、これらの出力の結合に対して関数ハンドルを実行します。

afterAll(f, @(r) disp(max(r)), 0);
    0.9998

afterEach afterAll を組み合わせて、Future の結果に対して、さらに関数を自動的に呼び出すことができます。afterEachafterAll はいずれも、afterEachafterAll で再利用可能な future 変数を生成します。

parfeval を使用して、ワーカーで乱数ベクトルを計算します。parfevalparpool が作成されていなければ、自動的に既定の設定で作成します。

for idx= 1:10
    f(idx) = parfeval(@rand, 1, 1000, 1);
end
Starting parallel pool (parpool) using the 'local' profile ...
connected to 8 workers.

ベクトルが使用可能になったら、各ベクトルの最大要素を計算します。afterEach は、Future が使用可能になったら、各 Future の出力に対して関数ハンドルを実行し、別の Future を作成して結果を格納します。

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

これらの最小値を計算するために、この新しい Future について afterAll を呼び出します。afterAll は、すべての Future が完了した後、すべての Future の出力引数の結合に対して関数を実行します。この場合、afterAll は、maxFuture の完了後にその出力に対して関数 min を実行し、別の Future を作成して結果を格納します。

minFuture = afterAll(maxFuture, @(r) min(r), 1);

この結果は、fetchOutputs を使用して取得できます。fetchOutputs は、Future が結果の収集を完了するまで待ちます。

fetchOutputs(minFuture)
ans = 0.9973

fetchOutputs を future 変数で呼び出して、afterEach の結果を確認できます。

fetchOutputs(maxFuture)
ans = 10×1

    0.9996
    0.9989
    0.9994
    0.9973
    1.0000
    1.0000
    0.9989
    0.9994
    0.9998
    0.9999

parfeval を使用してワーカーで非同期の計算を実行し、ユーザー インターフェイスを応答可能な状態に保つことができます。中間計算が使用可能になったら、afterEach を使用してユーザー インターフェイスを更新します。すべての計算が使用可能になったら、afterAll を使用してユーザー インターフェイスを更新します。

waitbar を使用して単純なユーザー インターフェイスを作成します。

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

parfeval を使用して、乱数行列の固有値などの時間のかかる計算をワーカーで実行します。計算は非同期で実行され、計算中にユーザー インターフェイスが更新されます。parfevalparpool が作成されていなければ、自動的に既定の設定で作成します。

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

各計算が使用可能になったら、afterEach を使用してその最大値を計算します。各 Future が完了するたびに、afterEach を使用して、ウェイトバーに示される終了した Future の比率を更新します。

maxFuture = afterEach(f, @max, 1);
updateWaitbarFuture = afterEach(f, @(~) waitbar(sum(strcmp('finished', {f.State}))/numel(f), h), 1);

すべての計算が完了したら、ウェイトバーを閉じます。閉じる操作で自動的に続行するには、afterAllupdateWaitbarFuture に対して使用します。afterAll は Figure のハンドルを updateWaitbarFuture から取得し、その関数をハンドルに対して実行します。

closeWaitbarFuture = afterAll(updateWaitbarFuture, @(h) delete(h), 0);

すべての最大値を計算した後、ヒストグラムを表示します。操作を自動的に続行するには、afterAllmaxFuture に対して使用します。afterAllmaxFuture から最大値を取得し、それに対して histogram を呼び出します。

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

future 変数の計算でエラーが発生した場合、既定で afterAll はその関数を評価しません。たとえば、更新するユーザー インターフェイスがあるなど、任意のエラーを処理する場合は、名前と値のペア PassFuture を使用できます。true に設定されている場合、future 変数はコールバック関数に渡されます。これに対して fetchOutputs を呼び出し、出力を処理して、考えられるエラーすべてに対処できます。

parfeval を使用してワーカーに計算を送信します。parfevalparpool が作成されていなければ、自動的に既定の設定で作成します。parfeval の計算でエラーが発生した場合、future 変数はエラーになり、その Error プロパティに反映されます。

errorFuture = parfeval( @(n) randn(n), 0, 0.5);
Starting parallel pool (parpool) using the 'Local' profile ...
connected to 4 workers.
wait(errorFuture);
errorFuture.Error
ans = 
  ParallelException with properties:

     identifier: 'MATLAB:NonIntegerInput'
        message: 'Size inputs must be integers.'
          cause: {}
    remotecause: {[1×1 MException]}
          stack: [1×1 struct]

その Future に対して afterAll を使用した場合、コールバック関数は評価されません。以下のコードでは、Future のエラーのため、msgbox が実行されません。

afterAll(errorFuture, @() msgbox('Operation completed'), 0);

結果がエラーになる Future を扱うには、afterAll を呼び出すときに名前と値のペア PassFuture を使用します。出力ではなく future 変数がコールバック関数に渡されます。これに対して fetchOutputs を呼び出し、その出力を処理します。Future でエラーが発生すると、fetchOutputs によりエラーがスローされます。これをキャッチして処理できます。たとえば、以下のコードはエラー ダイアログ ボックスを表示します。

afterAll(errorFuture, @handleError, 0, 'PassFuture',true);

function handleError (f)
try
    output = fetchOutputs(f);
    % Do something with the output
catch
    errordlg('Operation failed');
end
end

入力引数

すべて折りたたむ

Future。parallel.Future の配列として指定します。すべての Future の要素が準備完了になると、すべての要素の出力の結合に対して funtocall が呼び出されます。Future の作成には、parfeval を使用できます。

futures のいずれかの要素でエラーが発生した場合、funtocall は呼び出されず、outputFuture はエラーで完了します。エラーが発生して Future が完了したかどうかは、outputFutureError プロパティで確認できます。futures の要素をキャンセルすると、その要素でエラーが発生した場合と同じ動作が発生します。

例: future = parfeval(@rand,1,1000,1); afterAll(future,@max,1);

データ型: parallel.Future

実行する関数。futures 内のすべての future が完了したときに、すべての future の結合された出力引数について呼び出される関数として指定します。funtocall は、並列プール ワーカー上ではなく MATLAB® クライアント上で評価されます。

例: funtocall = @max

データ型: function handle

funtocall から返される出力数。整数として指定します。

例: afterAll(futures,@max,1)

データ型: scalar

funtocall への入力引数のタイプを特定するインジケーター。logical スカラーとして指定します。true に設定されている場合、Future の配列 futuresfuntocall に渡されます。それ以外の場合は、futures のすべての Future の出力引数が funtocall に渡されます。この引数はオプションで、既定の設定は false です。

このアプローチは、あらゆるエラー処理に使用できます。passFuturetrue に設定すると、afterAllfutures でエラーが発生した場合でもその出力に対して funtocall を呼び出します。結果を抽出するには、funtocall への入力引数に対して fetchOutputs を呼び出さなければなりません。Future でエラーが発生すると、fetchOutputs によりエラーがスローされます。これをキャッチして処理できます。

例: afterAll(futures,@(f) disp(fetchOutputs(f)),0,'PassFuture',true)

データ型: logical scalar

出力引数

すべて折りたたむ

Future。parallel.Future として返されます。futures のすべての Future が使用可能になると、それらすべての出力引数の結合に対して funtocall を評価した結果を格納します。

結果を抽出するには、fetchOutputsoutputFuture で呼び出します。

outputFutures = afterAll(futures,funtocall,nout);
[out1,out2,...,outM] = fetchOutputs(outputFutures);
これは futures の出力を取得した後で funtocall を呼び出すのと同等ですが、afterAllfutures 内のすべての要素が完了したときに funtocall を自動的に呼び出します。
[tmp1,tmp2,...,tmpN] = fetchOutputs(futures);
[out1,out2,...,outM] = funtocall(tmp1,tmp2,...tmpN)
Nfutures からの出力数で、M は入力引数 nout を使用して afterAll に指定された出力数です。

ヒント

  • afterAll は、parfevalparfevalOnAllafterEachafterAll、またはこれらの組み合わせを含む配列から返されたすべての Future に使用します。たとえば、afterAll を使用して、別の afterEachafterAll の結果に対してさらに関数を自動的に呼び出します。afterAll は、Future が完了する前後に呼び出すことができます。

  • afterAll から返された Future の実行をキャンセルするには、それに対して cancel を使用します。キャンセルされた Future に対して afterAll を呼び出すと、その Future でエラーが発生した場合と同様に動作します。

R2018a で導入