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

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

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

(将并行性映射到硬件)

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

如前所述,即使不使用子语指定到硬件的映射,也能够编写出正确的 OpenACC 程序。因此,在你开发或移植的程序已经被验证并且你已经准备好开始优化它们之前,最好不要将映射包括在内,这是一个良好的实践经验。

在这一点上,了解你的目标硬件、算法或应用程序至关重要。如果你知道循环的大小(或者至少大致知道它们的大小范围)以及循环迭代之间需要的同步,那么你应该能够明智地做出选择:知道需要在哪些循环上使用什么样的硬件映射导语。

对于 NVIDIA GPU 硬件,gang 很可能映射到线程块,worker 映射到线程束,vector 映射到线程。或者,你可以简单地使用一个 gang 映射到线程块,使用 worker 映射到这些线程块中的线程。同样,parallel 或 kernel 区域中的不同循环可以映射到不同的线程块。

在多核(multicore)或众核(manycore)处理器上,可以想象成将 gang 映射到处理器或处理器的 NUMA 区域(NUMA region)1。将 worker 映射到处理器上的核或者超线程(hyperthread),将 vector 映射到核中的向量单元(vector unit)。或者,也可以想象成将 gang 和 worker 映射到核,将 vector 映射到向量单元,以及在将 OpenACC 导语映射到硬件时忽略节点的 NUMA 特性。

1 NUMA 代表非一致性内存访问(non-uniform memory access)。如果一个节点中有多个处理器,它们很可能都可以访问节点的内存。但是访问处理器自身的内存,比访问连接到节点中另一个处理器的内存更快。每个处理器都将是 NUMA 区域:一个本地内存访问比远程内存访问快的区域。

对于 parallel 和 kernels 区域,除了在单个循环上手动指定这些映射子语(mapping clause)之外,还可以指定在更高级别(即 parallel 或 kernels 导语本身)使用的 gang、worker 的数量和向量化的大小。这些由子语 num_gangs()、num_workers() 和 vector_length() 来完成。

这些子语通过采用整数值(integer value),分别指定区域中每个 kernel 或 gang 循环使用的 gang 的数量,每个 gang 中 worker 的数量以及 vector 操作中使用的 vector 长度。请注意,这些是可选子语,需要的时候可以任意组合。下面是一个例子:

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

如果你指定的值不被支持或者无法在所用硬件上实现,则在实际的实现中,将会使用比这些子语指定值更小的值。

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

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

评论

发布