万博1manbetx®万博1manbetx支持使用局部解算器或涉及仿真工具的组件之间的协同仿真。例如,协同仿真可能涉及一个S函数,该函数被实现为Simulink与第三方工具或自定义代码之间的协同仿真网关。它还可能涉及导入Simulink或万博1manbetx模型在加速器模式下阻塞。
为了提高性能,考虑在多个线程上运行包含共同仿真块(组件)的模型,如果:
您正在集成多个联合模拟组件
组件级的集成在计算上非常密集
本主题假设您熟悉多线程编程和概念。
万博1manbetxSimulink允许您运行C MEX s -函数、联合仿真FMU模块和模型为多线程上的加速器模式配置的块(如果它们是线程安全的)。线程安全意味着块可以与访问共享数据、资源和对象的多个线程一起工作,而不会产生任何冲突。
如果模型有一个非直接的馈通块,后跟一个直接的馈通块,则还可以在多个线程上运行模型(请参见单线程与多线程仿真).直接馈通是指块的输出端口信号由其输入端口信号在同一时间步长内的值计算得出。
笔记
多线程的联合仿真二级MATLAB S函数不支持块。万博1manbetx
默认情况下,Simuli万博1manbetxnk将所有模型配置为在多个线程上运行。如果可以提高性能,Simulink会自动在多个线程上运行所有模型。但是,并非所有模型都具有可在多个线程上运行的协同仿真组件,并且并非所有模型都能从在多个线程上运行中获益。
当评估系统中可能存在的多线程并发时,Simulink使用基于图的算法来分析合格块之间的数据依赖关系,并形成多个任务组。万博1manbetx该算法确保不同的任务组:
彼此之间没有数据依赖关系
可以使用多个内核并行执行
例如,Simulink可能万博1manbetx会查找非直接馈通块,后跟直接馈通块。如果以下直接馈通块仅依赖于非直接馈通块,则软件可以将这些块分组到同一分支中以并行执行。
此示例比较为并行执行而分区的一系列块的串行执行。
考虑一下基于多流模拟
示例,使用四个非直接馈通块,后跟四个直接馈通块。直接馈通意味着一个块的输出端口信号是在同一时间步从其输入端口信号的值计算出来的。
万博1manbetxSimulink分析数据相关性并形成四个分支。每个分支包含非直接馈通块,后跟直接馈通块。然后,Simulink使用多线程来运行这四个分支。通过这种方式,与同一台机器上的单线程模拟相比,Simulink可以将四个或更多核心机器上的模拟速度提高四倍。可以在更改模型之前和之后手动测量模型的模拟多线程模拟
参数
可以在更改模型之前和之后手动测量模型的模拟多线程模拟
参数此代码显示了如何测量基于多流模拟
例子:
openExample (“slexGraphBasedMultiThreadSimExample”);...设置参数(地面军事系统,“多线程SIM”,“关”); 抽搐;模拟(“slexGraphBasedMultiThreadSimExample”);toc
运行时间为39.406743秒。
设置参数(地面军事系统,“多线程SIM”,“开”); 抽搐;模拟(“slexGraphBasedMultiThreadSimExample”); toc
运行时间为13.619744秒。
在本例中,四核机器的加速比几乎是三倍(而不是四倍)。这是由于操作系统线程上下文开关引入的额外开销造成的。
多线程模拟
参数您可以使用指定在多个线程上运行整个模型,或指定特定块在多个线程上运行多线程模拟
参数。如果模型中的所有协同仿真块都是线程安全的,则指定整个模型在多个线程上运行。如果某些块(而不是所有块)是线程安全的,则仅标识要在多个线程上运行的那些块。模型和块使用多线程模拟
参数如下:
设置 | 描述 |
---|---|
|
(默认)让Simulink决万博1manbetx定块是否可以在多个线程上运行。 |
|
禁止块或模型在多个线程上运行。 |
[A.]从R2021a开始,当您打开在早期版本中创建的模型时,Simulink将解释万博1manbetx |
使多线程模拟
参数并不意味着块或模型在多个线程上进行模拟。多线程模拟发生时多线程模拟
已启用,并且:
块和/或模型以单一的速率运行。
块和/或模型是线程安全的。(例如,它们不使用静态或全局数据)。
块和/或模型是无异常的。对于S功能块,使用ssSetOptions
要设置的函数SS\U选项\U例外\U自由\U代码
.
多线程不允许解算器重置检查,因此跳过对ssSetSolverNeedsReset
和ssBlockStateForSolverChangedAtMajorStep
功能。相反,在加速器模式下,如果使用这些函数或存在连续状态,则多线程将自动关闭。
S函数块是单线程运行还是多线程运行取决于多线程模拟
参数值和ssSetRuntimeThreadSafetyCompliance
作用
多线程模拟 设置 |
ssSetRuntimeThreadSafetyCompliance 设置 |
单线程或多线程 |
---|---|---|
“自动” |
运行时\线程\安全性\合规性\未知 |
单线 |
“自动” |
运行时\线程\安全性\合规性\正确 |
多流 |
“自动” |
运行时\线程\安全性\合规性\错误 |
单线 |
“关” |
— | 忽略该设置,S功能块运行单线程 |
对于加速器和快速加速器模式,模拟在单个线程上运行。模拟模式正常时启用多线程。
将模型模拟模式设置为“正常”。
没有为协同仿真组件生成代码。
对于采样时间恒定的块,不会激活多线程。
启用Simulink调试器时,不会启用多线程。万博1manbetx
关闭Simulin万博1manbetxk调试器。
依赖于非线程安全块的块不能是多线程的。考虑打破依赖关系,例如,使用单位延迟块
必须有一个单一的价格。
考虑修改模型以将多速率组件分解为单个单速率组件。
当S函数具有可变采样时间时,不启用多线程。
考虑使用不同的示例时间(参见指定采样时间).
当S函数具有连续状态且解算器为固定步骤时,将不启用多线程,这将一起触发连续状态一致性检查。若要禁用连续状态一致性检查,请使用SSSETSKIPCONTSTATES一致性检查
作用
必须是线程安全的ssSetRuntimeThreadSafetyCompliance(SimStruct*S,int\u T val)
,瓦尔
必须是运行时\线程\安全性\合规性\正确
.
有关详细信息,请参阅编写线程安全S函数的指南.
必须没有例外-在ssSetOptions (SimStruct * S, uint_T选项)
,选择权
必须包括SS\U选项\U例外\U自由\U代码
.
有关详细信息,请参阅编写线程安全S函数的指南.
S-function Analyzer打开时未启用多线程。请在正常模式下尝试多线程。
当S-function具有连续采样时间时,不启用多线程。考虑使用不同的示例时间(参见指定采样时间).
多线程同时运行输出和更新方法。块必须具有输出或更新方法。
必须处于协同模拟模式。
考虑将FMU模式从模型交换切换到协同仿真。
必须是线程安全的,例如,多个FMUs不能同时访问同一个文件。
当MATLAB中显示FMU块记录时,多线程未启用®命令窗口。使用以下命令将FMU块日志重定向到文件:
set_param (blockName“FMUDebugLoggingRedirect”,“文件”)
FMU在进程外运行时不支持多线程。要禁用此设万博1manbetx置,请使用:
set_param (blockName“DebugExecutionForFmuviaoOutofProcess”,“关”)
当一个模型块具有事件端口。
不可能在对于每个子系统块
考虑移动模型封锁对于每个子系统块
一定是在加速模式。
必须有单一费率。
考虑修改模型以将多速率组件分解为单个单速率组件。
无法使用采样时间可变的块。
考虑使用不同的示例时间(参见指定采样时间).
不能有连续状态。
考虑打破块之间的依赖关系,例如,使用单位延迟块
必须具有固定步长解算器。
无法访问任何全局数据存储。
当模型包含万博1manbetxSimulink函数块
无法使用任何Simulink函万博1manbetx数或调用程序块。
不能包含归档阻碍。有关详细信息,请参阅导出模拟数据.
不能包含从文件块。
考虑通过顶层模型的入口将数据导入到引用的模型中。
FMU|系统函数|ssSetRuntimeThreadSafetyCompliance
|ssGetRuntimeThreadSafetyCompliance