谁能解释如何在 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 接口?