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