使用 Simulink 进行多核编程
利用 Simulink® 中的分区、映射和探查过程,可以解决设计并发执行系统时的常见难题。
分区操作允许您将模型的各区域指定为各项任务,而不考虑嵌入式多核处理硬件的细节。这种独立性使您可以按照最符合您的应用需要的方式排列模型的内容和层次结构。
在分区后的系统中,可以通过映射操作将各个分区指定给嵌入式处理系统中的处理元件。使用 Simulink 映射工具可以表示和管理执行线程、FPGA 上的 HDL 代码以及这些线程或 FPGA 执行的工作的细节。当您创建模型时,不需要跟踪各个分区或它们之间的数据传输,因为映射工具会为您完成这些工作。而且,您的模型还可以在多个架构中重用。
探查是指在典型计算负载下对应用的部署进行仿真。它使您可在将模型部署到硬件之前确定哪种模型分区和映射能够获得最佳性能。
基本工作流
将模型部署到目标上。
设置模型以实现并发执行。
有关为并发执行配置模型的详细信息,请参阅Configure Your Model for Concurrent Execution。使用这些设置时,Simulink 基于根级模块的采样时间对模型进行分区,模型中的每个采样时间对应一个分区,且速率或采样时间相同的所有模块属于同一个分区。
如果要指定如何对模型进行分区,请使用显式分区。使用显式分区时,您必须指定目标架构,然后显式分区模型。有关详细信息,请参阅Specify a Target Architecture和Partition Your Model Using Explicit Partitioning。
生成代码并将其部署到目标上。您可以选择部署到多个目标上。
要编译代码并部署到桌面目标上,请参阅Build on Desktop。
要使用 Embedded Coder® 部署到嵌入式目标上,请参阅Deploy Generated Software (Embedded Coder)。
要使用 Simulink Real-Time™ 编译代码并部署到实时目标上,请参阅Standalone Operation (Simulink Real-Time)。
要使用 HDL Coder™ 部署到 FPGA 上,请参阅Deployment (HDL Coder)。
注意
只有显式分区的模型才支持部署在 FPGA 上。
优化设计。此步骤为可选操作,其中包括根据您的指标对您的模型设计进行迭代和映射以获得最佳性能。评估模型的方法是对模型进行探查并获得执行时间。
产品 信息 桌面目标 Profile and Evaluate Explicitly Partitioned Models on a Desktop Simulink Real-Time Execution Profiling for Real-Time Applications (Simulink Real-Time) Embedded Coder 代码执行探查 (Embedded Coder) HDL Coder Speed and Area Optimization (HDL Coder)
Simulink 如何帮助您解决多核编程的难题
人工编写应用程序以实现并发执行面临的难题远远多于人工编码时常遇到的挑战。使用 Simulink,您可以解决跨多个架构的可移植性、架构的部署效率,以及应用程序组件之间的循环数据依存关系等难题。有关这些问题的详细信息,请参阅Challenges in Multicore Programming。
可移植性
利用 Simulink,您可以在不考虑目标系统的情况下,确定所建模系统的内容和层次结构需要。创建模型内容时,您不需要时刻记得目标系统上有几个内核。相反,您只需选择能够为您创建模型内容的分区方法即可。Simulink 会为您指定的架构生成代码。
您可以从支持的可用架构中进行选择,也可以添加自定义架构。当您更改架构时,Simulink 只生成需要为新架构更改的代码。新架构可以重用原来的模块和函数。有关详细信息,请参阅Supported Targets For Multicore Programming和Specify a Target Architecture。
部署效率
为了提高部署的应用程序的性能,Simulink 允许您在典型计算负载下对应用程序进行仿真,并尝试多种分区配置和映射。Simulink 通过比较各种配置的性能,为您提供最佳部署配置。此过程称为探查。探查过程可帮助您在将系统部署到所需硬件之前确定最佳分区配置。
您可以为应用程序创建映射,Simulink 将按照您的设置将应用程序组件映射到不同的处理节点。您还可以手动将组件分配给处理节点。对于任何映射,您都可以看到组件之间的数据依存关系,并相应地进行重新映射。您还可以在不同的组件之间建立和删除数据依存关系。
循环数据依存关系
系统中的某些任务依赖于其他任务的输出。任务之间的数据依存关系决定它们的处理顺序。一个循环中包含数据依存关系的两个或多个分区构成一个数据依存关系环,也称为代数环。Simulink 不允许在可能并行的分区之间发生代数环,因为使用并行算法解算代数环的成本非常高。
在某些情况下,代数环是人为的。例如,您可能会因为基于 Model 模块的分区而产生人为代数环。对于涉及 Model 模块的代数环,如果取消使用 Model 分区会使代数环消失,则说明它是人为代数环。您可以将人为代数环的发生率降到最低。在“配置参数”对话框中,为代数环中涉及的模型选择模型引用 > 尽量减少代数环。
此外,如果在“配置参数”对话框中针对一般实时目标 (grt.tlc
) 或嵌入式实时目标 (ert.tlc
) 配置了模型,可以清除单一输出/更新函数复选框。
如果代数环是真实的代数条件,您必须将代数环中的所有模块包含在一个 Model 分区中,或者通过在代数环中引入延迟元素来消除代数环。
以下示例说明如何在 Simulink 中实现不同类型的并行机制。这些示例中包含的模型已分区并映射到具有一个 CPU 和一个 FPGA 的简单架构。
相关示例
- Implement Data Parallelism in Simulink
- Implement Task Parallelism in Simulink
- Implement Pipelining in Simulink