OpenACC 高性能并行编程:概念与策略 (9):OpenACC 概述 1.2.4

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

OpenACC高性能并行编程:概念与策略(9):OpenACC概述 1.2.4

(routine)

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

在本节中,除了一种例外情况,函数或子例程(subroutine)仅出现在计算构件之外。这是故意设计的,因为在计算构件中的调用比仅调用一个简单函数更复杂。由于函数可以在具有任意并行的计算构件中被调用,因此必须针对这种情况进行编译。这样,我们使用 routine 导语将函数标记为可能的并行。

routine 导语用于两个地方:过程定义和过程声明。

OpenACC高性能并行编程:概念与策略(9):OpenACC概述 1.2.4

此代码示例显示了可以使用 routine 导语修改函数 foo 的三种方式。第一种用法是将导语放在该函数的声明上,并告诉编译器在计算构件中对此函数的任何调用都会采用并行机制。第二种使用导语的命名形式,声明一个已经原型化的函数使其拥有设备版代码,同第一个示例。routine 导语的第三种用法是告诉编译器生成该函数的设备版本,以便计算构件可以调用该过程。

注意 routine 导语与并行性的三个级别(gang、worker、vector)的结合很复杂,这将在第 2 章中介绍。为简单起见,可以这样说,并行性的任意一个级别最多只可以被请求一次,特别是对于嵌套的例程和循环。

routine 导语还使用了这里介绍的另外三个子语。

OpenACC高性能并行编程:概念与策略(9):OpenACC概述 1.2.4

这段代码中的第一个导语告诉编译器,在为 NVIDIA 目标设备编译时,只要看到在计算构件中调用 foo(),就应该用 foo_nvidia 替换调用名称1。该导语还告诉编译器,除 NVIDIA 以外的所有目标设备,函数 foo() 将只利用 vector 级并行;然而,在 NVIDIA 的目标设备中,函数 foo_nvidia 将同时使用 gang 级和 vector 级并行,而不在函数外部提供并行。

1  NVIDIA, founded in 1993, is a vendor of GPUs, notably for gaming platforms. See http://www.nvidia.com/object/about-nvidia.html .

第二个导语告诉编译器为设备生成代码,而不为主机生成代码。至少有两个理由说明这么做是有用的。首先,它减少了生成的代码的文本大小。其次,它确保不能被主机编译的代码(即特定设备的内部代码)不会提供给主机编译器。

现在,虽然这看起来非常复杂,但请放心,这也是非常高级的 OpenACC 程序的最高复杂级别了,并且在许多情况下不是必需的。

OpenACC高性能并行编程:概念与策略(9):OpenACC概述 1.2.4

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

评论

发布