MathWorks信号处理系统设计往往涉及复杂的算法或者数据密集型应用,因此通常具有较高的计算复杂度。构建和仿真这些复杂系统可能相当耗时。Simulink 中的数据流执行域功能是减少模型仿真时间的方法之一。该功能可以对 Simulink 模型自动分区,然后使用主机上闲置的 CPU 内核并行执行各分区,从而加速仿真。本文说明如何通过三个简单步骤来设置数据流。然后,我们用无线电模型作为示例来演示数据流的实际运用,并比较启用和未启用数据流的模型仿真时间。此示例中使用的模型可以直接点击文末“阅读原文”下载。
数据流使用的并行机制类型
为进行模型分区和并行执行,数据流会采用以下数据和任务并行机制组合之一(图 1):
显式并行机制通过不同算法处理不同数据集。
展开并行机制通过同一算法处理一个数据流的连续帧。
管道并行机制通过不同算法处理同一数据的不同部分。
设置数据流
要在 Simulink 模型中启用数据流执行域,首先要实现子系统。实现方式取决于您的具体设计进度。如果您的设计刚刚开始,请使用 DSP System Toolbox 中的 Dataflow Subsystem 模块(图 2)。该模块经过预配置,可以直接使用。您只需将它拖到 Simulink 模型中,然后在其中填充算法组件。 如果您的设计模型已构建完毕,请将表示要并行化的算法的模块放在子系统中,并按如下方式设置数据流:
选择您刚刚创建的子系统。
在属性检查器的“执行”选项卡下,勾选设置执行域复选框。
将域选项设置为数据流。
在子系统内部,左下角的 》 图标表示子系统设置为数据流执行域。数据流执行域首先通过在单线程上运行模型来分析模型,然后自动进行子系统分区以用于多线程执行。
数据流的实际运用
该示例模型对无线电发射机和接收机进行仿真。它包含数字上变频器和下变频器来调整信号频率,并实现调制器和解调器(图 3)。输入是以 8 kHz 采样的录制语音。输出是两个频谱分析仪和一个音频接收端。
首先,我们测量在不启用数据流的情况下仿真该模型所需的时间1。我们可以注释掉输出模块,以便专注于仿真算法,而不受运行示波器和音频输出所需的固定时长的限制。(1. 所有仿真都在 Windows 桌面计算机上运行,该计算机采用 Intel Xeon CPU W-2133 @ 3.6 GHz 6 核 12 线程处理器。)我们使用 tic-toc 命令测量仿真时间:
modelname = ‘mono_radiomodel’;
tic;
simData = sim(modelname);
t = toc
运行该模型的执行时间为 3.67 秒。现在我们引入数据流。我们将表示算法的模块放入子系统中,并将域设置为数据流(图 4)。
助手建议的更改之一是添加延迟。当数据流发现并行机制可能增大吞吐量时,通常会向模型添加延迟。沿信号线添加的延迟用 z-n 标签表示。我们接受更改,并将启用了数据流的模型保存为 mono_radiomodel_dataflow。然后,我们使用与之前相同的 tic-toc 命令来测量新子系统的执行时间。
modelname = ‘mono_radiomodel_dataflow’;
tic;
simData2 = sim(modelname);
t_Dataflow = toc
启用数据流后的执行时间为 2.5 秒,比正常的单线程执行速度快 1.7 倍。加速得益于编译器优化、模型设置更改和数据流添加的延迟。然而,该模型仅在单线程上执行,加速并不显著。这是因为大部分计算负载都集中在上下变频器模块中。当计算负载分散在整个模型中时,数据流效果最佳,因为这为创建并行线程提供了更多机会。在下一节中,我们将扩展模型,展示数据流的实现如何进一步提高仿真性能。
处理大型模型
我们通过引入多通道音频输入信号来增大模型的计算复杂度。这会使需要处理的数据量倍增,也为数据流提供了更多优化仿真性能的机会。图 6 显示经过修改、采用立体声音频输入的模型,运行时间为 18.6 秒。通过启用信号维度信息叠加,我们可以看到信号输入确实有两个音频通道。
在启用数据流并重新运行模型后,我们观察到模型在 5 个并发线程上运行,执行时间为 4.5 秒,几乎实现了 4 倍加速(图 7)。
使用数据流的多线程代码生成数据流支持使用 Simulink Coder 和 Embedded Coder 的单核和多核 C/C++ 代码生成。首先在 Simulink 模型的“求解器”窗格中启用允许任务在目标上并发执行参数,然后使用 Ctrl + B 生成代码。为桌面目标生成的代码通过 OpenMP 实现多线程化。为 Embedded Coder 目标生成的代码通过 POSIX 实现多线程化。图 8 显示基于以上无线电模型生成的 OpenMP C 代码,包括由数据流创建的并发任务。
数据流的限制
虽然数据流有助于加速大多数仿真,但它对有些模型可能并不适用,例如较小的模型、不太复杂的模型,或者计算负载集中在少数几个模块中的模型。在这些情况下,数据流实现的速度提升不会抵消在并行线程上同步和执行模型所需的开销。如无线电模型示例所示,当计算负载在模型中均匀分布时,数据流效果最佳,因为均匀分布的负载意味着有更多机会进行模型分区和并行执行。就建模限制而言,从版本 2020b 开始,数据流不支持连续模块、可变大小信号或虚拟 Simulink 总线的多线程仿真。
小结
通过数据流执行域,您可以在 Simulink 模型中识别可以分布到多个线程中并行执行的建模模式。这种方法可利用主机 CPU 上闲置的处理能力,优化吞吐量,并减少模型仿真时间。数据流执行域最适合计算负载分散在整个模型中的情形(此时可引入并行机制),并且只能处理离散信号。
责任编辑:haq
全部0条评论
快来发表一下你的评论吧 !