在多核上运行联合仿真组件

万博1manbetx®万博1manbetx支持使用局部解算器或涉及仿真工具的组件之间的协同仿真。例如,协同仿真可能涉及一个S函数,该函数被实现为Simulink与第三方工具或自定义代码之间的协同仿真网关。它还可能涉及导入Simulink的联合仿真模式下的FMU。万博1manbetx

为了提高性能,考虑在多个线程上运行包含共同仿真块(组件)的模型,如果:

  • 您正在集成多个协同仿真组件

  • 组件级的集成在计算上非常密集

本主题假设您熟悉多线程编程和概念。

万博1manbetxSimulink允许您在多个线程上运行C MEX S函数和联合仿真FMU块,前提是它们满足以下要求:

  • 该块为非直接馈通。

  • 该块是线程安全的,也就是说,该块可以与访问共享数据、资源和对象的多个线程一起工作,而不会产生任何冲突。

笔记

面向对象的多线程协同仿真二级MATLAB S函数不支持块。万博1manbetx

默认情况下,Simuli万博1manbetxnk将所有模型配置为在多个线程上运行。但是,并非所有模型都具有可以在多个线程上运行的协同仿真组件,并且并非所有模型都能从在多个线程上运行中获益。要查看模型是否具有可以从多线程上运行中获益的协同仿真组件,请执行以下步骤:

  1. 打开你的模型。

  2. 启动Performance Advisor工具(位于调试选项卡,单击绩效顾问).

  3. 选择模拟>需要模拟才能运行的检查>选择打开或关闭多线程协同模拟设置.

    此检查验证是否已对模型或块进行优化配置,以利用多线程或单线程处理。如果配置不是最优的,Performance Advisor将显示当前设置,并警告您该模型不是在多线程上运行的最佳候选模型。

  4. 运行所选的检查。

或者,可以在更改模型之前和之后手动测量模型的模拟多线程参数。例如:

抽搐;模拟(“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代码.

多线程不允许解算器重置检查,因此跳过对SSSETSOLVERNEDSRESETssBlockStateForSolverChangedAtMajorStep功能。相反,在加速器模式下,如果使用这些函数或存在连续状态,则多线程将自动关闭。

配置S功能块以运行单线程或多线程

S函数块是单线程运行还是多线程运行取决于多线程参数值和ssSetRuntimeThreadSafetyCompliance作用

多线程背景 ssSetRuntimeThreadSafetyCompliance背景 单线程或多线程
“自动” 运行时\线程\安全性\合规性\未知 单线
“自动” 运行时\线程\安全性\合规性\正确 多线程
“自动” 运行时\线程\安全性\合规性\错误 单线
“关” 忽略该设置,S功能块运行单线程

多线程限制下的协同仿真

  • 对于加速器和快速加速器模式,模拟在单个线程上运行。

  • 没有为协同仿真组件生成代码。

  • 当块具有这些设置时,它不支持协同模拟:万博1manbetx

S功能块限制

  • 必须有一个单一的价格-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导入块限制

  • 必须处于协同仿真模式。

  • 必须是线程安全的,即多个FMU不能同时访问同一文件。

  • 必须禁用调试日志记录-例如,设置参数(块1、'FMUDebugLogging'、'on')

  • 调试日志重定向设置为文件-例如,set_param(block1、'FMUDebugLoggingRedirect'、'File')

模型块限制

  • 无法公开任何IRT端口以进行计划。

  • 不能位于每个子系统的内部。

  • 必须处于加速器模式。

  • 必须有单一费率。

  • 无法使用采样时间可变的块。

  • 不能有连续状态。

  • 任何输入端口上都不能有直接馈通。

  • 必须具有固定步长解算器。

  • 无法访问任何全局数据存储。

  • 无法使用任何Simulink函万博1manbetx数或调用程序块。

  • 禁不住到/从文件阻碍。

另见

|||

相关话题