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等必要库文件
- 在VC++目录中,
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
相关产品推荐
相关产品推荐

