多核仿真和数据流域的代码生成

数据流域仿真

数据流域仿真利用主机的多核CPU架构。它会自动分区模型,并使用多线程模拟子系统。

您的模拟数据流领域的第一次,模拟是单线程的。在这个模拟的软件进行成本分析。下一次模型编译,软件会自动分割为多线程执行系统。随后的模拟是多线程的。

数据流域的代码生成

数据流域的支持代码生成单核心和多核万博1manbetx心目标。当数据流子系统支持多线程内的所有块,并且模型被配置用于多核代码生成,生成的代码是多线程。万博1manbetx在代码生成期间,所述数据流子系统被根据指定的目标硬件自动分配。

并行的类型

在仿真和代码生成的模型与数据流域,在您的系统软件识别可能的并发性,和分区使用以下类型的并行数据流域。

任务并行

任务并行通过拆分实现了并行的应用程序分解成多个任务。任务并行涉及到多个处理节点的应用程序内分配任务。有些任务可以对其他数据的依赖性,因此所有的任务不会在完全相同的时间运行。

考虑到涉及四个功能的系统。功能素F2α()和F2B()是平行的,即,它们可以同时运行。在任务并行,您可以将您的计算分成两个任务。功能F2B()单独的处理节点上运行,它从任务1获取数据输出1之后,并且在任务1的输出反馈至F3()。

图中示出了用于此并行的时序图。任务2不运行,直到它得到的数据输出1从任务1.因此,这些任务并不完全并行运行。每个处理器周期所花费的时间,被称为周期时间,则

T = TF1 + MAX(tF2a,tF2b)+ TF3。

型号流水线执行(流水)

该软件使用模型管道执行,或流水线,以解决那里的线程不会完全并行运行任务并行的问题。这种方法涉及到修改系统引进任务之间的延迟那里是一个数据的依赖。

在该图中,该系统被分成三个任务来在三个不同的处理节点上运行,与功能之间引入的延迟。在每个时间段,每个任务需要从被延迟的方式上一时间步长值。

每个任务可以在同一时间开始处理,因为这时序图所示。这些任务是真正平行并且它们不再串联在一个处理器周期彼此依赖。周期时间没有任何增加,但所有任务的最大处理时间。

T = MAX(任务1,任务2,任务3)= MAX(TF1,tF2a,tF2b,TF3)。

流水线时,可以使用,你可以在你的并发执行系统人为地引入延迟。开销产生的,由于本次的介绍不能超过流水线节省的时间。

展开

当成本分析中的系统在计算上是占主导地位的识别单个块,该系统的用途展开技术。展开是通过并行提高吞吐量的技术。该软件复制的计算密集型块的功能,划分每片上的数据的输入数据分成多个块,并且所述处理器执行相同的操作。

展开在场景中,能够处理每个块的输入数据的独立地不影响输出使用,并且该块是无状态的,或包含状态的有限数。

提高仿真吞吐量与多核仿真

这个例子展示了如何通过模拟多线程子系统提高仿真系统的吞吐量。要启用的系统和多线程仿真的自动分区,设置该子系统的数据流。有关数据流域的详细信息,请参阅数据流域

  1. 首先,打开模型。

    让addpath(完整文件(文档根, '工具箱', 'DSP', '实施例'));ex_staple_counting
  2. 模拟模型和观察系统中的帧速率帧速率显示块。此数字表示每秒帧数的数的Simulink万博1manbetx®能够在一个标准的模拟处理。

  3. 要启用多线程模拟和提高仿真吞吐量,设置子系统数据流的领域。

    如果属性检查器是不可见的,在造型选项卡,在设计, 选择属性检查器

    与子系统选择,在执行属性检查器的选项卡中,选择设置执行域。设置数据流

  4. 有时候,你可以通过添加增加可用的并发系统潜伏到系统中。为了选择最佳的延迟值,使用数据流仿真助理。点击数据流助理按钮,打开数据流仿真助理。

  5. 除了提出的延时值,该数据流仿真助理还提出了优化仿真性能模式的设置。在这个例子中,以提高仿真性能,数据流仿真助手建议禁用确保响应参数。

    接受建议的模型设置,旁边仿真性能建议的模式设置,点击接受所有的

  6. 接下来,单击分析按钮。该数据流仿真助手分析的仿真性能的子系统,并提出您的数据流子系统的最佳延迟。

    数据流分析是一个两步骤的过程。在第一步骤期间,数据流子系统模拟使用单螺纹。在这个模拟的软件进行成本分析。下一次模型编译,软件会自动将分割成子系统的一个或多个线程,以充分利用并发模型。随后的模拟是多线程的。助理表明,优化了系统的吞吐量的延迟值。

  7. 点击接受按钮,将建议延迟应用到系统。该数据流仿真助理应用延迟到模型,并指示线程模型将在随后的模拟使用的数量。在系统的等待时间指示用在子系统的输出处的模型画布上的延迟图标。

  8. 再次模拟模型。从多线程模拟观察改进模拟吞吐量帧速率显示块。

从数据流子系统生成多核代码

配置您的多核代码生成模式

代码生成需要万博1manbetxSimulink的编码器™或嵌入式编码®执照。单核和多核目标的支持。万博1manbetx

对于单核目标生成代码生成非虚拟子系统代码。

要生成多核代码,您必须配置并发执行模型。如果不配置并发执行模型,生成的代码将是单线程的。

  1. 配置参数>求解>求解器选择选择固定步长为了类型自动(自动解算器选择)为了求解

  2. 选择允许任务目标并发执行复选框中求解窗格下求解细节。选中此复选框是可选的在模型层次参考模型。当您选择此选项的参考模型,Simulink的允许参考模型的每个利率执行为目标处理器上的独立的并行任务。万博1manbetx

  3. 配置参数>代码生成>接口>高级参数,清除MAT-文件记录复选框。

  4. 请点击应用将设置应用到模型。

生成多核代码

要生成多核代码,该软件进行成本分析和分区根据您指定的目标数据流域。数据流域的划分可能会或可能不会在模拟过程中匹配的分区。

生成的C代码包含一个无效(无效)功能由数据流子系统创建的每个任务或线程。这些函数包括:

  • 对应于该块中的C代码被划分成该线程

  • 其被生成以处理线程之间是如何传送数据的码。

    这可以是在流水线延迟或特定目标的实现的数据同步信号量的形式。

以下多核目标是支持代码生成。万博1manbetx

  • Linux的®时,Windows®苹果系统使用桌面目标ert.tlcgrt.tlc

  • 万博1manbetxSimulink的实时™运用slrt.tlc

  • 使用Linux和VxWorks嵌入式编码器的目标®操作系统。

代码生成grt.tlcert.tlc桌面目标是数据流子系统中使用OpenMP多线程的。嵌入式编码器生成的目标代码是使用POSIX线程的多线程。

如果您的系统包含不支持多线程执行模块,生成的代码是单线程的。万博1manbetx

建立模型并生成代码,按按Ctrl + B

在生成的代码,你可以观察到线程API,并已插入到该模型来创造更多的并发的流水线延迟调用。

以下实施例显示,存在由数据流子系统产生的两个线程的功能,ex_staple_counting_ThreadFcn0ex_staple_counting_ThreadFcn1,这是使用OpenMP部分执行。这些功能的一部分dataflow_subsystem_output /步骤()功能。

静态无效ex_staple_counting_ThreadFcn0(无效){...如果(pipeStage_Concurrent0> = 2){/ *延迟: ' / TmpDelayBufferAtDraw Markers1Inport1' * / memcpy的(&ex_staple_counting_B.TmpDelayBufferAtDrawMarkers1I_i [0],&ex_staple_counting_DW.TmpDelayBufferAtDrawMarkers1I_i [0],202176U *的sizeof(real32_T));/ *延迟: ' / TmpDelayBufferAtDraw Markers1Inport2' * / line_idx_1 =(int32_T)ex_staple_counting_DW.CircBufIdx * 100;的memcpy(&ex_staple_counting_B.TmpDelayBufferAtDrawMarkers1Inp [0],&ex_staple_counting_DW.TmpDelayBufferAtDrawMarkers1Inp [line_idx_1],100U *的sizeof(real_T));...}
空隙ex_staple_counting_Concurrent0(无效){...的#pragma OMP平行NUM_THREADS(3){的#pragma OMP部分{的#pragma OMP部分{ex_staple_counting_ThreadFcn0();}的#pragma OMP部分{ex_staple_counting_ThreadFcn1();}的#pragma OMP部分{ex_staple_counting_ThreadFcn2();}}}

也可以看看

相关话题