如何使用icc编译面向NVIDIA GPU的GPU offloading代码
ICC 18编译适配GCC的NVIDIA GPU Offloading代码操作指南
注意:ICC 18仅支持通过OpenMP 4.5规范实现GPU卸载,若你原来的GCC代码使用的是OpenACC、GCC专属nvptx扩展等非标准OpenMP offloading语法,需要先做语法适配才能正常编译。另外ICC 18最高兼容CUDA 9.x版本,请勿使用CUDA 10及以上版本,否则会出现编译适配错误。
前置依赖配置
- 提前安装匹配版本的CUDA工具包(推荐CUDA 9.2),将CUDA的
bin目录加入PATH环境变量,lib64目录加入LD_LIBRARY_PATH环境变量 - 配置ICC 18的运行环境,执行ICC安装路径下的
bin/compilervars.sh intel64脚本完成环境变量初始化
核心编译选项
- 启用OpenMP支持:
-qopenmp(替代GCC的-fopenmp参数) - 指定OpenMP卸载目标为NVIDIA GPU:
-qopenmp-targets=nvptx64-nvidia-cuda - 指定CUDA工具包安装路径:
-cuda-path=<你的CUDA安装路径>,默认路径一般为/usr/local/cuda-9.2 - (可选)指定目标NVIDIA显卡算力:
-Xopenmp-target -march=sm_<算力版本号>,例如V100对应sm_70,P100对应sm_60,GTX 10系列对应sm_61 - (可选)打印卸载调试信息:
-qopenmp-offload-report,编译时会输出每个代码区域的卸载状态,方便调试
编译示例
原有GCC编译命令示例:
gcc -fopenmp -foffload=nvptx-none -O2 test.c -o test对应ICC 18编译命令示例:
icc -qopenmp -qopenmp-targets=nvptx64-nvidia-cuda -cuda-path=/usr/local/cuda-9.2 -Xopenmp-target -march=sm_70 -O2 test.c -o test
运行注意事项
- 运行二进制前请确认ICC运行库路径、CUDA库路径都已加入
LD_LIBRARY_PATH环境变量,避免运行时找不到依赖库 - 若出现卸载失败的运行时报错,可先添加
-qopenmp-offload-report选项重新编译,检查是否有代码区域未成功被编译器识别为可卸载段
内容的提问来源于stack exchange,提问作者Suchetan B
相关产品推荐
相关产品推荐

