多核上运行组件联合仿真
万博1manbetx®万博1manbetx支持cosimulation解决组件之间使用本地或涉及到模拟工具。例如,cosimulation可以包括一个功能实现为一个cosimulation仿真软件和第三方工具之间的网关或自定义代码。万博1manbetx它也可以包括一个FMU cosimulation导入的模型或模式万博1manbetx模型在加速器模式。
为了提高性能,考虑运行模型,包含cosimulation模块(组件)如果多个线程:
你是整合多个cosimulation组件
集成组件级别的计算激烈
这个话题假定您熟悉多线程编程和概念。
万博1manbetx联合仿真模型允许您运行C墨西哥人S-functions, FMU块,和模型块为加速器模式配置多个线程如果他们是线程安全的。被threadsafe意味着块可以处理多个线程访问共享数据,资源,和对象没有任何冲突。
你也可以多个线程上运行一个模型如果模型有一个间接引线块直接引线块(见紧随其后Singlethreaded和多线程的模拟)。直接引线意味着一块的输出端口信号值的计算其输入端口信号在相同的时间步。
请注意
多线程cosimulation为2级MATLAB函数不支持模块。万博1manbetx
默认情况下,仿真软件配置万博1manbetx所有模型上运行多个线程。如果可以提高性能,仿真软件自动运行所有模型在多个线程。万博1manbetx然而,并非所有的模型cosimulation组件可以在多个线程上运行,而不是所有的模型从运行在多个线程中获益。
Singlethreaded和多线程的模拟
当评估一个模型可能并发多线程执行系统中,仿真软件使用图论算法来分析数据合格的模块之间的依赖关系,形成多个任务组。万博1manbetx该算法保证了不同任务组:
没有数据相互依赖
可以使用多核并行执行
例如,模型可能间接寻找引线万博1manbetx阻塞之后,直接引线。如果以下直接引线块只取决于一个间接直通的块,软件可以组块在同一分支并行执行。
这个例子比较了串行执行的一系列块分区并行执行。
使用多核多线程模拟加速模拟
考虑到基于多流模拟
示例,它使用四个间接引线块直接引线四块紧随其后。直接引线意味着一块的输出端口信号值的计算其输入端口信号在相同的时间步。
万博1manbetx仿真软件分析了数据依赖关系和形式四个分支机构。每个分支包含间接引线阻塞之后,直接引线。然后,仿真软万博1manbetx件采用多线程运行这四个分支。这样,模型可以加快模拟四次万博1manbetx在四个或更多核心机相比,singlethreaded模拟在同一台机器上。你可以手动测量模型的仿真之前和之后的变化MultithreadedSim
参数。
这个代码显示了如何测量的模拟基于多流模拟
例子:
openExample (“slexGraphBasedMultiThreadSimExample”);…set_param (gcs,“MultithreadedSim”,“关闭”);抽搐;sim卡(“slexGraphBasedMultiThreadSimExample”);toc
运行时间是39.406743秒。
set_param (gcs,“MultithreadedSim”,“上”);抽搐;sim卡(“slexGraphBasedMultiThreadSimExample”);toc
运行时间是13.619744秒。
在这个例子中,加速几乎是三倍四倍(而不是)四个核心机。这是由于引入的额外的开销由操作系统线程上下文切换。
使用MultithreadedSim
参数
您可以指定一个完整的模型上运行多个线程,或指定特定的块上运行多个线程,使用MultithreadedSim
参数。指定一个完整的模型上运行多个线程如果cosimulation块模型中都是线程安全的。如果一些,但不是所有块,只threadsafe,识别那些块上运行多个线程。使用的模型和块MultithreadedSim
参数如下:
设置 | 描述 |
---|---|
|
(默认)让模型决定如果块可以万博1manbetx在多个线程上运行。 |
|
禁用阻止或模型上运行多个线程。 |
一个从R2021a开始,当您打开一个模型中创建一个以前的版本,模型解释万博1manbetx |
使MultithreadedSim
参数并不意味着在多个线程块或模型模拟。模拟时在多个线程MultithreadedSim
已启用并:
块和/或操作一个速度模型。
块和/或模型是线程安全的。(例如,他们不使用静态或全局数据)。
exception-free块和/或模型。对于功能块,使用
ssSetOptions
函数设置SS_OPTION_EXCEPTION_FREE_CODE
。
解决多线程不允许重置检查,因此跳过任何使用ssSetSolverNeedsReset
和ssBlockStateForSolverChangedAtMajorStep
功能。相反,在加速器模式中,如果使用这些函数或有连续状态,多线程会自动关闭。
配置运行单个或多线程功能块
一个功能块是否运行单个或多线程的依赖MultithreadedSim
参数值和ssSetRuntimeThreadSafetyCompliance
函数。
MultithreadedSim 设置 |
ssSetRuntimeThreadSafetyCompliance 设置 |
单个或多流 |
---|---|---|
“汽车” |
RUNTIME_THREAD_SAFETY_COMPLIANCE_UNKNOWN |
单线程 |
“汽车” |
RUNTIME_THREAD_SAFETY_COMPLIANCE_TRUE |
多流 |
“汽车” |
RUNTIME_THREAD_SAFETY_COMPLIANCE_FALSE |
单线程 |
“关闭” |
- - - - - - | 设置将被忽略和功能块singlethreaded运行 |
在多个线程联合仿真的局限性和指导方针
仿真运行在单个线程的加速器和快速加速模式。多线程时启用模拟模式是正常的。
集模型模拟模式正常。
没有代码生成cosimulation组件。
多线程不激活块与常数样品时间。
多线程模型时不启用调试器。万博1manbetx
关闭仿真软件调试器万博1manbetx。
一块这取决于非线程安全块不能多线程。考虑打破了依赖,例如,通过使用一个单位延迟块。
功能块的局限性
必须有一个单一税率。
考虑修改模型,将多重速率的组件分解成各个单频组件。
没有启用多线程当一个函数变量样本。
考虑使用一个不同的时间(见样本指定样品时间)。
多线程不启用,当一个函数连续状态和解决固定步,引发连续状态一致性检验。禁用连续状态一致性检查,使用
ssSetSkipContStatesConsistencyCheck
函数。必须是线程安全的,在吗
ssSetRuntimeThreadSafetyCompliance (SimStruct * S, int_T val)
,瓦尔
必须RUNTIME_THREAD_SAFETY_COMPLIANCE_TRUE
。有关更多信息,请参见编写线程安全的S-Functions指南。
必须exception-free——在吗
ssSetOptions (SimStruct * S, uint_T选项)
,选项
必须包括SS_OPTION_EXCEPTION_FREE_CODE
。有关更多信息,请参见编写线程安全的S-Functions指南。
多线程功能分析仪时不启用。试着在正常模式下多线程。
没有启用多线程当s函数连续采样时间。考虑使用一个不同的时间(见样本指定样品时间)。
多线程并发运行输出和更新方法。块必须有一个输出或更新方法。
FMU进口块限制
必须在cosimulation模式。
考虑切换FMU从联合仿真模型交换模式。
必须是线程安全的,例如,多个FMUs不能访问相同的文件在同一时间。
没有启用多线程当FMU块日志显示在MATLAB®命令窗口。重定向FMU块记录到一个文件中使用:
set_param (blockName“FMUDebugLoggingRedirect”,“文件”)
多线程FMU进程运行时不支持。万博1manbetx禁用此设置,使用:
set_param (blockName“DebugExecutionForFMUViaOutOfProcess”,“关闭”)
块模型的局限性
多线程时不启用模型阻止事件的港口。
不能在一个为每个子系统块。
考虑移动模型块的为每个子系统块。
必须在加速模式。
必须有单一税率。
考虑修改模型,将多重速率的组件分解成各个单频组件。
不能使用块变量样本。
考虑使用一个不同的时间(见样本指定样品时间)。
不能有连续的状态。
考虑打破块之间的依赖关系,例如,通过使用一个单位延迟块。
必须有一个固定的解决者。
不能访问任何全球数据存储。
多线程模型包含一个时不启用万博1manbetx仿真软件的功能块。
调用者不能使用任何仿真软件功能万博1manbetx或块。
不能包含到文件块。有关更多信息,请参见保存仿真数据。
不能包含从文件块。
考虑向引用模型数据通过一个从顶层模型尺寸。
另请参阅
FMU|功能|ssSetRuntimeThreadSafetyCompliance
|ssGetRuntimeThreadSafetyCompliance