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