主要内容

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

万博1manbetx®万博1manbetx支持使用本地求解器或涉及仿真工具的组件之间的联合仿真。例如,协同仿真可以包含一个s函数,它被实现为Simulink和第三方工具或自定义代码之间的协同仿真网关。万博1manbetx它还可以涉及一个联合仿真模式的FMU导入到Simulink或万博1manbetx模型在加速器模式下阻塞。

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

  • 您正在集成多个共模组件

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

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

万博1manbetxSimulink允许您运行C MEX S函数,共模拟FMU块,以及模型如果多个线程是线程安全的,则在它们上配置为加速模式的块。线程安全意味着该块可以在多个访问共享数据、资源和对象的线程中工作,而不会发生任何冲突。

如果模型有一个非直接馈通块,后面跟着一个直接馈通块,您也可以在多个线程上运行模型(参见单线程与多线程模拟).直接馈通是指块的输出端口信号由其输入端口信号在同一时间步长内的值计算得出。

笔记

多线程共模2级MATLAB函数块不受支持。万博1manbetx

默认情况下,Simuli万博1manbetxnk将所有模型配置为在多个线程上运行。如果可以提高性能,Simulink会自动在多个线程上运行所有模型万博1manbetx。然而,并不是所有模型都具有可以在多个线程上运行的协同仿真组件,也不是所有模型都能从运行多个线程中受益。

单线程与多线程模拟

在评估系统中可能的同时进行多线程执行的模型时,Simulink使用基于图形的算法来分析符合条件块之间的数据依赖性,并形成多个任务组。万博1manbetx此算法可确保不同的任务组:

  • 彼此之间没有数据依赖关系

  • 可以使用多个核并行执行吗

例如,Simulink可能万博1manbetx会查找非直接馈通块,后跟直接馈通块。如果以下直接馈通块仅依赖于非直接馈通块,则软件可以将这些块分组到同一分支中以并行执行。

这个例子比较了为并行执行而划分的一系列块的串行执行。

基于图的执行多线程概念图

使用多线程仿真加速多核仿真

考虑到基于图的多线程模拟示例,它使用四个非直接馈通块,然后是四个直接馈通块。直接馈通是指一个块的输出端口信号是由它的输入端口信号在同一时间步长的值计算出来的。

万博1manbetxSimulink分析数据相关性并形成四个分支。每个分支包含非直接馈通块,后跟直接馈通块。然后,Simulink使用多线程来运行这四个分支。通过这种方式,与同一台机器上的单线程模拟相比,Simulink可以将四个或更多核心机器上的模拟速度提高四倍。可以在更改模型之前和之后手动测量模型的模拟MultithreadedSim参数

slexGraphBasedMultiThreadSimExample模型

可以在更改模型之前和之后手动测量模型的模拟MultithreadedSim参数此代码显示了如何测量基于图的多线程模拟例子:

OpenExample('slexgraphbasedmultithreadsimexample');...设置参数(地面军事系统,“MultithreadedSim”,“关闭”); 抽搐;模拟('slexgraphbasedmultithreadsimexample');toc
运行时间为39.406743秒。
设置参数(地面军事系统,“MultithreadedSim”,“开”); 抽搐;模拟('slexgraphbasedmultithreadsimexample'); toc
运行时间为13.619744秒。

在本例中,在四核机器上的加速几乎是三倍(而不是四倍)。这是由于操作系统线程上下文切换带来的额外开销。

使用MultithreadedSim参数

您可以使用指定在多个线程上运行整个模型,或指定特定块在多个线程上运行MultithreadedSim参数。如果模型中的所有协同仿真块都是线程安全的,则指定整个模型在多个线程上运行。如果某些块(而不是所有块)是线程安全的,则仅标识要在多个线程上运行的那些块。模型和块使用MultithreadedSim参数如下:

环境 描述

“自动”[A.]

(默认)让Simulink决万博1manbetx定块是否可以在多个线程上运行。

“关闭”

禁止块或模型在多个线程上运行。

[A.]从R2021a开始,当您打开在早期版本中创建的模型时,Simulink将解释万博1manbetx“开”设置为相同“自动”.

启用MultithreadedSim参数并不意味着块或模型在多个线程上模拟。在多个线程上模拟发生MultithreadedSim已启用,并且:

  • 块和/或模型以单个速率运行。

  • 块和/或模型是线程安全的。(例如,它们不使用静态或全局数据)。

  • 块和/或模型是无异常的。对于s功能块,使用ssSetOptions要设置的函数ss_option_exception_free_code..

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

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

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

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

多线程限制和指南的共同仿真

  • 该模拟运行在单一线程加速器和快速加速器模式。仿真模式正常时启用多线程。

    设置模型模拟模式为正常模式。

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

  • 对于采样时间恒定的块,不会激活多线程。

  • 当Simulink调试器打开时,多线程未被启用。万博1manbetx

    关闭Simulin万博1manbetxk调试器。

  • 无法多线程识别取决于非线性安全块的块。考虑通过使用a,例如通过使用a打破依赖关系单位延迟

S函数块限制

  • 必须有一次速率。

    考虑修改模型以将多速率组件分解为单个单速率组件。

  • 当s函数具有可变的采样时间时,不启用多线程。

    考虑使用不同的采样时间(参见指定采样时间).

  • 当S-function具有连续状态且求解器为固定步长时,不启用多线程,这将共同触发连续状态一致性检查。要禁用连续状态一致性检查,请使用ssSetSkipContStatesConsistencyCheck作用

  • 必须是线程安全的ssSetRuntimeThreadSafetyCompliance(SimStruct*S,int\u T val),瓦尔必须运行时\线程\安全性\合规性\正确.

    有关更多信息,请参见编写线程安全的s -函数的指南.

  • 必须是异常的 - 进入sssetOptions(Simstruct * s,Uint_t选项),选项必须包括ss_option_exception_free_code..

    有关更多信息,请参见编写线程安全的s -函数的指南.

  • 当S-function Analyzer打开时,多线程未启用。在普通模式下尝试多线程。

  • 当S函数具有连续采样时间时,未启用多线程。考虑使用不同的采样时间(参见指定采样时间).

  • 多线程并发地运行输出和更新方法。块必须有一个输出或更新方法。

FMU进口块限制

  • 一定是在联合模拟模式。

    考虑将FMU模式从模型交换切换到协同仿真。

  • 例如,必须是线程安全的,例如,多个FMU不得同时访问相同的文件。

  • 当在MATLAB中显示FMU块日志记录时,多线程未启用®命令窗口。重定向FMU块日志到一个文件使用:

    set_param(blockName,“FMUDebugLoggingRedirect”,“文件”)
  • FMU在进程外运行时不支持多线程。要禁用此设万博1manbetx置,请使用:

    set_param(blockName,“DebugExecutionForFMUViaOutOfProcess”,“关闭”)

块模型的局限性

  • 当a时未启用多线程模型块具有事件端口。

  • 不能在对于每个子系统

    考虑移动模型封锁对于每个子系统

  • 必须是加速器模式。

  • 必须有单一的速度。

    考虑修改模型以将多速率组件分解为单个单速率组件。

  • 不能使用具有可变样本时间的块。

    考虑使用不同的采样时间(参见指定采样时间).

  • 不能有连续的状态。

  • 考虑打破块之间的依赖关系,例如,使用单位延迟

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

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

  • 当模型包含一个时,未启用多线程万博1manbetxSimulink函数

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

  • 不能包含归档阻碍。有关详细信息,请参阅导出模拟数据.

  • 不能包含从文件块。

    考虑通过顶级模型的导入将数据提供给被引用的模型。

另见

|||

相关话题