使用 Intel oneAPI DPC++ 编译器将 OpenMP 卸载到 NVIDIA GPU

mab*_*enk 1 gpu nvidia openmp offloading intel-oneapi

我的任务是编写一个通过 OpenMP 卸载到 GPU 的程序。目前我使用 Intel oneAPI DPC++ 编译器编译我的代码icpxv2022.1.0 编译代码,目标是在后端使用 NVIDIA Tesla V100。请在下面找到我的相关部分Makefile

MKLROOT   = /lustre/system/local/apps/intel/oneapi/2022.2.0/mkl/latest

CXX       = icpx
INC       =-I"${MKLROOT}/include"
CXXFLAGS  =-qopenmp -fopenmp-targets=spir64 ${INC} --gcc-toolchain=/lustre/system/local/apps/gcc9/9.3.0
LDFLAGS   =-qopenmp -fopenmp-targets=spir64 -fsycl -L${MKLROOT}/lib/intel64
LDLIBS    =-lmkl_sycl -lmkl_intel_lp64 -lmkl_sequential -lmkl_core -lsycl -lOpenCL -lstdc++ -lpthread -lm -ldl

${EXE}: ${OBJ}
    ${CXX} ${CXXFLAGS} $^ ${LDFLAGS} ${LDLIBS} -o $@
Run Code Online (Sandbox Code Playgroud)

该代码编译时没有错误和警告,但我不完全确定它在运行时确实使用了 GPU。

  1. 我如何验证这一点?我可以使用 Intel 或 NVIDIA 分析器来检查吗?
  2. 我的假设是否正确,即英特尔编译器支持卸载到 NVIDIA GPU?
  3. 或者我应该更好地使用 NVIDIA 编译器来启用 OpenMP 卸载到 NVIDIA 显卡?

Jér*_*ard 5

\n

我如何验证这一点?我可以使用 Intel 或 NVIDIA 分析器来检查吗?

\n
\n

在配备 Nvidia GPU(例如 V100)的系统上,您可以使用它nvidia-smi来检查 GPU 的状态。您还可以使用 Nsight 套件(或旧的已弃用的 nvvp)等分析器。

\n
\n

我的假设是否正确,即英特尔编译器支持卸载到 NVIDIA GPU?

\n
\n

根据 Intel 的说法,它支持:

\n
\n

英特尔\xc2\xae oneAPI DPC++/C++ 编译器和英特尔\xc2\xae Fortran 编译器的 OpenMP* 卸载到 GPU 功能可为各种加速器编译 OpenMP 源文件。仅 icx 和 ifx 编译器支持 OpenMP Offload 功能。

\n
\n

据我了解,它们要么生成基于 Clang 的 GPU 中间代码,要么生成 SPIR64 二进制文件。

\n

根据 Nvidia 的说法,前者当然可以在 Nvidia GPU 上使用(尽管英特尔和 Nvidia 缺乏提供信息)。

\n

后者与SPIR标准有关。事实上,据我所知,DPC++ 是开放SYCL标准的实现,可以为SPIR-V 生态系统生成代码。SPIR 表示标准便携式中间表示。它的目的是让高级语言为许多后端生成一个统一的可移植代码。然后硬件供应商必须支持它,以便所有高级语言/工具都支持该供应商。因此,供应商不必直接支持高级语言/工具。

\n

虽然我没有找到 Nvidia 提供的任何直接支持 SPIR-V 的信息,但 SPIR 代码可以在支持最新版本(>=1.2)OpenCL 和 Vulkan 的设备上执行。幸运的是,Nvidia 最近声称支持 OpenCL 3.0

\n

简而言之,它应该可以在目标 Nvidia GPU 上运行,尽管这可能还不简单。

\n
\n

或者我应该更好地使用 NVIDIA 编译器来启用 OpenMP 卸载到 NVIDIA 显卡?

\n
\n

主流的 Nvidia 编译器包装器nvcc旨在支持基本上只能在 Nvidia GPU 上运行的 CUDA 代码(有很好的支持)。LLVM 应该支持 Nvidia GPU(使用 CUDA 生态系统),但设置可能有点棘手(并且您需要最新版本的工具链以避免许多问题)。当使用正确的标志和依赖项构建时,GCC 从版本 5 开始支持 OpenACC 卸载到 Nvidia PTX,从版本 7 开始支持 OpenMP 卸载到 PTX。此外,虽然 Nvidia 在其编译器包装器中不支持 OpenMP 卸载,但nvcc它还分发了nvc编译nvc++器 (以前称为 PGI HPC 编译器),具有OpenMPOpenACC卸载功能。

\n

请注意,OpenMP 卸载仍然是相当新的且相当实验性的,尽管到目前为止一些供应商似乎提供了良好的支持。

\n