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

金宝app®金宝app支持使用局部求解器或涉及仿真工具的组件之间的协同仿真。例如,协同仿真可能涉及一个S-function,它被实现为Simulink与第三方工具或自定义代码之间的协同仿真网关。金宝app它也可以涉及一个FMU在协仿真模式下导入到Simulink。金宝app

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

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

  • 组件级的集成是计算密集型的

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

金宝appSimulink允许您在多个线程上运行C MEX S-functions和Co-Simulation FMU块,如果它们满足以下要求:

  • 块是非直接馈通的。

  • 该块是线程安全的,也就是说,该块可以与访问共享数据、资源和对象的多个线程一起工作,而不会产生任何冲突。

请注意

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

默认情况下,Simuli金宝appnk将所有模型配置为在多个线程上运行。然而,并不是所有的模型都有可以在多个线程上运行的联合模拟组件,也不是所有的模型都能从在多个线程上运行中受益。要查看一个模型是否有可以在多个线程上运行的联合模拟组件,请执行以下步骤:

  1. 打开你的模型。

  2. 启动Performance Advisor工具(在调试选项卡上,单击性能顾问)。

  3. 选择模拟>需要模拟运行的检查>选择多线程协同仿真设置开启或关闭.

    此检查验证模型或块被优化配置为利用多线程或单线程处理。如果配置不是最优的,Performance Advisor将显示当前设置,并警告您该模型不适合在多个线程上运行。

  4. 运行所选的检查。

或者,您可以在更改之前和之后手动测量模型的模拟MultiThreadCoSim参数。例如:

抽搐;sim卡(“sfunction_components”);toc
运行时间是2.323264秒。
get_param (gcs,“MultiThreadCoSim”)
ans = '在'
set_param (gcs,“MultiThreadCoSim”,“关闭”)
抽搐;sim卡(“sfunction_components”);toc
运行时间为4.112674秒。

有关在多核上运行联合仿真组件的示例,请参见slexCoSimPrimeExample模型。

使用MultiThreadCoSim参数

可以指定整个模型运行在多个线程上,也可以指定特定块运行在多个线程上,使用MultiThreadCoSim参数。如果模型中的所有联合模拟块都是非直接的、线程安全的,则指定整个模型运行在多个线程上。如果有些(但不是所有)块是非直接传递的,并且是线程安全的,那么就只识别那些要在多个线程上运行的块。模型和块使用MultiThreadCoSim参数如下。

设置 模型 描述

“上”

(默认)模型可以在多个线程上运行。

“关闭”

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

“汽车”

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

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

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

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

  • 块和/或模型是非直接馈通的。

    • 对于s功能块,请使用ssSetInputPortDirectFeedThrough函数。

    • 对于FMU块,离开依赖关系FMU的模型描述文件中的属性ModelStructure /输出ModelStructure / InitialUnknowns字段为空。这个属性必须是(" ")。

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

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

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

函数块是单独运行还是多线程运行取决于MultiThreadCoSim参数值和ssSetRuntimeThreadSafetyCompliance函数。

MultiThreadCoSim设置 ssSetRuntimeThreadSafetyCompliance设置 单个或多流
“汽车” RUNTIME_THREAD_SAFETY_COMPLIANCE_UNKNOWN 单线程
“汽车” RUNTIME_THREAD_SAFETY_COMPLIANCE_TRUE 多流
“汽车” RUNTIME_THREAD_SAFETY_COMPLIANCE_FALSE 单线程
“关闭” - - - - - - 该设置被忽略,S-function块以单线程方式运行

多线程联合仿真的局限性

  • 模拟运行在单线程加速器和快速加速器模式。

  • 没有用于协同仿真组件的代码生成。

  • 当块有这些设置时,它不支持协同仿真:金宝app

功能块的局限性

  • 必须有一个单一的汇率ssSetSampleTime(SimStruct *S, int_T st_index, time_T period)必须被调用才能注册一个离散率。

  • 必须有一个固定的采样时间(SimStruct *S, int_T st_index, time_T period),不能VARIABLE_SAMPLE_TIME.

  • 不能有连续的- In状态ssSetNumContStates(SimStruct *S, int_T n),n必须0.

  • 必须没有直接的馈入端口吗ssSetInputPortDirectFeedThrough(SimStruct *S, int_T port, int_T dirFeed),dirFeed必须0对于每个输入端口。

  • 必须是线程安全的-在ssSetRuntimeThreadSafetyCompliance(SimStruct *S, int_T val),瓦尔必须RUNTIME_THREAD_SAFETY_COMPLIANCE_TRUE.

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

FMU导入块限制

  • 必须处于协同模拟模式。

  • 必须是线程安全的,也就是说,多个fmu不能同时访问同一个文件。

  • 必须禁用调试日志—例如,set_param (block1“FMUDebugLogging”,“上”)

  • 调试日志重定向被设置为文件-例如,set_param (block1“FMUDebugLoggingRedirect”,“文件”)

块模型的局限性

  • 不能为调度公开任何IRT端口。

  • 不能在for-each子系统中。

  • 必须处于加速模式。

  • 必须有单一费率。

  • 不能使用采样时间可变的块。

  • 不可能有连续的状态。

  • 不能直接通过任何输入端口。

  • 必须有一个固定的步骤解决方案。

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

  • 不能使用任何Simulink函金宝app数或调用程序块。

  • 不能包含从文件/块。

另请参阅

|||

相关的话题