万博1manbetx®万博1manbetx支持使用局部解算器或涉及仿真工具的组件之间的协同仿真。例如,协同仿真可能涉及一个S函数,该函数被实现为Simulink与第三方工具或自定义代码之间的协同仿真网关。它还可能涉及导入Simulink的联合仿真模式下的FMU。万博1manbetx
为了提高性能,考虑在多个线程上运行包含共同仿真块(组件)的模型,如果:
您正在集成多个协同仿真组件
组件级的集成在计算上非常密集
本主题假设您熟悉多线程编程和概念。
万博1manbetxSimulink允许您在多个线程上运行C MEX S函数和联合仿真FMU块,前提是它们满足以下要求:
该块为非直接馈通。
该块是线程安全的,也就是说,该块可以与访问共享数据、资源和对象的多个线程一起工作,而不会产生任何冲突。
面向对象的多线程协同仿真二级MATLAB S函数不支持块。万博1manbetx
默认情况下,Simuli万博1manbetxnk将所有模型配置为在多个线程上运行。但是,并非所有模型都具有可以在多个线程上运行的协同仿真组件,并且并非所有模型都能从在多个线程上运行中获益。要查看模型是否具有可以从多线程上运行中获益的协同仿真组件,请执行以下步骤:
打开你的模型。
启动Performance Advisor工具(位于调试选项卡,单击绩效顾问).
选择模拟>需要模拟才能运行的检查>选择打开或关闭多线程协同模拟设置.
此检查验证是否已对模型或块进行优化配置,以利用多线程或单线程处理。如果配置不是最优的,Performance Advisor将显示当前设置,并警告您该模型不是在多线程上运行的最佳候选模型。
运行所选的检查。
或者,可以在更改模型之前和之后手动测量模型的模拟多线程
参数。例如:
抽搐;模拟(“S功能组件”);toc
运行时间为2.323264秒。
获取参数(gcs,“多线程系统”)
ans=‘开’
设置参数(地面军事系统,“多线程系统”,“关”)
抽搐;模拟(“S功能组件”);toc
运行时间为4.112674秒。
有关在多个核心上运行协同仿真组件的示例,请参见slexCoSimPrimeExample
模型
多线程
参数您可以使用指定在多个线程上运行整个模型,或指定特定块在多个线程上运行多线程
参数如果模型中的所有联合仿真块都是非直接馈通和线程安全的,则指定整个模型在多个线程上运行。如果某些块(而不是所有块)是非直接馈通和线程安全的,则只标识要在多个线程上运行的那些块。模型和块使用多线程
参数如下所示。
背景 | 模型 | 块 | 描述 |
---|---|---|---|
|
(默认)模型可以在多个线程上运行。 |
||
|
禁止块或模型在多个线程上运行。 |
||
|
(默认)让Simulink决万博1manbetx定块是否可以在多个线程上运行。 |
启用多线程
参数并不意味着块或模型在多个线程上进行模拟。当多线程
已启用,并且:
块和/或模型以单一速率运行。
块和/或模型是线程安全的。(例如,它们不使用静态或全局数据)。
块和/或模型为非直接馈通。
对于S功能块,使用ssSetInputPortDirectFeedThrough
作用
对于FMU块,请保留依赖关系
FMU的FMU模型描述文件中的属性模型结构/输出
和模型结构/初始未知
字段为空。此属性必须为空(" "
).
块和/或模型是无异常的。对于S功能块,使用ssSetOptions
要设置的函数SS\U选项\U例外\U自由\U代码
.
多线程不允许解算器重置检查,因此跳过对SSSETSOLVERNEDSRESET
和ssBlockStateForSolverChangedAtMajorStep
功能。相反,在加速器模式下,如果使用这些函数或存在连续状态,则多线程将自动关闭。
S函数块是单线程运行还是多线程运行取决于多线程
参数值和ssSetRuntimeThreadSafetyCompliance
作用
多线程 背景 |
ssSetRuntimeThreadSafetyCompliance 背景 |
单线程或多线程 |
---|---|---|
“自动” |
运行时\线程\安全性\合规性\未知 |
单线 |
“自动” |
运行时\线程\安全性\合规性\正确 |
多线程 |
“自动” |
运行时\线程\安全性\合规性\错误 |
单线 |
“关” |
— | 忽略该设置,S功能块运行单线程 |
对于加速器和快速加速器模式,模拟在单个线程上运行。
没有为协同仿真组件生成代码。
当块具有这些设置时,它不支持协同模拟:万博1manbetx
必须有一个单一的价格-ssSetSampleTime(模拟构造*S、内部索引、时间段)
必须调用以仅注册一个离散速率。
必须有固定的采样时间时间ssSetSampleTime(模拟结构*S、内部时间索引、时间段)
,时期
不可能可变采样时间
.
不能有连续状态-在ssSetNumContStates(模拟结构*S,内部)
,N
必须是0
.
必须没有直接馈通端口-输入ssSetInputPortDirectFeedThrough(SimStruct*S、int\u T port、int\u T dirFeed)
,弄脏
必须是0
对于每个输入端口。
必须是线程安全的ssSetRuntimeThreadSafetyCompliance(SimStruct*S,int\u T val)
,瓦尔
必须是运行时\线程\安全性\合规性\正确
.
必须是无异常的ssSetOptions(模拟结构*S、单元选项)
,选择权
必须包括SS\U选项\U例外\U自由\U代码
.
必须处于协同仿真模式。
必须是线程安全的,即多个FMU不能同时访问同一文件。
必须禁用调试日志记录-例如,设置参数(块1、'FMUDebugLogging'、'on')
调试日志重定向设置为文件-例如,set_param(block1、'FMUDebugLoggingRedirect'、'File')
无法公开任何IRT端口以进行计划。
不能位于每个子系统的内部。
必须处于加速器模式。
必须有单一费率。
无法使用采样时间可变的块。
不能有连续状态。
任何输入端口上都不能有直接馈通。
必须具有固定步长解算器。
无法访问任何全局数据存储。
无法使用任何Simulink函万博1manbetx数或调用程序块。
禁不住到/从文件阻碍。
FMU|系统函数|ssGetRuntimeThreadSafetyCompliance
|ssSetRuntimeThreadSafetyCompliance