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。
\n\n我如何验证这一点?我可以使用 Intel 或 NVIDIA 分析器来检查吗?
\n
在配备 Nvidia GPU(例如 V100)的系统上,您可以使用它nvidia-smi来检查 GPU 的状态。您还可以使用 Nsight 套件(或旧的已弃用的 nvvp)等分析器。
\n\n我的假设是否正确,即英特尔编译器支持卸载到 NVIDIA GPU?
\n
根据 Intel 的说法,它支持:
\n\n\n英特尔\xc2\xae oneAPI DPC++/C++ 编译器和英特尔\xc2\xae Fortran 编译器的 OpenMP* 卸载到 GPU 功能可为各种加速器编译 OpenMP 源文件。仅 icx 和 ifx 编译器支持 OpenMP Offload 功能。
\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\n或者我应该更好地使用 NVIDIA 编译器来启用 OpenMP 卸载到 NVIDIA 显卡?
\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 编译器),具有OpenMP和OpenACC卸载功能。
请注意,OpenMP 卸载仍然是相当新的且相当实验性的,尽管到目前为止一些供应商似乎提供了良好的支持。
\n