OpenACC 高性能并行编程:概念与策略 (17):循环级并行性 2.2

阅读数:1 2020 年 1 月 5 日 18:31

OpenACC高性能并行编程:概念与策略(17):循环级并行性 2.2

(并行性的三个级别)

内容简介
本书是介绍大规模并行编程 OpenACC 的综合实践性书籍之一。书中前 3 章介绍了 OpenACC 背后的概念和 OpenACC 开发工具;第 4 章至第 7 章带你了解第 1 个真实世界的 OpenACC 程序,并揭示 OpenACC 程序编译背后的魔力,从而引入更多概念;第 8 章至第 10 章涵盖高级主题,例如 OpenACC 的替代方案、底层设备交互、多设备编程和任务并行性;第 11 章和第 12 章探讨了 OpenACC 实现潜在新语言特性的各种研究领域。

由于并行硬件有很多能够处理并行性的设计:跨处理器(processor)、核(core)、线程(thread)、超线程(hyperthread)、向量单元(vector unit)等,所以 OpenACC 提供了一个功能,用于指定如何在不同硬件单元之间划分工作。这个功能是在 gang、worker 和 vector 中实现的。

这些子语可应用于 loop 导语,对如何将循环和循环迭代分配到目标处理器或加速器上的硬件组件这一过程产生影响。因为循环迭代之间可用的同步类型取决于执行迭代的硬件,所以这可能会影响应用程序的性能和功能。

我们将在本节中讨论这些子语。但请注意它们实际转化成什么,取决于所使用的编译器和应用程序运行时所使用的硬件。OpenACC 程序运行的大多数硬件至少支持并行性的两个级别:跨核和跨向量单元,但是有些硬件可能支持更多或更少的级别。但不论怎样,你都可以做一些一般的假设:gang 是最粗粒度的,映射到分配给不同 worker 的 gang 的工作块,以便独立执行;worker 定义如何在 gang 内部分配工作;vector 映射到硬件的指令级并行(比如,vector 操作)。

通过使用 gang、worker 和 vector,程序员可以将不同硬件的复杂结构进行抽象,从而在程序功能和运行的硬件之间提供一个通用级别的映射。尽管如此,它可以更详细地说明如何精确地将循环映射到硬件,例如指定 vector 长度以及指定要使用的 worker 或 gang 的数量。这种结构可以为特定的硬件提供性能优化,尽管这是以牺牲应用程序在移植时的性能为代价的。这通常被称为对其他硬件的性能可移植性(performance portability)。

最后,请注意 OpenACC 不要求程序员指定程序功能与并行硬件之间的映射。如果你不在 loop 导语中指定 gang、worker 或 vector 子语,编译器将根据它所知道的编译代码和正在使用的硬件来尝试映射。

OpenACC高性能并行编程:概念与策略(17):循环级并行性 2.2

购书地址 https://item.jd.com/12596484.html?dist=jd

评论

发布