メインコンテンツ

パフォーマンスの比較

シミュレーションの実行時間がコード生成に必要な時間を超える場合、ノーマル モードに比べて、アクセラレータおよびラピッド アクセラレータのシミュレーション モードの方が速度が向上します。一般に、アクセラレータ モードおよびラピッド アクセラレータ モードでは、シミュレーションの実行時間が数分以上のときにノーマル モードよりもパフォーマンスが高くなります。ただし、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"「すべてのターゲットが無効」というラベル) で示されたコード生成にかかる時間より大幅に短くなります。さまざまな設計のトレードオフをテストするときには、この特性を利用できます。

たとえば、アクセラレータ モード ターゲットを一度生成し、それを使用して一連のゲイン設定でモデルをシミュレーションできます。この種の変更はターゲット コードの再生成を引き起こさないため、この方法はアクセラレータ モードまたはラピッド アクセラレータ モードに特に効果的です。モデルの初回実行時にターゲット コードが生成され、以降の実行ではソフトウェアでターゲットが最新かどうかを確認するのに必要な時間しかかかりません。このプロセスはコードの実行より速いので、以降の実行は初回の実行より大幅に高速化されることがあります。

ターゲットのチェックはコードの生成より速いため、コードを生成しなければならない場合よりもターゲットが最新の場合に、交差ポイントが小さくなります。モデルの以降の実行では、終了時間が小さい場合でも、ノーマル モードに比べてアクセラレータ モードまたはラピッド アクセラレータ モードの方がシミュレーションが速くなる可能性があります。

シミュレーション モードのパフォーマンスの解析

この例では、sldemo_fuelsys モデルについて、3 つのシミュレーションを実行してノーマル モードとラピッド アクセラレータ モードのシミュレーションのパフォーマンスを比較します。

  • 1 回目のシミュレーションではノーマル モードを使用します。

  • 2 回目のシミュレーションではラピッド アクセラレータ モードを使用し、ラピッド アクセラレータ ターゲットをビルドします。

  • 3 回目のシミュレーションではラピッド アクセラレータ モードを使用し、ラピッド アクセラレータ ターゲットはビルドしません。

各シミュレーションのパフォーマンスを解析するために、シミュレーション メタデータで返されるタイミング情報を検証します。シミュレーション メタデータは Simulink.SimulationOutput オブジェクトの SimulationMetadata プロパティで Simulink.SimulationMetadata オブジェクトとして返されます。Simulink.SimulationMetadata オブジェクトの TimingInfo プロパティで、合計シミュレーション時間とシミュレーションの段階ごとの所要時間の内訳が提供されます。

モデルを開きます。

mdl = "sldemo_fuelsys";

ベースラインのノーマル モード シミュレーションを構成するために、Simulink.SimulationInput オブジェクトを作成します。SimulationInput オブジェクトには、シミュレーションで使用するパラメーターの値が格納されます。オブジェクトのパラメーター値はシミュレーションに適用され、シミュレーションの終了時に元に戻されるため、モデルは変更されません。

simin = Simulink.SimulationInput(mdl);

終了時間は 10000 に設定します。シミュレーション モードを Normal に設定します。

simin = setModelParameter(simin,"StopTime","10000");
simin = setModelParameter(simin,"SimulationMode","normal");

ベースラインのタイミング情報を取得するために、モデルのシミュレーションを実行します。

simOut = sim(simin);

シミュレーションの結果が単一の Simulink.SimulationOutput オブジェクトとして返されます。SimulationMetadata プロパティに、Simulink.SimulationMetadata オブジェクトとして格納されたシミュレーション メタデータが含まれています。

ドット表記を使用して、TimingInfo プロパティの内容を normalMode という名前の変数に格納します。

normalMode = simOut.SimulationMetadata.TimingInfo;

タイミング情報から、シミュレーションの初期化時間、実行時間、および合計経過時間を抽出します。

normalInit = normalMode.InitializationElapsedWallTime;
normalExec = normalMode.ExecutionElapsedWallTime;
normalTotal = normalMode.TotalElapsedWallTime;

ラピッド アクセラレータ モードを使用してモデルを再度シミュレートします。モデルをラピッド アクセラレータ モードで初めてシミュレートするときは、初期化フェーズでラピッド アクセラレータ ターゲットがビルドされます。

simin = setModelParameter(simin,"SimulationMode","rapid");
simOut = sim(simin);
### Searching for referenced models in model 'sldemo_fuelsys'.
### Total of 1 models to build.
### Building the rapid accelerator target for model: sldemo_fuelsys
### Successfully built the rapid accelerator target for model: sldemo_fuelsys

1 回目のラピッド アクセラレータ シミュレーションのタイミング情報を取得します。その後、シミュレーションの初期化時間、実行時間、および合計経過時間を抽出します。

rapidAccel = simOut.SimulationMetadata.TimingInfo;
rapidBuildInit = rapidAccel.InitializationElapsedWallTime;
rapidBuildExec = rapidAccel.ExecutionElapsedWallTime;
rapidBuildTotal = rapidAccel.TotalElapsedWallTime;

ラピッド アクセラレータ ターゲットをシミュレーションでビルドしない場合のラピッド アクセラレータ モードの利点を確認するために、もう一度シミュレーションを実行します。

simOut = sim(simin);
### Searching for referenced models in model 'sldemo_fuelsys'.
### Total of 1 models to build.

ターゲットをビルドせずに実行したラピッド アクセラレータ シミュレーションのタイミング情報を取得します。その後、シミュレーションの初期化時間、実行時間、および合計経過時間を抽出します。

rapidAccelNoRebuild = simOut.SimulationMetadata.TimingInfo;
rapidInit = rapidAccelNoRebuild.InitializationElapsedWallTime;
rapidExec = rapidAccelNoRebuild.ExecutionElapsedWallTime;
rapidTotal = rapidAccelNoRebuild.TotalElapsedWallTime;

各シミュレーションのタイミングを比較する table を作成します。

Normal = [normalInit;normalExec;normalTotal];
RapidBuild = [rapidBuildInit;rapidBuildExec;rapidBuildTotal];
RapidNoBuild = [rapidInit;rapidExec;rapidTotal];

names = ["Initialization Time";
    "Execution Time";
    "Total Simulation Time"];

timingTable = table(Normal,RapidBuild,RapidNoBuild,RowNames=names);

初回のラピッド アクセラレータ シミュレーションでは、初期化フェーズでラピッド アクセラレータ ターゲットがビルドされるため、初期化時間が長くなっています。このモデルおよびシミュレーション期間では、ラピッド アクセラレータ モードを使用することで実行時間が大幅に短縮され、初回のラピッド アクセラレータ シミュレーションでもノーマル モードを使用する場合に比べて速くなっています。

timingTable
timingTable=3×3 table
                             Normal    RapidBuild    RapidNoBuild
                             ______    __________    ____________

    Initialization Time      9.1109      24.371         2.1894   
    Execution Time           121.25      52.275         40.829   
    Total Simulation Time     130.4      76.751         43.115   

参考

|

トピック