You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 06:12:33