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

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

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

(kernels 循环与 parallel 循环的比较)

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

在讨论 OpenACC 中可用的循环级并行性的细节之前,值得花一些时间来探讨一下两种主要类型的 OpenACC 导语之间的差异。你可以使用这两种不同的导语,将实际的代码示例循环并行化(kernels 和 parallel)。

正如第 1 章所述,这两种导语都被用于在并行硬件上分发一个或多个循环,但每种导语都以略微不同的方式实现并行化。kernels 导语指定了编译器应该分析的代码区域,并决定并行化的内容以及如何将其分发给计算机硬件。另一方面,parallel 导语规定了 parallel 区域中哪些代码可以安全地被并行化,并在所用硬件的所有可用线程上,运行该 parallel 区域内的所有代码。

例如,使用 kernels 导语将本章中列出的循环并行化,对于 C 语言,它看起来应该如下:

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

对于 Fortran 语言如下:

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

如果要使用 parallel 导语对同一代码进行并行化,对于 C 语言,它看起来应该如下:

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

对于 Fortran 语言如下:

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

但是请记住,如果只是单独使用 parallel 导语,相对来说是不起作用的。上述代码在单独使用 parallel 导语进行并行化时,实际上不会实现任何工作拆分或共享。相反,它只会在多个线程上同时运行相同的代码,因此它既不会加快代码速度,也无法产生正确的结果。

在使用 parallel 导语时,为了实现正确且高效的并行化,必须将其与一个或多个 loop 导语组合,以指定应用工作共享的位置。因此在 C 语言中,这个例子应该如下所示进行并行化:

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

在 Fortran 语言中:

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

kernels 和 parallel 都支持多个循环嵌套,但是它们处理这些循环的方式不同。如果 kernel 区域内有多个循环,每个循环(由编译器来决定该循环可以并行化)将使用一个单独的 kernel 来依次执行。相反,如果在一个 parallel 区域内存在多个循环,则这些循环可以同时运行。或者至少不能保证,在第一个循环结束后才开始第二个循环。我们看一下在 Fortran 语言中的例子:

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

在 C 语言中:

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

因为第二个循环可以在第一个循环结束之前开始执行,所以这些代码能否保证正确性,取决于编译器如何将循环映射到硬件上。相反,如果使用了 kernels,那么将会生成绝对正确的代码。

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

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

评论

发布