在多核目标上优化和部署
本主题展示如何使用配置为使用显式分区并发执行的模型,并将其部署到目标上。要为并发执行设置模型,请参见为并发执行配置模型.要指定目标体系结构,请参见指定目标体系结构.若要在为并发执行而设置的模型中使用显式分区,请参见使用显式分区对模型进行分区.
生成代码
为配置为并发执行的模型生成代码应用程序选项卡®编辑器中,选择仿真软件编码器.在C代码选项卡上,选择构建.生成的代码包括:
模型中映射到并发执行对话框中的任务和触发器的部分的C代码。C代码生成需要一个仿真软件编码器™许可证。有关更多信息,请参见代码生成(仿真软件编码器)而且代码生成(嵌入式编码).
用于映射到并行执行对话框中的硬件节点的模型部分的HDL代码。HDL代码生成需要一个HDL Coder™许可证。有关更多信息,请参见从Simulink中生成HDL代码(高密度脂蛋白编码器).
处理并发任务和触发器之间的数据传输以及与硬件和软件组件连接的代码。
生成的C代码为系统中定义的每个任务或触发器包含一个函数。任务和触发器决定了函数的名称:
空白< TriggerName > _TaskName(无效);
每个这样的函数的内容都由独立于目标的C代码组成,除了:
与实现目标特定功能的块相对应的代码
自定义,包括从自定义存储类派生的自定义使用结构存储类将参数数据组织到结构中(嵌入式编码))或代码替换库(仿真软件编码器)
为处理如何在任务之间传输数据而生成的代码。特别是,仿真软件编码器使用互斥原语和数据同步信号量的特定于目标的实现来实现数据传输,如下面的伪代码表所示。
数据传输 | 初始化 | 读者 | 作家 |
---|---|---|---|
数据完整性只 |
BufferIndex = 0;用IC初始化缓冲区[1] |
开始互斥Tmp = 1 - BufferIndex;互斥读缓冲区[Tmp]; |
写入缓冲区[BufferIndex];开始互斥BufferIndex = 1 -结束互斥 |
确保确定性(最大延迟) |
WriterIndex = 0;ReaderIndex = 1;用IC初始化缓冲区[1] |
读取缓冲区[ReaderIndex];ReaderIndex = 1 - ReaderIndex; |
写缓冲区[WriterIndex] = 1 - WriterIndex; |
确保确定性(最小延迟) |
N/A |
dataReady等;读取数据;帖子readDone; |
等待readDone;写数据;dataReady后; |
数据完整性只 C-HDL接口 |
的仿真软件编码器和HDL Coder产品都利2022世界杯八强谁会赢?用特定于目标的通信实现和设备来处理硬件和软件组件之间的数据传输。 |
生成的HDL代码为每个硬件节点包含一个HDL项目。
建立在桌面
仿真软件编码器和嵌入式编码®targets提供了一个为Windows生成代码的示例目标®, Linux®而且Mac OS操作系统。它被称为原生线程的例子,它用于将您的模型部署到桌面目标。桌面可能不是您的最终目标,但在将模型部署到另一个目标之前,它可以帮助您分析和优化模型。
如果指定了嵌入式编码器目标,请在“配置参数”对话框中进行以下更改。
选择代码生成>模板>生成一个示例主程序复选框。
从代码生成>模板>目标操作系统列表中,选择
NativeThreadsExample
.点击好吧以保存更改并关闭“配置参数”对话框。
将这些设置应用于模型中的所有引用模型。
一旦你建立了你的模型,按Ctrl-B来构建并部署到您的桌面。本机线程示例说明了如何操作仿真软件编码器和Embedded Coder使用特定于目标的线程api和数据管理原语,如本地线程使用的线程api示例.并发执行的任务之间的数据传输行为如数据传输方案.编码器产品使用此行为2022世界杯八强谁会赢?所支持的目标上的api,如中所述本地线程使用的数据保护和同步api示例.
本地线程使用的线程api示例
并发执行方面 | Linux实现 | 窗口实现 | Mac OS实现 |
---|---|---|---|
周期性的触发事件 |
POSIX计时器 |
Windows计时器 |
不适用 |
非周期触发事件 |
POSIX实时信号 |
Windows事件 |
POSIX实时信号 |
非周期触发 |
映射到非周期任务的块:等待信号的线程 对于映射到非周期触发器的块:信号动作 |
等待事件的线程 |
映射到非周期任务的块:等待信号的线程 对于映射到非周期触发器的块:信号动作 |
线程 |
POSIX® |
窗户 |
POSIX |
线程优先级 |
根据样本时间分配:最快的任务优先级最高 |
从父进程继承的优先级类。 根据样本时间分配:最快的任务对前三个最快的任务具有最高优先级。其余的任务共享最低优先级。 |
根据样本时间分配:最快的任务优先级最高 |
溢出检测示例 |
是的 |
是的 |
没有 |
本地线程使用的数据保护和同步api示例
API | Linux实现 | 窗口实现 | Mac OS实现 |
---|---|---|---|
数据保护API |
|
|
|
同步API |
|
|
|
概要文件和评估桌面上显式分区的模型
方法对代码在多核目标上的执行进行概要分析概要文件报告窗格中的“并发执行”。您可以使用仿真软件编码器(GRT)和嵌入式编码器(ERT)目标。分析可以帮助您识别模型中的执行瓶颈区域。您可以分析每个任务的执行时间,找出执行时间最多的任务。例如,您可以比较任务的平均执行时间。如果一个任务是计算密集型的,或者不满足实时需求和超时,您可以将它分解为计算密集型较低且可以并发运行的任务。
当您生成配置文件报告时,软件:
构建模型。
为模型生成代码。
向生成的代码中添加工具以收集数据。
在目标上执行生成的代码并收集数据。
整理数据,生成HTML文件(
model_name_ProfileReport.html
),并将该HTML文件显示在概要文件报告窗格中的“并发执行”。请注意
如果模型存在HTML概要报告,则概要文件报告窗格显示该文件。单击,生成新的配置文件报告.
部分 | 描述 |
---|---|
总结 |
总结模型执行统计数据,例如总执行时间和概要报告创建时间。它还列出主机上的总内核数。 |
任务执行时间 |
以按任务编码的饼图颜色显示每个任务的执行时间(以微秒为单位)。 对Windows、Linux和Mac OS平台。 |
任务对处理器核心的亲和 |
平台相关的。对于每个时间步和任务,Simulink显示任务在该时间步上开始执行的处理器核心号,用处理器的颜色编码。 如果没有为特定的时间步骤安排任务, 对Windows和Linux平台可见。 |
在分析概要报告之后,考虑更改的映射模型块,以有效地使用多核系统上可用的并发性(参见将块映射到任务、触发器和节点).
生成配置文件报告
本主题假设前面配置了一个模型,可以对其进行分析以进行并发执行。有关更多信息,请参见为并发执行配置模型.
在“并发执行”对话框中,单击概要文件报告节点。
配置文件工具查找一个名为
model_name_ProfileReport.html
.如果当前模型不存在这样的文件,则概要文件报告窗格显示以下内容。请注意
如果模型存在HTML概要报告,则概要文件报告窗格显示该文件。单击,生成新的配置文件报告.
输入您希望分析器为模型执行收集数据的时间步骤数。
单击生成任务执行概要报告按钮。
该操作构建模型,生成代码,向代码中添加数据收集工具,并在目标上执行它,目标还生成一个HTML概要报告。这个过程可能需要几分钟。流程完成后,概要报告的内容将出现在概要文件报告窗格。例如:
分析报告显示摘要、每个任务的执行时间,以及每个任务到处理器核心的映射。我们看到,任务1和2运行在核心0上,而任务3和4运行在核心1上。的任务执行时间报告的部分表明,任务1和任务3的运行时间最多。请注意,任务3的周期是任务1和任务2的两倍,任务4的周期是任务3的两倍。
分析概要报告。如果需要,创建并修改您的模型或任务映射,并重新生成概要报告。
在命令行生成概要报告。或者,您可以为在命令行上为并发执行而配置的模型生成概要报告。使用Simulink.architecture.profile
函数。
例如,为模型创建概要报告slexMulticoreSolverExample
:
openExample(“slexMulticoreSolverExample”);Simulink.architecture.profile(“slexMulticoreSolverExample”);
为模型创建具有特定数量的样本(100)的概要报告slexMulticoreSolverExample
:
Simulink.architecture.profile (slexMulticoreSolverExample, 120);
该函数创建一个名为slexMulticoreSolverExample_ProfileReport.html
在您的当前文件夹中。
自定义生成的C代码
生成的代码适用于许多不同的应用程序和开发环境。为了满足您的需要,您可以自定义生成的C代码,如代码和工具定制(嵌入式编码).除了这些自定义功能,对于多核和异构目标,您可以进一步自定义生成的代码如下:
您可以使用代码替换库注册互斥和数据同步原语的首选实现。
您可以定义自定义目标体系结构文件,该文件允许您在“并发执行”对话框中为任务和触发器指定目标特定属性。有关更多信息,请参见定义一个自定义体系结构文件.