金宝app®金宝app支持使用本地求解器或涉及仿真工具之间的组件之间的共模。例如,共模仿真可以涉及在Simulink和第三方工具或自定义代码之间实现为共模仿真网关的S函数。金宝app它还可以涉及进口到Simulink或A的共模模式中的FMU金宝app模型阻塞加速器模式。
为了提高性能,考虑在多个线程上运行包含联合仿真块(组件)的模型:
您正在集成多个共模组件
组件级的集成需要大量的计算
本主题假设您熟悉多线程编程和概念。
金宝appSimulink允许您运行C MEX S函数,共模拟FMU块,以及模型如果它们是Threadsafe,则在多个线程上配置为Accelerator模式的块。Windsafe表示该块可以使用多个线程访问不带任何冲突的共享数据,资源和对象。
你也可以在多个线程上运行一个模型,如果模型有一个非直接的feedthrough块和一个直接的feedthrough块(参见SingleRethreaded与多线程模拟).直接馈通是指一个块的输出端口信号是由它的输入端口信号在同一时间步长的值计算出来的。
请注意
多线程共模Level-2 Matlab S功能不支持块。金宝app
默认情况下,Simuli金宝appnk配置所有模型以在多个线程上运行。如果可以提高性能,Simulink会自动在多个线程上运行所有模型金宝app。但是,并非所有型号都具有可以在多个线程上运行的共模拟组件,而不是所有型号都会受益于多个线程上运行。
在评估系统中可能的同时进行多线程执行的模型时,Simulink使用基于图形的算法来分析符合条件块之间的数据依赖性,并形成多个任务组。金宝app此算法可确保不同的任务组:
彼此没有数据依赖性
可以使用多个核心并行执行
例如,Simulink可能金宝app寻找非直接馈通块,然后是直接馈通块。如果下面的直接馈通块只依赖于一个非直接馈通块,软件可以在同一个分支中对这些块进行分组,以便并行执行。
此示例比较了分区的一系列块的串行执行,以便并行执行。
考虑到这一点基于图的多线程模拟
示例,使用四个非向馈通块,然后使用四个直接馈通块。直接馈通是指一个块的输出端口信号是由它的输入端口信号在同一时间步长的值计算出来的。
金宝appSimulink分析数据依赖关系并形成四个分支。每个分支包含非直接馈通块,然后是直接馈通块。然后,Sim金宝appulink使用多线程来运行这四个分支。通过这种方式,与同一台机器金宝app上的单线程模拟相比,Simulink在4个或更多核心机器上可以将模拟速度提高4倍。您可以手动测量模型更改之前和之后的模拟Multithreadsim.
参数。
您可以手动测量模型更改之前和之后的模拟Multithreadsim.
参数。这个代码展示了如何测量仿真基于图的多线程模拟
例子:
OpenExample('slexgraphbasedmultithreadsimexample');...set_param (gcs,'multithreadsim','离开');抽搐;sim卡('slexgraphbasedmultithreadsimexample'); toc
经过时间是39.406743秒。
set_param (gcs,'multithreadsim',“上”);抽搐;sim卡('slexgraphbasedmultithreadsimexample');toc
经过时间是13.619744秒。
在此示例中,Speedup在四个核心机器上几乎三次(而不是四次)。这是由于操作系统线程上下文切换引入的额外开销。
Multithreadsim.
参数属性指定整个模型在多个线程上运行,或者指定特定的块在多个线程上运行Multithreadsim.
参数。如果模型中的所有联合仿真块都是线程安全的,则指定整个模型在多个线程上运行。如果有些(但不是所有)块是线程安全的,那么只标识那些在多个线程上运行的块。模型和块使用Multithreadsim.
参数如下:
环境 | 描述 |
---|---|
|
(默认)让Simulink决金宝app定块是否可以在多个线程上运行。 |
|
禁止块或模型在多个线程上运行。 |
[一个]从R2021a开始,当你打开在先前版本中创建的模型时,Simulink会解释金宝app |
启用Multithreadsim.
参数并不意味着块或模型在多个线程上模拟。在多个线程上模拟发生Multithreadsim.
已启用并:
块和/或模型以单个速率运行。
块和/或模型是线程安全的。(例如,它们不使用静态或全局数据)。
块和/或模型是异常的。对于S函数块,使用sssetoptions.
函数设置ss_option_exception_free_code.
.
多线程不允许求解器重置检查,因此跳过任何使用Sssetsolverneedsreset.
和ssBlockStateForSolverChangedAtMajorStep
职能。相反,在加速器模式下,如果使用这些功能或者存在连续状态,则自动关闭多线程。
S函数块是否运行单个或多线程取决于Multithreadsim.
参数值和ssSetRuntimeThreadSafetyCompliance
函数。
Multithreadsim. 环境 |
ssSetRuntimeThreadSafetyCompliance 环境 |
单次或多线程 |
---|---|---|
“汽车” |
RUNTIME_THREAD_SAFETY_COMPLIANCE_UNKNOWN |
单螺纹 |
“汽车” |
RUNTIME_THREAD_SAFETY_COMPLIANCE_TRUE |
多线程 |
“汽车” |
RUNTIME_THREAD_SAFETY_COMPLIANCE_FALSE |
单螺纹 |
'离开' |
- - - - - - | 该设置被忽略,S-function块以单线程方式运行 |
模拟在单线上运行,用于加速器和快速加速器模式。当仿真模式正常时,启用多线程。
将模型仿真模式设置为正常。
没有为联合仿真组件生成代码。
当块有这些设置时,它不支持联合模拟。金宝app
对于采样时间恒定的块,不会激活多线程。
当Simulink Debugger正在开启时,不会启用多线程。金宝app
关闭Simulin金宝appk调试器。
无法多线程识别取决于非线性安全块的块。考虑通过使用a,例如通过使用a打破依赖关系单位延迟块。
必须有一次速率。
考虑修改您的模型,将多速率组件分解为单个的单速率组件。
当S函数具有可变采样时间时,不会启用多线程。
考虑使用不同的采样时间(参见指定样品时间).
当S函数具有连续状态并且求解器是固定步骤时,未启用多线程,将连续触发连续状态一致性检查。要禁用连续状态的一致性检查,请使用sssetskipcontstatesconsistencycheck.
函数。
必须是线程安全的-在ssSetRuntimeThreadSafetyCompliance (SimStruct * S, int_T val)
,瓦
一定是RUNTIME_THREAD_SAFETY_COMPLIANCE_TRUE
.
有关更多信息,请参见写入线程安全S函数的指南.
必须是异常的 - 进入sssetOptions(Simstruct * s,Uint_t选项)
,选项
必须包括ss_option_exception_free_code.
.
有关更多信息,请参见写入线程安全S函数的指南.
当S函数分析器打开时,不会启用多线程。在正常模式下尝试多线程。
当S函数具有连续采样时间时,未启用多线程。考虑使用不同的采样时间(参见指定样品时间).
多线程并发地运行输出和更新方法。块必须有一个输出或更新方法。
必须是共模模式。
考虑将FMU模式从模型交换切换到联合仿真。
例如,必须是线程安全的,例如,多个FMU不得同时访问相同的文件。
当MATLAB中的FMU块日志记录显示时,未启用多线程®命令窗口。将FMU块重定向到文件使用:
set_param(blockname,“FMUDebugLoggingRedirect”,“文件”)
当FMU在进程外运行时,不支持多线程。金宝app要禁用此设置,请使用:
set_param(blockname,'debugexecutionforfmuviaoutofprocess','离开')
当a时未启用多线程模型块具有事件端口。
不能在一个里面为每个子系统块。
考虑移动模型挡出为每个子系统块。
必须是加速器模式。
必须有单一的速度。
考虑修改您的模型,将多速率组件分解为单个的单速率组件。
无法使用具有可变采样时间的块。
考虑使用不同的采样时间(参见指定样品时间).
不能持续陈述。
考虑通过使用a,例如通过使用a打破块之间的依赖性单位延迟块。
必须有一个固定的步骤求解器。
无法访问任何全局数据存储。
当模型包含一个时,未启用多线程金宝app仿真软件的功能块。
不能使用任何Simulink函金宝app数或调用方块。
不能包含到文件块。有关更多信息,请参见出口仿真数据.
不能包含从文件块。
考虑通过顶级模型的Inport将数据送入引用的模型。
FMU|功能|SSGetRuntimeTeLreadSafety匹配
|ssSetRuntimeThreadSafetyCompliance