OpenACC 高性能并行编程:概念与策略 (6):OpenACC 概述 1.2&1.2.1

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

OpenACC高性能并行编程:概念与策略(6):OpenACC概述 1.2&1.2.1

(计算构件)

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

因为计算构件在并行线程中分配工作,以此获得更好的性能并缩短程序执行时间,所以每个 OpenACC 程序的“面包”和“黄油”是计算构件。OpenACC 在线程上分发循环,目的是为一个线程分发一个循环迭代。为了做到这一点,划分了两个通用的分发导语:kernels 和 parallel。两者都可以使用 loop 导语进行扩充,以便把某些类型的工作分发标记为独立的循环,或为这些循环分配附加的子语。

(kernels)

kernels 导语是 OpenACC 提供的两个计算构件中的第一个。这两个构件都用于将代码卸载到计算设备。然而,这两个导语的理念是不同的。kernels 构件仅仅作为一个警讯(sentinel)来告诉编译器,如果可能的话,这个代码区域应该放置在加速器上。但是,当 kernels 构件中出现循环时,事情会变得很有趣。

OpenACC高性能并行编程:概念与策略(6):OpenACC概述 1.2&1.2.1

由于 kernels 构件让编译器去执行繁重的代码并行化工作,因此对编译器的期望是:要么顺序执行代码,要么为了利用并行性将循环嵌套并行化。无论编译器怎样选择,都必须确保正确的、顺序一致的计算结果。

可以使用几个子语来修改 kernels 构件,但是因为 kernels 构件旨在成为一个编译器驱动的机制,所以我们在下一节中讨论这些子语。然而,有一种情况值得研究:kernels 构件中的多重嵌套循环。

OpenACC高性能并行编程:概念与策略(6):OpenACC概述 1.2&1.2.1

在这段代码中,编译器可以自由选择做至少两件事情。第一件事情,它可以决定将两个循环嵌套融合成一个循环嵌套:

OpenACC高性能并行编程:概念与策略(6):OpenACC概述 1.2&1.2.1

这种融合可能允许更高效地利用可用资源,因为它不会带来启动两个 kernel 的开销。

第二件事情是,编译器可以选择生成两个 kernel,这两个 kernel 可以编码为两个 parallel 区域。

OpenACC高性能并行编程:概念与策略(6):OpenACC概述 1.2&1.2.1

OpenACC高性能并行编程:概念与策略(6):OpenACC概述 1.2&1.2.1

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

评论

发布