谁能解释如何在 GCC 中使用 OpenACC?

Posted

技术标签:

【中文标题】谁能解释如何在 GCC 中使用 OpenACC?【英文标题】:Can anyone explain how to use OpenACC in GCC? 【发布时间】:2021-03-05 05:45:02 【问题描述】:

我正在使用 WSL Ubuntu。并使用 GCC 编译我的 C++ 代码。

我正在尝试使用 OpenACC 来并行化我的代码。我听说我可以将 OpenACC 与 GCC 一起使用。

所以在我安装了 Ubuntu 之后,我安装了 GCC。

然后我输入如下:

$ g++ -fopenacc -o t testfile.cpp

据我所知,-fopenacc 应该使我能够在我的代码中使用 OpenACC。

但是,我收到一条消息说:

lto-wrapper: fatal error: could not find accel/nvptx-none/mkoffload in /usr/lib/gcc/x86_64-linux-gnu/9/:/usr/lib/gcc/x86_64-linux-gnu/9/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/9/:/usr/lib/gcc/x86_64-linux-gnu/ (consider using ‘-B’)

所以我想我错过了什么。

有人知道如何将 OpenACC 与 GCC 一起使用吗?


已编辑:

我试过了:

sudo apt-get install gcc-9-offload-nvptx

然后错误信息现在改为:

lto1: error: ‘-fcf-protection=full’ is not supported for this target
mkoffload: fatal error: x86_64-linux-gnu-accel-nvptx-none-gcc-9 returned 1 exit status

compilation terminated.

lto-wrapper: fatal error: /usr/lib/gcc/x86_64-linux-gnu/9//accel/nvptx-none/mkoffload returned 1 exit status
compilation terminated.

/usr/bin/ld: error: lto-wrapper failed

collect2: error: ld returned 1 exit status

【问题讨论】:

如OpenACC website 所述,使用 Spack 安装支持 OpenACC 的 GCC 怎么样? 感谢 cmets。我正在使用 Spack 下载。希望这可行...我已经拥有 GCC 9,是否需要卸载以前的版本才能使用这个新版本? 这里使用 Spack 的目的是安装一个定制的 GCC 版本,补丁支持 nvptx/OpenACC。因此,如果可能的话,最好避免在已安装的 GCC 版本中发生冲突(尤其是对于复杂的构建)。无论如何,您可以在安装后检查 GCC 的版本,以检查这是否是您想要的。 【参考方案1】:

我更进一步:

gcc-10 -O2 -ffast-math -fopenacc -fopt-info-all-omp -fcf-protection=none -foffload=nvptx laplace2dkernels.c

但只是为了找到下一个问题:

gcc-10: fatal error: GCC is not configured to support nvptx as offload target
compilation terminated

所以他们似乎只为 AMD GCN 编译了它。 如果你使用

gcc-10 -O2 -ffast-math -fopenacc -fopt-info-all-omp -fcf-protection=none -foffload=nvptx-none laplace2dkernels.c

>laplace2dkernels.c:74:9: optimized: assigned OpenACC seq loop parallelism
>/usr/bin/ld: /tmp/ccYd0cZe.crtoffloadtable.o: warning: relocation against >`__offload_vars_end' in read-only section `.rodata'

它可以编译,但是在运行时它会丢失:

libgomp: while loading libgomp-plugin-gcn.so.1: libgomp-plugin-gcn.so.1: cannot open shared object file: No such file or directory

我不需要安装这些库,因为我想让它与我的 Nvidia 卡一起运行。

使用 PGI 编译器一切正常。

注意:我还使用 WSL 和特殊的 NVIDIA 驱动程序来支持 GPU 直通。

【讨论】:

感谢 cmets。我挣扎了好几天......我也试图安装 pgi 编译器,但我不知道如何使用 WSL Ubuntu 安装它。可以问一下怎么安装吗?有什么可以参考的说明吗?【参考方案2】:

在安装 gcc-10-offload-nvptx 之后,以下是对我有用的带有 OpenACC 指令的 Tiny C++ 模板代码:

g++ -c -g -O -fopenacc -foffload=nvptx-none -fcf-protection=none -foffload=-misa=sm_35 -fno-stack-protector stencil_acc.cxx

g++ -o stencil_acc -g -O -fopenacc -foffload=nvptx-none -fcf-protection=none -foffload=-misa=sm_35 -fno-stack-protector util.o stencil_acc.o

【讨论】:

以上是关于谁能解释如何在 GCC 中使用 OpenACC?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Fortran 中将 OpenACC 与 cublasDgetrfBatched 接口?

OpenACC:如何将 openacc pragma 应用于“宏循环”

MPI+OpenACC编程中的GPU间通信

为啥 gcc 在非调试版本中添加符号?

在 OpenCL 上使用 OpenACC?

GCC详细模式输出说明