OpenCV CUDA模块设备层-----检查 CUDA 错误并输出调试信息内联函数checkCudaError()

发布于:2025-06-25 ⋅ 阅读:(20) ⋅ 点赞:(0)
  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

在主机端(Host)检查 CUDA API 调用是否返回错误,并在出错时打印错误信息和调用堆栈,然后终止程序。
它类似于标准的 CUDA 错误检查宏(如常见的 cudaCheckError() 或 checkCudaErrors()),但它是 OpenCV 内部实现的一个封装。

函数原型

__host__ __forceinline__ void cv::cudev::checkCudaError 	
(
 	cudaError_t  	err,
	const char *  	file,
	const int  	line,
	const char *  	func 
) 		

参数

参数名 类型 描述
err cudaError_t CUDA API 返回的错误码(如 cudaSuccess, cudaErrorMemoryAllocation 等)
file const char* 当前源文件名(通常由 FILE 宏传入)
line int 当前行号(通常由 LINE 宏传入)
func const char* 当前函数名(可选,可以传入 FUNCTION 或 “”)

代码示例



#include <opencv2/core/cuda.hpp>
#include <opencv2/cudev/common.hpp> // 包含 checkCudaError 和 CV_CUDEV_SAFE_CALL
#include <iostream>

using namespace cv::cudev;

// 示例函数:分配 GPU 内存并进行简单操作
void testGpuMemory() {
    float* d_data = nullptr;
    size_t size = 1024 * 1024 * 10; // 分配 10MB 空间(合理大小)

    std::cout << "Allocating GPU memory..." << std::endl;
    CV_CUDEV_SAFE_CALL(cudaMalloc(&d_data, size));

    std::cout << "Setting memory to zero..." << std::endl;
    CV_CUDEV_SAFE_CALL(cudaMemset(d_data, 0, size));

    std::cout << "Freeing GPU memory..." << std::endl;
    cudaFree(d_data);
}

int main() {
    try {
        testGpuMemory();
        std::cout << "GPU memory operations succeeded." << std::endl;
    } catch (...) {
        std::cerr << "An exception occurred during GPU operation." << std::endl;
        return -1;
    }

    return 0;
}

运行结果

Allocating GPU memory...
Setting memory to zero...
Freeing GPU memory...
GPU memory operations succeeded.