主要内容

在多个核上运行共仿仿真组件

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

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

  • 您正在集成多个联合模拟组件

  • 在组件级别的集成是计算的强烈的

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

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

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

笔记

多线程的联合仿真2级MATLAB函数块不受支持。金宝app

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

单线程与多线程模拟

当评估系统中可能存在的多线程并发时,Simulink使用基于图的算法来分析合格块之间的数据依赖关系,并形成多个任务组。金宝app该算法确保不同的任务组:

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

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

例如,Simulink可能金宝app会查找非直接馈通块,然后是直接馈通块。如果以下直接馈通块仅取决于非向馈通块,则软件可以将块分组在同一分支中进行并行执行。

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

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

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

考虑到基于多流模拟示例,它使用四个非直接馈通块,然后是四个直接馈通块。直接馈通意味着在同一时间步长,从其输入端口信号的值计算块的输出端口信号。

金宝appSimulink分析数据依赖性并形成四个分支。每个分支都包含非向馈通块,然后是直接馈通块。然后,Sim金宝appulink使用多线程来运行这四个分支。通过这种方式,与同一台机器金宝app上的SingleSheReDed仿真相比,Simulink可以在四个或更多核心机器上加速模拟。您可以在更改之前和之后手动测量模型的模拟MultithreadedSim范围。

slexGraphBasedMultiThreadSimExample模型

您可以在更改之前和之后手动测量模型的模拟MultithreadedSim范围。此代码显示如何测量模拟基于多流模拟例子:

openExample (“slexGraphBasedMultiThreadSimExample”);......set_param(gcs,“MultithreadedSim”“关闭”);tic; sim(“slexGraphBasedMultiThreadSimExample”); TOC.
经过时间为39.406743秒。
set_param(gcs,“MultithreadedSim”'在');tic; sim(“slexGraphBasedMultiThreadSimExample”);TOC.
经过时间为13.619744秒。

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

使用MultithreadedSim范围

您可以指定在多个线程上运行的整个模型,或指定使用多个线程在多个线程上运行的特定块MultithreadedSim范围。如果模型中的所有共模块是Threadsafe,则指定整个模型在多个线程上运行。如果某些但不是所有块是Threadsafe,则仅识别这些块以在多个线程上运行。模型和块使用MultithreadedSim参数如下:

设置 描述

'汽车'[一种]

(默认)让Simulink决金宝app定块是否可以在多个线程上运行。

“关闭”

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

[一种]从R2021A开始,当您打开先前版本中创建的模型时,Simulink将解释金宝app'在'设置为相同'汽车'

使MultithreadedSim参数并不意味着块或模型在多个线程上进行模拟。多线程模拟发生时MultithreadedSim已启用和:

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

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

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

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

配置S函数块以运行单个或多线程

s函数块是单线程运行还是多线程运行取决于MultithreadedSim参数值和sssetruntimethreadsafety deliance功能。

MultithreadedSim设置 sssetruntimethreadsafety deliance设置 单个或多流
'汽车' runtime_thread_safety_compliance_unknown. 单线程
'汽车' runtime_thread_safett_compliance_true. 多流
'汽车' runtime_thread_safety_compliance_false. 单线程
“关闭” - 该设置被忽略,S函数块运行Singlethreaded

多线程联合模拟的限制和指导方针

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

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

  • 共仿真组件没有代码生成。

  • 当块具有这些设置时,它不支持共模。金宝app

  • 没有为具有常量采样时间的块激活多线程。

  • 当Simulink调试器打开时,多线程未被启用。金宝app

    关闭Simulin金宝appk调试器。

  • 依赖于非线程安全块的块不能是多线程的。考虑打破依赖关系,例如,使用单位延迟堵塞。

功能块的局限性

  • 必须有一个单一的汇率。

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

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

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

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

  • 必须是线程安全 - 进来sssetruntimethreadsafety deliance(Simstruct * s,Int_t val)瓦尔必须runtime_thread_safett_compliance_true.

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

  • 必须没有例外-在ssSetOptions (SimStruct * S, uint_T选项)选项必须包括SS_OPTION_EXCEPTION_FREE_CODE

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

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

  • 当S-function具有连续采样时间时,不启用多线程。考虑使用不同的示例时间(参见指定采样时间)。

  • Multithreading同时运行输出和更新方法。块必须具有输出或更新方法。

FMU导入块限制

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

    考虑从模型交换到共模的切换FMU模式。

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

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

    set_param (blockName'fmudebugloggingredirect''文件'
  • FMU运行流程时不支持多线程。金宝app要禁用此设置,请使用:

    set_param (blockName“DebugExecutionForFMUViaOutOfProcess”“关闭”

块模型的局限性

  • 当一个模型块有事件端口。

  • 不能在对于每个子系统堵塞。

    考虑移动模型阻止对于每个子系统堵塞。

  • 一定是在加速模式。

  • 必须有单一费率。

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

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

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

  • 不能有连续的状态。

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

  • 必须具备固定步骤求解器。

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

  • 当模型包含金宝appSimulink功能堵塞。

  • 不能使用任何Simulink函金宝app数或来电块。

  • 不能包含到文件块。有关更多信息,请参阅导出模拟数据

  • 不能包含从文件块。

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

也可以看看

|||

相关的话题