多核编程指南(三)---确定并行任务实现

识别应用程序中的任务并行性是一个挑战,即使在识别并行任务之后,跨多核系统映射和调度任务也需要仔细规划

根据多核架构的软件分解,提出了一个四步流程,用于指导应用程序的设计:

  1. 分区-设计分区旨在为并行执行提供机会。重点是定义大量的小任务,以便对问题进行细粒度分解
  2. 通信-分区生成的任务旨在并发执行,但通常不能独立执行。在一个任务中执行的计算通常需要与另一个任务关联的数据。然后,必须在任务之间传输数据,以便继续计算。此信息流在设计的通信阶段指定
  3. 组合:审查分区和通信阶段的决策,以确定将在多核架构上高效执行的分组
  4. 映射:此阶段包括确定每个任务的执行位置

分区

将应用程序划分为基本组件需要对每个软件组件中的计算(读、写、执行、乘法)进行复杂性分析,并对每个组件的耦合和内聚进行分析

一个组件的耦合性表征了它与其他子系统的相互依赖性。对子系统内部依赖于子系统外部功能或全局数据的功能数量进行分析,确定对其他系统的依赖程度

子系统的内聚性和责任的不同程度是其内部依赖性的特征。他表示子系统的所有内部功能协同工作的情况。如果单个算法必须使用子系统中的每个函数,则内聚性较低。具有高内聚性的子系统往往是非常模块化的,更容易支持分区

将应用程序划分为模块或子系统需要找到耦合度低而内聚度高的断点。如果一个模块有太多的外部依赖项,那么它应该与另一个模块分组,这样可以减少耦合并增加内聚。还需要考虑模块的总体吞吐量要求,以确保其适合单个核心

通信

在划分阶段确定软件模块后,有必要测量它们之间的控制数据通信需求。控制流程图可以识别独立的控制路径,帮助确定系统中的并发任务。数据流图有助于确定对象和数据同步需求。

控制流程图表示模块之间的执行路径。处理序列中不再同一内核上的模块必须依靠消息传递来同步其执行,并且可能需要数据传输。这两种操作都会引入延迟。应使用控制流程图创建有助于模块分组决策以最大化总体吞吐量的指标。下图是一个控制流程图:
在这里插入图片描述
数据流图确定了模块之间必须传递的数据,可用于创建数据传递量和速率的度量。数据流图还显示了模块与外部实体之间的交互级别。应创建指标、以帮助模块分组,从而最大限度地减少核心之间通信的数据量。下图是一个示例图:
在这里插入图片描述

组合

组合阶段确定组合分区阶段标识的任务是否有用,以便提供数量较少、每个任务大小较大的任务。组合还包括确定赋值数据或计算是否值得。具有低计算要求和高耦合性的相关模块被分组在一起。具有高计算和高通信成本的模块被分解为具有较低单独成本的较小模块。

映射

映射是将模块、任务或子系统分配给单个核心的过程。利用分区、通信和组合的结果,制定了一个计划,确定并发问题和模块耦合。这也是考虑可用的硬件加速器和任何依赖于软件模块的依赖性时间

**子系统根据所选的编程模型(主/从或数据流)分配到不同的核心上。**为了允许处理器间通信延迟和参数缩放,在映射的第一次迭代中保留一些可用的MIPS、L2内存和通信带宽是非常重要的。在映射所有模块之后,可以评估每个核心的总体负载,以指示需要进行额外重构的区域,从而平衡各个核心之间的处理负载

除了每个模块的吞吐量要求外,还必须将消息传递延迟和处理同步考虑到整个时间线中。关键的延迟问题可以通过调整模块分解来解决,以减少通信步骤的总数。当多个内核需要共享一个资源时,将使用硬件信号量来确保互斥。

当一个特定的算法或关键的处理循环需要比单个核心上可用的更多吞吐量时,将数据并行性视为分裂处理需求的一种可能方式。由于数据的位置和组织以及所需的信号处理,按可用核数对数据进行暴力分割并不总是最佳分割。仔细评估核心之间必须共享的数据量,以确定最佳分割以及复值部分数据的任何需要。

跨多个内核共享加速器需要通过锁进行互斥,以确保正确的行为

作为分区过程的一部分,必须考虑可伸缩性

识别和修改基于OpenMP的并行化代码

OpenMP为并行化提供了一些非常有用的API,同时也需要开发人员确定并行化策略,然后利用相关的OpenMP API。

决定并行化哪些代码段取决于应用程序代码和用例。“omp parallel"结构基本上可用于跨内核并行化任何冗余功能。如果序列代码包含具有大量迭代的"for"循环,程序员可以利用"omp for” OpenMP construct将"for"循环迭代拆分为多个核心

**另一个问题是应用程序是否依赖于基于数据或基于任务的分区。**例如,将图像分割为8个片,基于每个核心接收一个输入片并在该片上运行相同的算法集,这是基于数据分区的一个示例,可能适用于"omp parallel"和"omp for" constructs。相反,如果每个核心运行不同的算法,程序员可以利用"omp sections" construct在核心之间分割独特的任务

参考文献:

  1. 《Multicore Programming Guide》

猜你喜欢

转载自blog.csdn.net/Xiao_Jie123/article/details/119327003