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

C++ Onnx-GPU CUDA DLL触发访问违例问题求助

问题排查:ONNX Runtime GPU环境执行OrtSessionOptionsAppendExecutionProvider_CUDA崩溃

问题概述

首次使用C++开发的训练完成的ONNX模型,在CPU环境运行正常,但在GPU环境中执行OrtSessionOptionsAppendExecutionProvider_CUDA时崩溃,报错为 cufft64_10.dll 中的0xC0000005访问违例,写入地址失败。

环境配置

  • 操作系统:Windows 10
  • GPU:RTX 3090(驱动版本516.59)
  • 开发工具:Visual Studio 2022 社区版
  • ONNX Runtime版本:Microsoft.ML.OnnxRuntime.Gpu 1.12.0
  • CUDA版本:11.4
  • cuDNN版本:8.2.2.26

报错详情

在cufft64_10.dll中触发0xC0000005访问违例,写入地址0x000000D3562B0000失败。

原始代码片段

#include <iostream>

#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <vector>
#include <string>

#include <onnxruntime_cxx_api.h>

int main() {
    const string imageFile = "image";
    auto onnxFile = L"path to onnx file";

//Testing CV
cv::Mat img = cv::imread(imageFile)

//-----------------------------------------------GPU SUPPORT------------------------------------------------


auto providers = Ort::GetAvailableProviders();
for (auto provider : providers) {
    cout << provider << endl;
}
Ort::Session session(nullptr);
Ort::Env env(OrtLoggingLevel::ORT_LOGGING_LEVEL_WARNING, "test");
Ort::SessionOptions session_options;
session_options.SetIntraOpNumThreads(1);
Ort::ThrowOnError(OrtSessionOptionsAppendExecutionProvider_CUDA(session_options, 0));//Crash is here


//----------------------------------------------------------------------------------------------------------

// create session
session = Ort::Session(env, onnxFile, sessionOptions);

}

排查与解决建议

1. 版本兼容性校验

  • ONNX Runtime GPU 1.12.0官方推荐CUDA 11.6 + cuDNN 8.4.x版本组合,你当前使用的CUDA 11.4、cuDNN 8.2.2版本低于要求,存在兼容性风险。建议升级CUDA到11.6,cuDNN匹配到8.4.x版本后重试。
  • 报错涉及cufft64_10.dll,CUDA 11.4附带的cufft版本为11.x,而ONNX Runtime 1.12.0依赖特定版本的cufft库,版本不匹配会直接导致内存访问违例。

2. 环境变量与项目配置检查

  • 确保系统环境变量配置正确:
    • CUDA_PATH指向CUDA 11.4的安装目录
    • PATH中添加%CUDA_PATH%\bin和cuDNN解压后的bin目录(若cuDNN已解压到CUDA目录,则无需额外添加,但需确认目录存在)
  • Visual Studio项目配置:
    • 在VC++目录中,包含目录添加CUDA和cuDNN的include路径
    • 库目录添加CUDA的lib/x64和cuDNN的lib/x64路径
    • 链接器->输入中添加cudnn.lib、cufft.lib、onnxruntime.lib等必要库文件

3. 代码语法与逻辑修正

原始代码存在几处语法错误,修正后再测试:

#include <iostream>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <vector>
#include <string>
#include <onnxruntime_cxx_api.h>

using namespace std;
using namespace cv;

int main() {
    const string imageFile = "image";
    const wstring onnxFile = L"path to onnx file";

    // Testing CV
    Mat img = imread(imageFile); // 补充分号

    // GPU SUPPORT
    auto providers = Ort::GetAvailableProviders();
    for (auto provider : providers) {
        cout << provider << endl;
    }

    // 调整初始化顺序:先创建Env,再配置SessionOptions
    Ort::Env env(OrtLoggingLevel::ORT_LOGGING_LEVEL_WARNING, "test");
    Ort::SessionOptions session_options;
    session_options.SetIntraOpNumThreads(1);
    Ort::ThrowOnError(OrtSessionOptionsAppendExecutionProvider_CUDA(session_options, 0));

    // 创建Session,修正变量名大小写不一致问题
    Ort::Session session(env, onnxFile.c_str(), session_options);

    return 0;
}

4. 运行时依赖检查

使用Dependency Walker或Visual Studio的依赖项检查器,确认项目输出目录下存在所有必要的dll文件,尤其是cufft64_10.dll、cudnn64_8.dll、onnxruntime_gpu.dll,且版本与安装的CUDA、ONNX Runtime匹配。若dll缺失,需手动从CUDA或ONNX Runtime安装目录复制到输出目录。

5. GPU驱动更新

尝试将RTX 3090驱动更新到适配CUDA 11.4的稳定版本(可从NVIDIA官网下载Game Ready驱动),排除旧版本驱动的兼容性问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 14:30:25