金宝app®金宝app支持使用局部求解器或涉及仿真工具的组件之间的协同仿真。例如,协同仿真可能涉及一个S-function,它被实现为Simulink与第三方工具或自定义代码之间的协同仿真网关。金宝app它也可以涉及一个FMU在协仿真模式下导入到Simulink。金宝app
为了提高性能,考虑在多个线程上运行包含联合模拟块(组件)的模型,如果:
您正在集成多个联合模拟组件
组件级的集成是计算密集型的
本主题假设您熟悉多线程编程和概念。
金宝appSimulink允许您在多个线程上运行C MEX S-functions和Co-Simulation FMU块,如果它们满足以下要求:
块是非直接馈通的。
该块是线程安全的,也就是说,该块可以与访问共享数据、资源和对象的多个线程一起工作,而不会产生任何冲突。
多线程的联合仿真2级MATLAB函数不支持块。金宝app
默认情况下,Simuli金宝appnk将所有模型配置为在多个线程上运行。然而,并不是所有的模型都有可以在多个线程上运行的联合模拟组件,也不是所有的模型都能从在多个线程上运行中受益。要查看一个模型是否有可以在多个线程上运行的联合模拟组件,请执行以下步骤:
打开你的模型。
启动Performance Advisor工具(在调试选项卡上,单击性能顾问)。
选择模拟>需要模拟运行的检查>选择多线程协同仿真设置开启或关闭.
此检查验证模型或块被优化配置为利用多线程或单线程处理。如果配置不是最优的,Performance Advisor将显示当前设置,并警告您该模型不适合在多个线程上运行。
运行所选的检查。
或者,您可以在更改之前和之后手动测量模型的模拟MultiThreadCoSim
参数。例如:
抽搐;sim卡(“sfunction_components”);toc
运行时间是2.323264秒。
get_param (gcs,“MultiThreadCoSim”)
ans = '在'
set_param (gcs,“MultiThreadCoSim”,“关闭”)
抽搐;sim卡(“sfunction_components”);toc
运行时间为4.112674秒。
有关在多核上运行联合仿真组件的示例,请参见slexCoSimPrimeExample
模型。
MultiThreadCoSim
参数可以指定整个模型运行在多个线程上,也可以指定特定块运行在多个线程上,使用MultiThreadCoSim
参数。如果模型中的所有联合模拟块都是非直接的、线程安全的,则指定整个模型运行在多个线程上。如果有些(但不是所有)块是非直接传递的,并且是线程安全的,那么就只识别那些要在多个线程上运行的块。模型和块使用MultiThreadCoSim
参数如下。
设置 | 模型 | 块 | 描述 |
---|---|---|---|
|
(默认)模型可以在多个线程上运行。 |
||
|
禁用在多个线程上运行的块或模型。 |
||
|
(默认)让Simulink决金宝app定这个块是否可以在多个线程上运行。 |
使MultiThreadCoSim
参数并不意味着该块或模型在多个线程上进行模拟。多个线程上的模拟发生在MultiThreadCoSim
已启用并:
块和/或模型以单一速率运行。
块和/或模型是线程安全的。(例如,它们不使用静态或全局数据)。
块和/或模型是非直接馈通的。
对于s功能块,请使用ssSetInputPortDirectFeedThrough
函数。
对于FMU块,离开依赖关系
FMU的模型描述文件中的属性ModelStructure /输出
和ModelStructure / InitialUnknowns
字段为空。这个属性必须是(" "
)。
块和/或模型是无异常的。对于s功能块,请使用ssSetOptions
函数设置SS_OPTION_EXCEPTION_FREE_CODE
.
多线程不允许解决程序重置检查,因此跳过任何使用ssSetSolverNeedsReset
和ssBlockStateForSolverChangedAtMajorStep
功能。相反,在加速器模式下,如果使用这些函数或存在连续状态,多线程将自动关闭。
函数块是单独运行还是多线程运行取决于MultiThreadCoSim
参数值和ssSetRuntimeThreadSafetyCompliance
函数。
MultiThreadCoSim 设置 |
ssSetRuntimeThreadSafetyCompliance 设置 |
单个或多流 |
---|---|---|
“汽车” |
RUNTIME_THREAD_SAFETY_COMPLIANCE_UNKNOWN |
单线程 |
“汽车” |
RUNTIME_THREAD_SAFETY_COMPLIANCE_TRUE |
多流 |
“汽车” |
RUNTIME_THREAD_SAFETY_COMPLIANCE_FALSE |
单线程 |
“关闭” |
- - - - - - | 该设置被忽略,S-function块以单线程方式运行 |
模拟运行在单线程加速器和快速加速器模式。
没有用于协同仿真组件的代码生成。
当块有这些设置时,它不支持协同仿真:金宝app
必须有一个单一的汇率ssSetSampleTime(SimStruct *S, int_T st_index, time_T period)
必须被调用才能注册一个离散率。
必须有一个固定的采样时间(SimStruct *S, int_T st_index, time_T period)
,期
不能VARIABLE_SAMPLE_TIME
.
不能有连续的- In状态ssSetNumContStates(SimStruct *S, int_T n)
,n
必须0
.
必须没有直接的馈入端口吗ssSetInputPortDirectFeedThrough(SimStruct *S, int_T port, int_T dirFeed)
,dirFeed
必须0
对于每个输入端口。
必须是线程安全的-在ssSetRuntimeThreadSafetyCompliance(SimStruct *S, int_T val)
,瓦尔
必须RUNTIME_THREAD_SAFETY_COMPLIANCE_TRUE
.
必须是例外-在ssSetOptions(SimStruct *S, uint_T options)
,选项
必须包括SS_OPTION_EXCEPTION_FREE_CODE
.
必须处于协同模拟模式。
必须是线程安全的,也就是说,多个fmu不能同时访问同一个文件。
必须禁用调试日志—例如,set_param (block1“FMUDebugLogging”,“上”)
调试日志重定向被设置为文件-例如,set_param (block1“FMUDebugLoggingRedirect”,“文件”)
不能为调度公开任何IRT端口。
不能在for-each子系统中。
必须处于加速模式。
必须有单一费率。
不能使用采样时间可变的块。
不可能有连续的状态。
不能直接通过任何输入端口。
必须有一个固定的步骤解决方案。
无法访问任何全局数据存储。
不能使用任何Simulink函金宝app数或调用程序块。
不能包含从文件/块。
FMU|功能|ssGetRuntimeThreadSafetyCompliance
|ssSetRuntimeThreadSafetyCompliance