比较性能
当仿真执行时间超出代码生成所需的时间时,与普通模式相比,加速和快速加速仿真模式可以提高速度。当仿真执行时间为几分钟或更长时,加速和快速加速模式的执行性能一般要高于普通模式。但是,包含大量 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
的三个仿真。有关该模型的详细信息,请参阅容错燃油控制系统建模。
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
对象形式返回结果,该对象包含所有记录的数据和仿真元数据。元数据存储为包含仿真信息的 Simulink.SimulationMetadata
对象,包括包含计时信息的结构体 TimingInfo
。
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;
创建一个表来比较每次仿真的时间。
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