非同期関数
MATLAB® では、コードは同期的または非同期的に実行されます。次の関数を使用すると、コードを非同期的に実行できます。
2 つの乱数行列の最大値を計算します。MATLAB は各行を連続して実行します。
tic A = rand(10000); B = ones(10000); C = max(A,B); toc
Elapsed time is 0.992156 seconds.
コードを実行すると、MATLAB は 3 つの計算を実行します。
フォアグラウンドで
A = rand(10000)を計算します。フォアグラウンドで
B = ones(10000)を計算します。AとBを作成した後、フォアグラウンドでC = max(A,B)を計算します。

非同期コード
関数を非同期的に実行する場合、MATLAB は他のコードをフォアグラウンドで同時に実行できます。
関数を非同期的に実行するには、parfeval または parfevalOnAll を使用します。前の関数が完了した後に関数を非同期的に実行するには、afterEach と afterAll を使用します。
関数を非同期的に実行すると、MATLAB は
Futureオブジェクトをすぐに返します。MATLAB は、関数をバックグラウンドまたは並列プールで実行するようにスケジュールします。コードをバックグラウンドで実行するには
parfevalおよびbackgroundPoolを使用します。Parallel Computing Toolbox™ がインストールされている場合、コードを並列プールで実行するには
parpool(Parallel Computing Toolbox) を使用します。Parallel Computing Toolbox がある場合、
parfeval(Parallel Computing Toolbox) と他の関数を使用してコードを並列プールで自動的に実行できます。詳細については、自動並列サポートを使用した MATLAB 関数の実行 (Parallel Computing Toolbox)を参照してください。
バックグラウンドでの関数の実行中に同時に他のコードを実行できます。
Futureオブジェクトから結果を取得するにはfetchOutputsを使用します。
| 同期関数 | 非同期関数 |
|---|---|
| MATLAB は関数が完了するまで待機します。 | MATLAB は関数が完了するまで待機しません。 |
| MATLAB はすぐにコードを実行します。 | MATLAB はワーカーが使用可能になるとコードを実行します。詳細については、バックグラウンド ワーカーを参照してください。 |
| 関数からの出力を現在のワークスペースで使用できます。 | 出力を現在のワークスペースにコピーするには、fetchOutputs を使用します。fetchOutputs を使用すると、MATLAB は関数が完了するまで待機します。 |
| 任意の関数またはオブジェクトを同期関数で使用できます。 | ほとんどの関数とオブジェクトを非同期関数で使用できます。
|
| 現在のワークスペースを同期関数でも使用できます。 | 現在のワークスペースにある変数のほとんどを非同期関数でも使用できます。 |
2 つの乱数行列の最大値を計算します。一方はバックグラウンドで作成され、もう一方はフォアグラウンドで作成されます。行列 A をバックグラウンドで作成しているときに、行列 B がフォアグラウンドで同時に計算されます。
メモ
通常、wait を使用する必要はありません。fetchOutputs は、MATLAB によるバックグラウンドでの関数の実行が完了するまで結果の収集を暗黙的に待機します。ここでは、結果の収集を待機することを明示的に示すために関数 wait を使用しています。
tic fA = parfeval(backgroundPool,@rand,1,10000); B = ones(10000); wait(fA) C = max(fetchOutputs(fA),B); toc
Elapsed time is 0.534475 seconds.
コードを実行すると、MATLAB は 3 つの計算を実行します。
バックグラウンドで
A = rand(10000)を計算します。parfevalを使用して、関数randをバックグラウンドで実行するようにスケジュールします。出力は1で、単一の入力は10000です。フォアグラウンドで futurefAを返します。バックグラウンドで関数
randを実行します。
フォアグラウンドで
B = ones(10000)を計算します。AとBを作成した後、フォアグラウンドでC = max(A,B)を計算します。waitを使用して、futurefAのバックグラウンドでの実行が完了するまで明示的に待機します。fetchOutputsを使用して、futurefAからrand(10000)を取得します。行列
fetchOutputs(fA)とBから最終結果Cを計算します。

バックグラウンド ワーカー
parfeval または parfevalOnAll を使用して関数を非同期的に実行する場合、MATLAB は関数をプールで実行します。
backgroundPool を使用してコードをバックグラウンドで実行する場合、MATLAB はそのコードをバックグラウンド プールを使用して実行します。
バックグラウンド プールには固定数のワーカーがあります。MATLAB は、それらのワーカーを使用して関数を実行します。各ワーカーで一度に実行できる関数は 1 つだけです。そのため、複数の関数をバックグラウンドで実行する場合、各関数の実行にワーカーが使用できるようになるまで待機する必要があります。
ワーカーの数を調べるには、backgroundPool の NumWorkers プロパティを使用します。
Parallel Computing Toolbox のライセンスがない場合、バックグラウンド プールのワーカーは
1個です。Parallel Computing Toolbox のライセンスがある場合、バックグラウンド プールに複数のワーカーがあります。バックグラウンド プールのワーカーの数は、使用しているマシンの物理コア数です。たとえば、4 コアのマシンの場合、バックグラウンド プールのワーカーの数は
4個です。backgroundPoolを初めて使用する前にmaxNumCompThreadsを使用してこの値を減らすことができます。
参考
トピック
- バックグラウンドでの関数の実行中におけるウェイト バーの更新
- スレッドベースの環境での MATLAB 関数の実行
- 移植可能な並列コードの作成 (Parallel Computing Toolbox)