在多核上运行联合仿真组件
金宝app®金宝app支持使用本地解算器或涉及仿真工具的组件之间的联合仿真。例如,联合仿真可以包含一个s函数,作为Simulink和第三方工具或自定义代码之间的联合仿真网关实现。金宝app它还可以包括一个导入到Simulink的联合仿真模式的FMU或金宝app模型在加速模式下阻塞。
为了提高性能,考虑在多线程上运行包含联合仿真块(组件)的模型,如果:
您正在集成多个联合仿真组件
组件级的集成在计算上是非常密集的
本主题假设您熟悉多线程编程和概念。
金宝appSimulink允许您运行C MEX s -函数、Co-Simulation FMU块和模型在多线程上配置为加速模式的块(如果它们是线程安全的)。线程安全意味着该块可以与访问共享数据、资源和对象的多个线程一起工作,而不会产生任何冲突。
您还可以在多个线程上运行一个模型,如果该模型有一个非直接馈通块,后面跟着一个直接馈通块(参见单线程与多线程模拟).直接馈通是指一个块的输出端口信号是根据其输入端口信号的值在同一时间步长计算出来的。
请注意
多线程联合仿真二级MATLAB s函数不支持Blocks。金宝app
默认情况下,Simuli金宝appnk将所有模型配置为在多线程上运行。如果性能可以提高,Simulink会自动在多个线程上运行所有模型金宝app。然而,并不是所有模型都具有可以在多线程上运行的联合仿真组件,也不是所有模型都可以从多线程上运行中获益。
单线程与多线程模拟
在评估系统中用于多线程执行的可能并发的模型时,Simulink使用基于图的算法来分析符合条件的块之间的数据依赖关系并形成多个任务组。金宝app该算法确保了不同的任务组:
彼此之间没有数据依赖
可以使用多核并行执行吗
例如,Simulink可能金宝app会寻找非直接馈通块,然后是直接馈通块。如果下面的直接馈通块只依赖于一个非直接馈通块,软件可以将这些块分组在同一个分支中进行并行执行。
这个例子比较了为并行执行而分区的一系列块的串行执行。
使用多线程仿真加速多核仿真
考虑到基于图的多线程仿真
示例,它使用四个非直接馈通块,然后是四个直接馈通块。直接馈通是指一个块的输出端口信号是根据其输入端口信号的值在同一时间步长计算出来的。
金宝appSimulink分析数据依赖关系并形成四个分支。每个分支包含非直接馈通块,然后是直接馈通块。然后,Sim金宝appulink使用多线程来运行这四个分支。通过这种方式,与在同一机器金宝app上单线程仿真相比,Simulink可以在四核或更多核的机器上将仿真速度提高四倍。属性之前和更改之后,可以手动测量模型的仿真MultithreadedSim
参数。
这段代码展示了如何测量模拟基于图的多线程仿真
例子:
openExample (“slexGraphBasedMultiThreadSimExample”);...set_param (gcs,“MultithreadedSim”,“关闭”);抽搐;sim卡(“slexGraphBasedMultiThreadSimExample”); toc
运行时间为39.406743秒。
set_param (gcs,“MultithreadedSim”,“上”);抽搐;sim卡(“slexGraphBasedMultiThreadSimExample”);toc
运行时间为13.619744秒。
在本例中,在四核机器上,加速几乎是三倍(而不是四倍)。这是由于操作系统线程上下文切换带来的额外开销。
使用MultithreadedSim
参数
属性可以指定整个模型在多个线程上运行,或指定特定块在多个线程上运行MultithreadedSim
参数。如果模型中的所有联合模拟块都是线程安全的,则指定整个模型在多个线程上运行。如果有些块(而不是所有块)是线程安全的,则只标识要在多线程上运行的那些块。模型和块使用MultithreadedSim
参数如下:
设置 | 描述 |
---|---|
|
(默认值)让Simulink金宝app决定块是否可以在多个线程上运行。 |
|
禁止块或模型在多线程上运行。 |
一个从R2021a开始,当您打开在以前版本中创建的模型时,Simulink将解释金宝app |
使MultithreadedSim
参数并不意味着块或模型在多个线程上模拟。发生在多线程上的模拟时MultithreadedSim
启用,并且:
块和/或模型以单一速率运行。
块和/或模型是线程安全的。(例如,它们不使用静态或全局数据)。
块和/或模型是无异常的。对于s函数块,使用
ssSetOptions
设置函数SS_OPTION_EXCEPTION_FREE_CODE
.
多线程不允许解算器重置检查,因此跳过任何使用ssSetSolverNeedsReset
而且ssBlockStateForSolverChangedAtMajorStep
功能。相反,在加速模式下,如果使用了这些函数或存在连续状态,多线程将自动关闭。
配置S-Function块运行单线程或多线程
S-function块是单线程运行还是多线程运行取决于MultithreadedSim
参数值和ssSetRuntimeThreadSafetyCompliance
函数。
MultithreadedSim 设置 |
ssSetRuntimeThreadSafetyCompliance 设置 |
单线程或多线程 |
---|---|---|
“汽车” |
RUNTIME_THREAD_SAFETY_COMPLIANCE_UNKNOWN |
单线程 |
“汽车” |
RUNTIME_THREAD_SAFETY_COMPLIANCE_TRUE |
多流 |
“汽车” |
RUNTIME_THREAD_SAFETY_COMPLIANCE_FALSE |
单线程 |
“关闭” |
- - - - - - | 该设置将被忽略,s函数块将单线程运行 |
多线程联合仿真的局限性和指导原则
模拟运行在加速器和快速加速器模式的单个线程上。当仿真模式正常时,开启多线程功能。
将模型仿真模式设置为普通模式。
协同仿真组件没有代码生成。
对于具有固定采样时间的块,多线程不被激活。
在打开Simulink调试器时,不会启用多线程。金宝app
关闭Simulin金宝appk调试器。
依赖于非线程安全块的块不能是多线程的。考虑打破依赖关系,例如,通过使用单位延迟块。
s功能块限制
必须有一个单一的速率。
考虑修改您的模型,将多速率组件分解为单个的单速率组件。
当s函数具有可变采样时间时,多线程不启用。
考虑使用不同的采样时间(参见指定采样时间).
当s -函数具有连续状态且求解器是固定步长时,多线程不启用,这两者一起触发连续状态一致性检查。若要禁用连续状态一致性检查,请使用
ssSetSkipContStatesConsistencyCheck
函数。必须是线程安全的- In
ssSetRuntimeThreadSafetyCompliance(SimStruct *S,int_T val)
,瓦尔
必须RUNTIME_THREAD_SAFETY_COMPLIANCE_TRUE
.有关更多信息,请参见编写线程安全的s函数指南.
必须无异常- In
ssSetOptions(SimStruct *S,uint_T选项)
,选项
必须包括SS_OPTION_EXCEPTION_FREE_CODE
.有关更多信息,请参见编写线程安全的s函数指南.
当S-function Analyzer打开时,多线程不启用。在普通模式下尝试多线程。
当s函数有连续采样时间时,不启用多线程。考虑使用不同的采样时间(参见指定采样时间).
多线程并行运行输出和更新方法。该块必须有一个输出或更新方法。
FMU导入块限制
必须处于联合仿真模式。
考虑将FMU模式从模型交换转换为联合仿真。
必须是线程安全的,例如,多个fmu不能同时访问同一个文件。
当MATLAB中显示FMU块日志时,多线程未启用®命令窗口。将FMU块日志重定向到一个文件,使用:
set_param (blockName“FMUDebugLoggingRedirect”,“文件”)
当FMU运行在进程外时,不支持多线程。金宝app要禁用此设置,请使用:
set_param (blockName“DebugExecutionForFMUViaOutOfProcess”,“关闭”)
模型块限制
时不启用多线程模型块具有事件端口。
不能在每个子系统块。
考虑搬家模型屏蔽掉每个子系统块。
一定是在加速模式。
必须有单费率。
考虑修改您的模型,将多速率组件分解为单个的单速率组件。
不能使用具有可变采样时间的块。
考虑使用不同的采样时间(参见指定采样时间).
不能有连续的状态。
考虑打破块之间的依赖关系,例如,通过使用单位延迟块。
必须有一个固定步骤求解器。
无法访问任何全局数据存储。
类型时,不启用多线程金宝app仿真软件的功能块。
不能使用任何Simulink函金宝app数或调用方块。
不能包含到文件块。有关更多信息,请参见导出仿真数据.
不能包含从文件块。
考虑通过顶层模型的导入将数据提供给引用模型。
另请参阅
FMU|功能|ssSetRuntimeThreadSafetyCompliance
|ssGetRuntimeThreadSafetyCompliance