Main Content

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

For Each Subsystem を使用したマルチスレッド シミュレーション

この例では、ラピッド アクセラレータ シミュレーション モードで For Each Subsystem を使用して複数のコアでのモデルの実行を高速化する方法を示します。

シングルスレッド シミュレーションの時間の測定

このモデルでは、For Each subsystem は数値配列入力を受け入れます。配列の各要素は各反復の上限として機能し、サブシステム内の MATLAB Function ブロックで表される計算量の多いアルゴリズムに送られます。MATLAB Function ブロックに実装されたアルゴリズムは、(わかりやすく説明することのみを目的とした) 総当たり法を使用して、与えられた範囲内の最大素数を計算します。

modelName = 'slexForEachMultithreaded';
open_system(modelName);

既定では、For Each subsystem に対するマルチスレッド シミュレーションのサポートは有効です。マルチスレッド シミュレーションの選択を解除するには、MATLAB® コマンド ウィンドウで set_param コマンドを実行します。シングルスレッド シミュレーションでは、For Each subsystem の異なる反復での計算が各タイム ステップ中に順番に実行されます。

set_param(modelName, 'MultithreadedSim', 'off');

ラピッド アクセラレータ モードで実行するとファイルが作成されるため、最初に一時ディレクトリを作成してそのディレクトリに移動します。

originalDir = pwd;
tempDir = tempname;
mkdir(tempDir);
cd(tempDir);

モデルのラピッド アクセラレータ ターゲットのビルドMATLAB コマンド ウィンドウには、コード生成とビルド プロセスの進行状況が表示されます。この表示を抑制するには、コマンドを evalc 内にラップします。

evalc('Simulink.BlockDiagram.buildRapidAcceleratorTarget(modelName)');

モデルを最初にシミュレートしたときに Simulink® でラピッド アクセラレータ シミュレーション ターゲットが自動的に生成されるため、このビルド ステップはオプションです。例では、このステップは実際のモデル実行時間から、ラピッド アクセラレータ ターゲットを生成する際のオーバーヘッドを分離する役割を果たします。

ラピッド アクセラレータ ターゲットが生成されたら、モデルをシミュレートし、tic および toc を使用してシミュレーション時間を測定します。

tic
evalc('sim(modelName)');
toc
Elapsed time is 48.178907 seconds.

複数のコアで高速化するためのマルチスレッド シミュレーションの使用

マルチスレッドのサポートを明示的に選択するには、MATLAB コマンド ウィンドウで set_param コマンドを実行します。マルチスレッド シミュレーションでは、高速化のため、For Each subsystem の異なる反復での計算が複数のコアに割り当てられて、並列に実行されます。

set_param(modelName, 'MultithreadedSim', 'auto');

モデルが再構成されているため、ラピッド アクセラレータ ターゲットをもう一度ビルドします。

evalc('Simulink.BlockDiagram.buildRapidAcceleratorTarget(modelName)');

モデルを再度シミュレートし、マルチスレッド シミュレーション時間を測定します。モデルのシミュレーションは、4 個以上のコアが搭載されたマシンでシングルスレッド シミュレーションの 2 倍以上の速度で実行されます。マルチスレッド シミュレーションでのオペレーティング システムのコンテキストスイッチングにより、常に余分なオーバーヘッドが発生する点に留意してください。

tic
evalc('sim(modelName)');
toc
Elapsed time is 18.290449 seconds.

クリーン アップ

モデルを閉じて、生成されたファイルを削除します。

bdclose(modelName);
cd(originalDir);
rmdir(tempDir, 's');
clear originalDir tempDir;

参考

|