Main Content

非同期関数

MATLAB® では、コードは同期的または非同期的に実行されます。次の関数を使用すると、コードを非同期的に実行できます。

2 つの乱数行列の最大値を計算します。MATLAB は各行を連続して実行します。

tic
A = rand(10000);
B = ones(10000);
C = max(A,B);
toc
Elapsed time is 0.992156 seconds.

コードを実行すると、MATLAB は 3 つの計算を実行します。

  1. フォアグラウンドで A = rand(10000) を計算します。

  2. フォアグラウンドで B = ones(10000) を計算します。

  3. AB を作成した後、フォアグラウンドで C = max(A,B) を計算します。

非同期コード

関数を非同期的に実行する場合、MATLAB は他のコードをフォアグラウンドで同時に実行できます。

関数を非同期的に実行するには、parfeval または parfevalOnAll を使用します。前の関数が完了した後に関数を非同期的に実行するには、afterEachafterAll を使用します。

  • 関数を非同期的に実行すると、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 は関数が完了するまで待機します。
任意の関数またはオブジェクトを同期関数で使用できます。

ほとんどの関数とオブジェクトを非同期関数で使用できます。

  • スレッドをサポートする関数またはオブジェクトはバックグラウンドまたは ThreadPool で実行されます。詳細については、スレッドベースの環境での MATLAB 関数の実行を参照してください。

  • すべての関数およびオブジェクトがプロセスベースの並列プール (ProcessPool および ClusterPool) でサポートされます。詳細については、並列プールでのコードの実行 (Parallel Computing Toolbox)を参照してください。

現在のワークスペースを同期関数でも使用できます。現在のワークスペースにある変数のほとんどを非同期関数でも使用できます。

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 つの計算を実行します。

  1. バックグラウンドで A = rand(10000) を計算します。

    1. parfeval を使用して、関数 rand をバックグラウンドで実行するようにスケジュールします。出力は 1 で、単一の入力は 10000 です。フォアグラウンドで future fA を返します。

    2. バックグラウンドで関数 rand を実行します。

  2. フォアグラウンドで B = ones(10000) を計算します。

  3. AB を作成した後、フォアグラウンドで C = max(A,B) を計算します。

    1. wait を使用して、future fA のバックグラウンドでの実行が完了するまで明示的に待機します。

    2. fetchOutputs を使用して、future fA から rand(10000) を取得します。

    3. 行列 fetchOutputs(fA)B から最終結果 C を計算します。

バックグラウンド ワーカー

parfeval または parfevalOnAll を使用して関数を非同期的に実行する場合、MATLAB は関数をプールで実行します。

backgroundPool を使用してコードをバックグラウンドで実行する場合、MATLAB はそのコードをバックグラウンド プールを使用して実行します。

バックグラウンド プールには固定数のワーカーがあります。MATLAB は、それらのワーカーを使用して関数を実行します。各ワーカーで一度に実行できる関数は 1 つだけです。そのため、複数の関数をバックグラウンドで実行する場合、各関数の実行にワーカーが使用できるようになるまで待機する必要があります。

ワーカーの数を調べるには、backgroundPoolNumWorkers プロパティを使用します。

  • Parallel Computing Toolbox のライセンスがない場合、バックグラウンド プールのワーカーは 1 個です。

  • Parallel Computing Toolbox のライセンスがある場合、バックグラウンド プールに複数のワーカーがあります。バックグラウンド プールのワーカーの数は、使用しているマシンの物理コア数です。たとえば、4 コアのマシンの場合、バックグラウンド プールのワーカーの数は 4 個です。backgroundPool を初めて使用する前に maxNumCompThreads を使用してこの値を減らすことができます。

参考

|

関連する例

詳細