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

WSL2 Ubuntu下使用OpenACC无法访问CUDA设备(错误码34)求助

排查思路与解决方案

1. 验证Windows端NVIDIA驱动兼容性

WSL2的CUDA/GPU访问依赖Windows主机的NVIDIA驱动,必须安装支持WSL2的版本(≥460.x)。打开Windows设备管理器→显示适配器,确认NVIDIA驱动版本符合要求,建议安装最新稳定版。

2. 检查WSL2 GPU识别状态

在WSL2终端执行nvidia-smi:

  • 若命令不存在:确认HPC SDK的CUDA路径已加入环境变量(参考下文配置指导)
  • 若命令执行失败:更新WSL2版本(Windows终端运行wsl --update),并确认Windows已开启“适用于Linux的Windows子系统”和“虚拟机平台”功能。

3. 修复设备权限问题

错误码34常与GPU设备权限相关:

  • 查看设备权限:ls -la /dev/nvidia*
  • 将当前用户加入video组(永久生效):
    sudo usermod -aG video $USER
    
    退出WSL2并重新登录后生效
  • 临时权限修复(仅测试用):
    sudo chmod 666 /dev/nvidia*
    

4. 验证CUDA Runtime可用性

编译并运行简单CUDA测试程序,确认Runtime能正常初始化:
创建test.cu文件:

#include <stdio.h>
int main() {
    int deviceCount;
    cudaGetDeviceCount(&deviceCount);
    printf("Detected CUDA devices: %d\n", deviceCount);
    for (int i=0; i<deviceCount; i++) {
        cudaDeviceProp prop;
        cudaGetDeviceProperties(&prop, i);
        printf("Device %d: %s\n", i, prop.name);
    }
    return 0;
}

编译运行:

nvcc test.cu -o test
./test

若能输出GPU信息,说明CUDA Runtime正常,问题出在OpenACC工具链配置;若仍报错,继续排查驱动或WSL配置。

5. 确认HPC SDK环境变量配置

确保HPC SDK的环境变量正确加载,在~/.bashrc或~/.zshrc中添加:

export NVARCH=`uname -s`_`uname -m`
export NVCOMPILERS=/opt/nvidia/hpc_sdk
export PATH=$NVCOMPILERS/$NVARCH/latest/compilers/bin:$PATH
export PATH=$NVCOMPILERS/$NVARCH/latest/cuda/bin:$PATH
export LD_LIBRARY_PATH=$NVCOMPILERS/$NVARCH/latest/cuda/lib64:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH=$NVCOMPILERS/$NVARCH/latest/compilers/lib:$LD_LIBRARY_PATH

执行source ~/.bashrc生效后,用which pgcc和which nvcc确认命令可被找到。


WSL2 Ubuntu下OpenACC标准配置流程
  1. Windows端准备:安装支持WSL2的NVIDIA桌面驱动(版本≥460.x),开启Windows功能“适用于Linux的Windows子系统”和“虚拟机平台”。
  2. WSL2配置:将Ubuntu发行版设置为WSL2版本(wsl --set-version <你的发行版名称> 2),并运行wsl --update更新到最新版。
  3. HPC SDK安装:下载并解压NVIDIA HPC SDK到/opt/nvidia/hpc_sdk目录。
  4. 环境变量配置:按上述步骤添加环境变量到shell配置文件。
  5. 验证配置:
    • 执行nvidia-smi确认GPU被识别
    • 执行pgaccelinfo或nvaccelinfo确认加速器正常检测
  6. 编译运行OpenACC程序:
    示例代码test.c:
    #include <stdio.h>
    int main() {
        int arr[100];
        #pragma acc parallel loop
        for (int i=0; i<100; i++) {
            arr[i] = i*2;
        }
        printf("arr[0] = %d, arr[99] = %d\n", arr[0], arr[99]);
        return 0;
    }
    
    编译运行:
    pgcc -acc -fast test.c -o test
    ./test
    

内容的提问来源于stack exchange,提问作者Aronld Manki

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 00:43:20