我试图了解如何使用 OpenACC 将计算卸载到 GCC 5.3 上的 nvidia GPU。我用谷歌搜索的东西越多,我就越困惑。我找到的所有指南都涉及重新编译整个 gcc 以及两个名为 nvptx-tools 和 nvptx-newlib 的库。其他消息来源称 OpenACC 是 GOMP 库的一部分。其他消息来源称,OpenACC 支持的开发将仅在 GCC 6.x 上继续。我还读到,对 OpenACC 的支持是 GCC 的主要分支。但是,如果我使用 -fopenacc
编译程序,并且 -foffload=nvptx-non
就无法工作。有人可以向我解释一下使用 gcc 5.3+ 编译和运行 OpenACC 代码到底需要什么吗?
- 为什么有些指南似乎需要(重新)编译
nvptx-tools
、nvptx-newlib
和 GCC,如果正如一些互联网来源所说,OpenACC 支持是GCC 主要分支的一部分? - GOMP 库在这一切中扮演什么角色?
- 从现在开始,OpenACC 支持的开发真的只会针对 GCC 6+ 进行吗?
- 当 OpenACC 支持成熟时,我们的目标是否是以与启用 OpenMP 类似的方式启用它(即仅添加几个编译器标志)?
- 在将“OpenACC”替换为“OpenMP 4.0 GPU/MIC 卸载功能”后,有人还能提供上述所有问题的答案吗?
提前致谢
最佳答案
下面的链接包含一个脚本,该脚本将编译 gcc 以支持 OpenACC。
OpenACC 现在是 GCC 主分支的一部分,但有一些需要注意的地方。即使有一些库是gcc的一部分,当你编译gcc时,你也必须指定要编译哪些库。并非所有这些都会默认编译。对于 OpenACC 还有一个额外的问题。由于 NVIDIA 驱动程序不是开源的,GCC 无法将 OpenACC 直接编译为二进制文件。它需要将 OpenACC 编译为 Nvidia 运行时将处理的中间 NVPTX 指令。因此,您还需要安装 nvptx 库。
GOMP 库是处理 OpenMP 和 OpenACC 的中间库
是的,我认为 OpenACC 开发只会在 GCC 6 中进行,但它仍可能向后移植到 GCC 5。但您最好最好使用 GCC 6。
虽然我无法评论 GCC 开发人员决定做什么,但我认为在第一点中我已经说明了问题所在。除非 NVIDIA 将其驱动程序开源,否则我认为额外的步骤始终是必要的。
我相信目前 OpenMP 计划仅用于 CPU 和 MIC。我相信 OpenMP 对两者的支持可能会成为默认行为。我不确定针对 NVIDIA GPU 的 OpenMP 是否会立即成为他们目标的一部分,但由于 GCC 正在为 OpenMP 和 OpenACC 使用 GOMP,我相信最终他们可能能够做到这一点。此外,GCC 还针对使用 OpenMP 的 HSA,所以基本上是 AMD APU。我不确定 AMD GPU 是否会以同样的方式工作,但也许有可能。由于 AMD 正在将他们的驱动程序开源,我相信它们可能更容易集成到默认行为中。
关于gcc - 怎样才能使 OpenACC/OpenMP4.0 卸载到 nvidia/mic 在 GCC 上工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38283471/