使用Intel oneAPI DPC++编译器实现OpenMP向NVIDIA GPU卸载的问题
OpenMP GPU卸载相关问题(NVIDIA Tesla V100 + Intel oneAPI icpx)
背景
我正在开发一款基于OpenMP向GPU卸载的程序,当前使用Intel oneAPI DPC++编译器icpx v2022.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 $@
代码编译无报错和警告,但不确定运行时是否真的使用了GPU,现提出以下问题:
- 如何验证GPU是否被使用?能否使用Intel或NVIDIA性能分析器进行检查?
- Intel编译器是否支持向NVIDIA GPU进行卸载?
- 是否应改用NVIDIA编译器来实现向NVIDIA显卡的OpenMP卸载?
问题解答
1. 验证GPU使用情况及性能分析工具
- 基础验证方法:
- 用
nvidia-smi实时监控:运行watch -n 1 nvidia-smi持续刷新GPU状态,若程序运行时GPU利用率、显存占用明显上升,说明GPU正在被使用。 - 借助OpenMP环境变量:设置
OMP_DISPLAY_ENV=VERBOSE运行程序,会输出目标设备的识别信息;设置OMP_TARGET_OFFLOAD=MANDATORY,若GPU卸载失败会直接报错,而非 fallback 到CPU。
- 用
- 性能分析工具:
- NVIDIA工具:使用
nsys(Nsight Systems)追踪GPU活动,查看OpenMP卸载内核的执行时间、调用次数等;旧版CUDA可用nvprof。 - Intel工具:Intel VTune Profiler支持分析OpenMP目标卸载,只要系统安装了NVIDIA OpenCL驱动,就能识别并展示GPU上的卸载任务数据。
- NVIDIA工具:使用
2. Intel编译器对NVIDIA GPU的OpenMP卸载支持
Intel oneAPI DPC++编译器(icpx)通过OpenCL后端支持向NVIDIA GPU进行OpenMP卸载,但有几点注意事项:
- 需系统安装NVIDIA OpenCL驱动,
icpx v2022.1.0支持Tesla V100的Volta架构。 - 编译时指定
-fopenmp-targets=spir64是正确的,SPIR-V中间表示会通过OpenCL驱动转换为NVIDIA可执行代码。 - MKL SYCL接口在NVIDIA GPU上的优化可能不如Intel GPU,需测试确认性能表现。
3. 是否改用NVIDIA编译器
是否切换到NVIDIA的nvc++(或nvcc)取决于你的需求:
- 追求极致性能:nvc++对自家GPU的OpenMP卸载支持更成熟,针对Volta架构有专门优化,能更好利用Tensor Core、共享内存等硬件特性,调试和 profiling 工具链也更贴合NVIDIA硬件。
- 需要跨平台兼容:继续使用
icpx可保留代码跨平台性,同一份代码可在Intel、NVIDIA、AMD GPU上运行,但需确保OpenCL驱动正常且性能达标。 - 过渡建议:先用
icpx完成功能验证,再用nvc++编译对比性能,根据测试结果决定最终编译器。
内容的提问来源于stack exchange,提问作者mabalenk
相关产品推荐
相关产品推荐

