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

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

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

(seq 与 auto 子语)

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

有时一个循环可能看起来是并行的,但是由于包含了一些数据依赖(data dependency)或计算(calculation),编译器不认识这些数据依赖或计算,因此会限制其并行性。在这些情况下,当使用 kernels 导语时,编译器可能会在不应该并行化循环时错误地将循环并行化。

此外,parallel 导语指示编译器把包含在 parallel 区域中的所有代码并行化,而不管这样做是否正确。

当要通过 OpenACC 导语并行化嵌套循环时,循环嵌套中的可用循环数目可能比预定目标中的并行性数目更多(即你要将超过三个循环映射到 gang、worker 或 vector)。在这种情况下,通常可以折叠循环以减少要分配给硬件的循环。但是在某些情况下,循环折叠是不可能的(例如,没有完全嵌套的循环)。

因此,OpenACC 提供了 seq 子语。你可以在循环中通过添加 seq 子语来阻止编译器将循环并行化或向量化,或者在循环嵌套中控制并行发生的位置。你可以将 seq 子语添加到任何一个 loop 导语中,但是 seq 子语和 gang、worker、vector 子语互斥(因为它们指定并行性,seq 禁用并行性)。这里有一个例子:

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

另一方面,你可以使用 auto 子语,指导编译器定义循环应该映射到的各种并行性级别。当 kernel 区域没有应用并行子语(worker、vector、gang 或 seq)时,此 kernel 区域内的循环自动应用 auto 子语。

但是,请注意,auto 不会提示编译器循环是独立的。因此,auto 可能需要与 independent 子语相结合,以处理编译器难以自动并行化的那些循环。

你也可以使用 auto 子语,来启用编译器检查并行区域内的循环。如前所述,默认情况下,这些循环被认为是独立的和可并行的。

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

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

评论

发布