パフォーマンスの比較
シミュレーションの実行時間がコード生成に必要な時間を超える場合、ノーマル モードに比べて、アクセラレータおよびラピッド アクセラレータのシミュレーション モードの方が速度が向上します。一般に、アクセラレータ モードおよびラピッド アクセラレータ モードでは、シミュレーションの実行時間が数分以上のときにノーマル モードよりもパフォーマンスが高くなります。ただし、Stateflow® または MATLAB Function ブロックの数が多いモデルでは、ノーマル モードに比べてわずかな速度向上しか見られないことがあります。これは、ノーマル モードでは、これらのブロックはコード生成を通してシミュレーションを実行するからです。
モデルに調整可能なパラメーターを含めた場合も、シミュレーション時間が長くなります。
次の図は、一般論として、仮想モデルにおけるノーマル モード、アクセラレータ モード、およびラピッド アクセラレータ モードのシミュレーションの相対的なパフォーマンスを示したものです。
ターゲットのリビルドが必要な場合のパフォーマンス
図の実線 ("all targets out of date"「すべてのターゲットが無効」というラベル) は、ターゲット コードをリビルドしなければならない場合のパフォーマンスを示しています。この仮想モデルの場合、時間スケールは数分ほどです。一方、より複雑なモデルでは、時間スケールがさらに長くなることがあります。
一般に、ノーマル モードでモデルをコンパイルするのに必要な時間は、アクセラレータ ターゲットまたはラピッド アクセラレータ実行可能ファイルをビルドする時間より短くなります。シミュレーションの終了時間が小さい場合、ノーマル モードの方がアクセラレータ モードまたはラピッド アクセラレータ モードに比べて全体のシミュレーションが速くなります。
アクセラレータ モードまたはラピッド アクセラレータ モードの方が全体のシミュレーションが速くなる交差ポイントは、モデルの複雑度と内容に依存します。たとえば、インタープリター型コードを使用するブロックが多数含まれているモデルでは、シミュレーションの終了時間が非常に大きい場合を除き、アクセラレータ モードでもノーマル モードの実行速度と大差がないことがあります。詳細については、アクセラレータ モード用のブロックの選択を参照してください。同様に、Stateflow チャートまたは MATLAB Function ブロックが多数含まれているモデルでは、シミュレーションの終了時間が大きい場合を除き、ノーマル モードと比べてさほど大きな速度の向上は見られない可能性があります。Stateflow または MATLAB Function ブロックを含むモデルのシミュレーションは、コード生成を通じて高速化できます。
この図では、多数の Stateflow チャートまたは MATLAB Function ブロックを含むモデルを表しています。"Normal"「ノーマル」というラベルの曲線は、モデルにこれらのブロックが含まれていなければ、初期経過時間がこれよりずっと小さくなります。
ターゲットが最新の場合のパフォーマンス
図の破線 ("all targets up to date"「すべてのターゲットが最新」というラベル) が示すように、アクセラレータ ターゲットまたはラピッド アクセラレータ実行可能ファイルが最新かどうかを判別する時間は、実線 ("all targets out of date"「すべてのターゲットが無効」というラベル) で示されたコード生成にかかる時間より大幅に短くなります。さまざまな設計のトレードオフをテストするときには、この特性を利用できます。
たとえば、アクセラレータ モード ターゲットを一度生成し、それを使用して一連のゲイン設定でモデルをシミュレーションできます。この種の変更はターゲット コードの再生成を引き起こさないため、この方法はアクセラレータ モードまたはラピッド アクセラレータ モードに特に効果的です。モデルの初回実行時にターゲット コードが生成され、以降の実行ではソフトウェアでターゲットが最新かどうかを確認するのに必要な時間しかかかりません。このプロセスはコードの実行より速いので、以降の実行は初回の実行より大幅に高速化されることがあります。
ターゲットのチェックはコードの生成より速いため、コードを生成しなければならない場合よりもターゲットが最新の場合に、交差ポイントが小さくなります。モデルの以降の実行では、終了時間が小さい場合でも、ノーマル モードに比べてアクセラレータ モードまたはラピッド アクセラレータ モードの方がシミュレーションが速くなる可能性があります。
シミュレーション モードのパフォーマンスの解析
モデルのシミュレーションにアクセラレータ モードまたはラピッド アクセラレータ モードを使用する効果を確認するために、同等のシミュレーションを異なるシミュレーション モードで実行できます。結果をシミュレーション メタデータを含む単一の Simulink.SimulationOutput
オブジェクトとして返す方法でモデルをシミュレートします。これにより、シミュレーションごとにシミュレーション メタデータで取得されるタイミング情報を検査し、各シミュレーション モードのパフォーマンスを解析できます。
この例では、Simulink.SimulationInput
オブジェクトを使用して、モデル sldemo_fuelsys
の 3 つのシミュレーションに使用するモデル パラメーター値を構成します。モデルの詳細については、フォールトトレラント燃料制御システムのモデル化を参照してください。
model = "sldemo_fuelsys";
ベースラインのシミュレーションを構成するために、Simulink.SimulationInput
オブジェクトを作成します。
simIn = Simulink.SimulationInput(model);
SimulationInput
オブジェクトには、シミュレーションで使用するパラメーターの値が格納されます。オブジェクトのパラメーター値はシミュレーションに適用され、シミュレーションの終了時に元に戻されるため、モデルは変更されません。
終了時間は 10000
に設定します。シミュレーション モードを Normal
に設定します。
simIn = setModelParameter(simIn,"StopTime","10000"); simIn = setModelParameter(simIn,"SimulationMode","normal");
ベースラインのタイミング情報を取得するために、モデルをシミュレートします。
simOut = sim(simIn);
このシミュレーションでは、結果がすべてのログ データおよびシミュレーション メタデータを含む単一の Simulink.SimulationOutput
オブジェクトとして返されます。メタデータは、タイミング情報を含む構造体 TimingInfo
など、シミュレーションに関する情報を含む Simulink.SimulationMetadata
オブジェクトとして格納されています。
normalMode = simOut.SimulationMetadata.TimingInfo;
タイミング情報から、シミュレーションの初期化時間、実行時間、および合計経過時間を抽出します。
normalInit = normalMode.InitializationElapsedWallTime; normalExec = normalMode.ExecutionElapsedWallTime; normalTotal = normalMode.TotalElapsedWallTime;
ラピッド アクセラレータ モードを使用してモデルを再度シミュレートします。モデルをラピッド アクセラレータ モードで初めてシミュレートするときは、初期化フェーズでラピッド アクセラレータ ターゲットがビルドされます。
simIn = setModelParameter(simIn,"SimulationMode","rapid"); simOut = sim(simIn);
### Building the rapid accelerator target for model: sldemo_fuelsys ### Successfully built the rapid accelerator target for model: sldemo_fuelsys Build Summary Top model rapid accelerator targets built: Model Action Rebuild Reason ================================================================================================ sldemo_fuelsys Code generated and compiled. Code generation information file does not exist. 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 38.279s
初回のラピッド アクセラレータ シミュレーションのタイミング情報にアクセスします。その後、シミュレーションの初期化時間、実行時間、および合計経過時間を抽出します。
rapidAccel = simOut.SimulationMetadata.TimingInfo; rapidBuildInit = rapidAccel.InitializationElapsedWallTime; rapidBuildExec = rapidAccel.ExecutionElapsedWallTime; rapidBuildTotal = rapidAccel.TotalElapsedWallTime;
ラピッド アクセラレータ ターゲットをシミュレーションでビルドしない場合のラピッド アクセラレータ モードの利点を確認するために、もう一度シミュレーションを実行します。
simOut = sim(simIn);
Build Summary 0 of 1 models built (1 models already up to date) Build duration: 0h 0m 2.684s
ターゲットをビルドせずに実行したラピッド アクセラレータ シミュレーションのタイミング情報にアクセスします。その後、シミュレーションの初期化時間、実行時間、および合計経過時間を抽出します。
rapidAccelNoRebuild = simOut.SimulationMetadata.TimingInfo; rapidInit = rapidAccelNoRebuild.InitializationElapsedWallTime; rapidExec = rapidAccelNoRebuild.ExecutionElapsedWallTime; rapidTotal = rapidAccelNoRebuild.TotalElapsedWallTime;
各シミュレーションのタイミングを比較する table を作成します。
InitializationTime = [normalInit;rapidBuildInit;rapidInit]; ExecutionTime = [normalExec;rapidBuildExec;rapidExec]; TotalSimulationTime = [normalTotal;rapidBuildTotal;rapidTotal]; simNames = ["Normal Mode";"Rapid Accelerator";"Rapid Accelerator No Rebuild"]; timingTable = table(TotalSimulationTime,InitializationTime, ... ExecutionTime,RowNames=simNames);
初回のラピッド アクセラレータ シミュレーションでは、初期化フェーズでラピッド アクセラレータ ターゲットがビルドされるため、初期化時間が長くなっています。このモデルおよびシミュレーション期間では、ラピッド アクセラレータ モードを使用することで実行時間が大幅に短縮され、初回のラピッド アクセラレータ シミュレーションでもノーマル モードを使用する場合に比べて速くなっています。
timingTable
timingTable=3×3 table
TotalSimulationTime InitializationTime ExecutionTime
___________________ __________________ _____________
Normal Mode 108.91 12.411 96.437
Rapid Accelerator 68.44 40.962 26.152
Rapid Accelerator No Rebuild 17.403 3.387 13.886
参考
Simulink.SimulationInput
| Simulink.SimulationOutput