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

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

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

(gang、worker 与 vector 子语)

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

最好把 gang 看作由一个或者多个 worker 构成的群。不同的群可以独立工作,可能是同时工作,也可能不同时工作。同一个 gang 中的 worker 之间可以进行同步,但不允许不同的 gang 之间进行同步。这里说的同步是指:暂停并等待所有 worker(或 worker 的一个子集)处于代码的同一个位置,或者保护某个共享变量的更新,该变量在 gang 内的 worker 之间共享。

worker 是 gang 中的线程,允许用户或开发者说明如何将线程映射到正在使用的硬件上。因此它们是线程组(gang)和 vector(它说明了如何将指令映射到只有单个线程可用的硬件上)上实现的低级并行性之间的中间层。

vector 并行性具有最精细的颗粒度。单个指令对多个数据进行操作,这很像现代 CPU 上的单指令、多数据(或 SIMD)并行,或者 NVIDA GPU 上的线程束(warp)。这些操作是参考 vector 长度来执行的,vector 长度规定了给定指令将对多少个数据单元进行操作。

通常来说,一个 gang 由一个或者多个 worker 组成,每个 worker 在一定长度的 vector 上操作。在 gang 内,OpenACC 模型提供了一个缓存内存,该缓存内存可由同一个 gang 中所有的 worker 和 vector 使用,并允许在 gang 内同步。但这并非是一个程序员可指定的特性(即程序员无法通过添加子语或导语来手动控制该同步)。

并行性布局的三个级别能够映射到当前所有的硬件平台,如表 2.1 所示。

表 2.1 gang、worker 和 vector 与各种硬件平台的潜在映射

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

注:实际使用的映射取决于编译器及其运行时的环境,此表不能保证与 OpenACC 的真实实现一致。程序员只能通过指定要使用的每个元素的数量来影响编译器。

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

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

评论

发布