For Each Subsystem を使用したマルチスレッド シミュレーション
この例では、For Each Subsystem を使用して複数のコアでのモデルの実行を高速化する方法を示します。マルチスレッド実行の効果を確認するために、この例ではラピッド アクセラレータ モードのシミュレーション パフォーマンスをシングルスレッド実行とマルチスレッド実行で比較します。
このモデルでは、For Each subsystem は数値配列入力を受け入れます。配列の各要素は各反復の上限として機能し、サブシステム内のMATLAB Functionブロックで表される計算量の多いアルゴリズムに送られます。MATLAB Function ブロックに実装されたアルゴリズムは、(わかりやすく説明することのみを目的とした) 総当たり法を使用して、与えられた範囲内の最大素数を計算します。
モデルを開きます。
mdl = 'slexForEachMultithreaded';
open_system(mdl);

シングルスレッド シミュレーションの時間の測定
次のコードは、slexForEachMultithreaded モデルのシミュレーションのタイミング情報を取得する方法を示しています。ベースラインのシミュレーションを構成するために、Simulink.SimulationInput オブジェクトを作成します。SimulationInput オブジェクトには、シミュレーションで使用するパラメーターの値が格納されます。
simIn = Simulink.SimulationInput(mdl);
既定では、For Each subsystem に対するマルチスレッド シミュレーションのサポートは有効です。マルチスレッド シミュレーションの選択を解除するには、setModelParameter を使用して MultithreadedSim パラメーターを設定します。シングルスレッド シミュレーションでは、For Each subsystem の異なる反復での計算が各タイム ステップ中に順番に実行されます。MultithreadedSim パラメーターの詳細については、MultithreadedSim パラメーターの使用を参照してください。
simIn = setModelParameter(simIn, MultithreadedSim='off');
シングルスレッドのタイミング情報を取得するために、モデルをシミュレートして合計実行時間を取得します。
simOut = sim(simIn); singleThreadTimingInfo = simOut.SimulationMetadata.TimingInfo; singleThreadExec = singleThreadTimingInfo.ExecutionElapsedWallTime;
### Searching for referenced models in model 'slexForEachMultithreaded'. ### Total of 1 models to build. ### Building the rapid accelerator target for model: slexForEachMultithreaded ### Successfully built the rapid accelerator target for model: slexForEachMultithreaded
マルチスレッド シミュレーションの時間の測定
マルチスレッドのサポートを明示的に選択するには、setModelParameter を使用します。マルチスレッド シミュレーションでは、For Each Subsystem の異なる反復での計算が複数のコアに割り当てられます。シミュレーションの高速化のために、それらの計算がシステムで並列に実行されます。
simIn = setModelParameter(simIn, MultithreadedSim='auto');
マルチスレッドのタイミング情報を取得するために、モデルをシミュレートして合計実行時間を取得します。
simOut = sim(simIn); multithreadTimingInfo = simOut.SimulationMetadata.TimingInfo; multithreadExec = multithreadTimingInfo.ExecutionElapsedWallTime;
### Searching for referenced models in model 'slexForEachMultithreaded'. ### Total of 1 models to build. ### Building the rapid accelerator target for model: slexForEachMultithreaded ### Successfully built the rapid accelerator target for model: slexForEachMultithreaded
シミュレーション パフォーマンスの計算
パフォーマンスがどれくらい向上するかを計算するために、実行時間をシングルスレッド シミュレーションの実行時間で除算します。シミュレーション時間のパフォーマンスはハードウェアによって異なることがあります。
各シミュレーションのタイミングを比較する table を作成します。
ExecutionTime = [singleThreadExec; multithreadExec];
SimulationPerformance = [singleThreadExec/singleThreadExec;
multithreadExec/singleThreadExec];
simNames = ["Single-Threaded"; "Multithreaded"];
timingTable = table(ExecutionTime, SimulationPerformance, RowNames=simNames);
timingTable
timingTable =
2×2 table
ExecutionTime SimulationPerformance
_____________ _____________________
Single-Threaded 67.646 1
Multithreaded 44.339 0.65546
モデルのシミュレーションは、4 個以上のコアが搭載されたマシンでシングルスレッド シミュレーションの 2 倍以上の速度で実行されます。マルチスレッド シミュレーションでのオペレーティング システムのコンテキストスイッチングにより、常に余分なオーバーヘッドが発生する点に留意してください。
参考
For Each Subsystem | For Each | Simulink.SimulationMetadata