在NVIDIA GPU上调用DPC++ BLAS库gemm函数出现段错误求助
排查oneAPI oneMKL gemm_usm.cpp在NVIDIA V100上的Segmentation Fault错误
问题描述
在公共集群本地离线安装oneAPI Base Kit和HPC Kit(2024.0版本),用于测试gemm性能,完成NVIDIA GPU配置后,编译运行oneMKL提供的gemm_usm.cpp示例程序时,出现Segmentation fault错误。
编译命令
icpx -fsycl -fsycl-targets=nvptx64-nvidia-cuda -Xsycl-target-backend=nvptx64-nvidia-cuda --cuda-gpu-arch=sm_70 gemm_usm.cpp -o dpcpp_dgemm_v100 -Wl,-rpath=/home01/r907a03/intel/oneapi/mkl/2024.0/lib /home01/r907a03/intel/oneapi/mkl/2024.0/lib/libmkl_sycl_blas.so /home01/r907a03/intel/oneapi/mkl/2024.0/lib/libmkl_intel_lp64.so /home01/r907a03/intel/oneapi/mkl/2024.0/lib/libmkl_tbb_thread.so /home01/r907a03/intel/oneapi/mkl/2024.0/lib/libmkl_core.so /home01/r907a03/intel/oneapi/tbb/2021.11/lib/libtbb.so.12
已尝试的操作
- 设置环境变量:
export ONEAPI_DEVICE_SELECTOR="ext_oneapi_cuda:*"、export LIBOMPTARGET_PLUGIN=OPENCL - 在代码中强制指定GPU设备:
queue Q( gpu_selector_v );
运行日志
######################################################################## # General Matrix-Matrix Multiplication using Unified Shared Memory Example: # # C = alpha * A * B + beta * C # # where A, B and C are general dense matrices and alpha, beta are # floating point type precision scalars. # # Using apis: # gemm # # Using single precision (float) data type # # Device will be selected during runtime. # The environment variable SYCL_DEVICE_FILTER can be used to specify # SYCL device # ######################################################################## Running BLAS GEMM USM example on GPU device. Device name is: Tesla V100-PCIE-16GB Running with single precision real data type: Segmentation fault
系统信息
- CentOS Linux release 7.9.2009 (Core)
- GCC版本12.2.0
- CUDA版本12.1
- NVIDIA-SMI输出:
$ nvidia-smi +-----------------------------------------------------------------------------+ | NVIDIA-SMI 510.47.03 Driver Version: 510.47.03 CUDA Version: 11.6 | |-------------------------------+----------------------+----------------------+| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC || Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. || | | MIG M. ||===============================+======================+======================|| 0 Tesla V100-PCIE... Off | 00000000:18:00.0 Off | 0 || N/A 27C P0 25W / 250W | 4MiB / 16384MiB | 0% Default || | | N/A |+-------------------------------+----------------------+----------------------+| 1 Tesla V100-PCIE... Off | 00000000:AF:00.0 Off | 0 || N/A 29C P0 27W / 250W | 4MiB / 16384MiB | 0% Default || | | N/A |+-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: || GPU GI CI PID Type Process name GPU Memory || ID ID Usage ||=============================================================================|| No running processes found |+-----------------------------------------------------------------------------+
- sycl-ls输出:
$ sycl-ls [opencl:acc:0] Intel(R) FPGA Emulation Platform for OpenCL(TM), Intel(R) FPGA Emulation Device OpenCL 1.2 [2023.16.10.0.17_160000] [opencl:cpu:1] Intel(R) OpenCL, Intel(R) Xeon(R) Gold 6226R CPU @ 2.90GHz OpenCL 3.0 (Build 0) [2023.16.10.0.17_160000] [opencl:cpu:2] Intel(R) OpenCL, Intel(R) Xeon(R) Gold 6226R CPU @ 2.90GHz OpenCL 3.0 (Build 0) [2021.12.9.0.24_005321] [ext_oneapi_cuda:gpu:0] NVIDIA CUDA BACKEND, Tesla V100-PCIE-16GB 7.0 [CUDA 11.6] [ext_oneapi_cuda:gpu:1] NVIDIA CUDA BACKEND, Tesla V100-PCIE-16GB 7.0 [CUDA 11.6]
排查与解决建议
1. 修复CUDA版本不匹配问题
当前系统NVIDIA驱动对应的CUDA版本是11.6,但安装的CUDA Runtime是12.1,版本不兼容可能导致底层调用错误。建议:
- 降级CUDA Runtime到11.6版本,与驱动版本保持一致;
- 或者升级NVIDIA驱动到支持CUDA 12.1的版本(如535.x系列)。
2. 使用oneAPI自动链接工具生成正确的编译参数
手动指定库文件容易出现顺序错误或遗漏依赖,建议使用mkl_link_tool生成标准链接参数:
# 获取USM BLAS的链接选项 mkl_link_tool --libs --usm --blas
将输出的链接参数替换编译命令中手动指定的库列表,确保链接顺序正确。
3. 启用调试定位错误位置
编译时添加调试参数,并用gdb追踪段错误:
# 重新编译带调试信息的版本 icpx -g -fsycl -fsycl-dead-args-optimization=false -fsycl-targets=nvptx64-nvidia-cuda -Xsycl-target-backend=nvptx64-nvidia-cuda --cuda-gpu-arch=sm_70 gemm_usm.cpp -o dpcpp_dgemm_v100 $(mkl_link_tool --libs --usm --blas) -Wl,-rpath=/home01/r907a03/intel/oneapi/mkl/2024.0/lib:/home01/r907a03/intel/oneapi/tbb/2021.11/lib # 用gdb调试 gdb ./dpcpp_dgemm_v100 run bt
通过调用栈信息可以明确段错误发生在oneMKL内部还是内存分配环节。
4. 调整环境变量设置
- 取消
LIBOMPTARGET_PLUGIN=OPENCL设置,CUDA backend不需要该变量,改为:export LIBOMPTARGET_PLUGIN=cuda - 确保正确加载oneAPI环境变量:
source /home01/r907a03/intel/oneapi/setvars.sh
5. 验证基础SYCL USM功能
编写最小测试程序,确认GPU设备访问和USM内存操作正常:
#include <sycl/sycl.hpp> using namespace sycl; int main() { queue Q(gpu_selector_v); std::cout << "Running on " << Q.get_device().get_info<info::device::name>() << "\n"; int* data = malloc_shared<int>(10, Q); if (!data) { std::cerr << "USM memory allocation failed\n"; return 1; } Q.parallel_for(10, [=](id<1> i) { data[i] = i; }).wait(); for (int i=0; i<10; i++) { std::cout << data[i] << " "; } std::cout << "\n"; free(data, Q); return 0; }
编译运行:
icpx -fsycl -fsycl-targets=nvptx64-nvidia-cuda -Xsycl-target-backend=nvptx64-nvidia-cuda --cuda-gpu-arch=sm_70 test_usm.cpp -o test_usm ./test_usm
如果该程序运行正常,说明问题集中在oneMKL的gemm调用或链接配置上;如果同样出现段错误,说明SYCL基础环境存在问题,需要重新检查NVIDIA GPU的oneAPI配置。
内容的提问来源于stack exchange,提问作者jaewook kim
相关产品推荐
相关产品推荐

