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

带CUDA的OpenCV C++与CUDA-C的时间测量方法咨询

关于CUDA耗时测量的可行性及完整实现

1. 你给出的代码片段的有效性

你提供的cudaEventCreate代码是创建CUDA事件的正确步骤,但这只是测量流程的第一步,单独这段代码无法完成耗时统计,需要补充完整的测量逻辑。

2. 完整的CUDA耗时测量流程

不管是测试你的CUDA-C实现,还是OpenCV的CUDA版本图像相加,都可以用CUDA事件来准确测量GPU操作的耗时,完整步骤如下:

测量自定义CUDA-C实现的耗时

cudaEvent_t start, stop;
float elapsed_time;

// 创建事件
cudaEventCreate(&start);
cudaEventCreate(&stop);

// 记录开始事件(确保GPU在记录前完成之前的操作)
cudaEventRecord(start, 0);

// 执行你的自定义CUDA图像相加函数
your_custom_cuda_add_image_func(img1, img2, result);

// 记录结束事件,并等待事件完成(确保GPU操作结束)
cudaEventRecord(stop, 0);
cudaEventSynchronize(stop);

// 计算耗时(单位:毫秒)
cudaEventElapsedTime(&elapsed_time, start, stop);
printf("自定义CUDA-C实现耗时:%.3f ms\n", elapsed_time);

// 销毁事件
cudaEventDestroy(start);
cudaEventDestroy(stop);

测量OpenCV CUDA版本的耗时

对于OpenCV的CUDA实现(比如cv::cuda::add),同样可以用CUDA事件测量,因为OpenCV的CUDA操作是在GPU上执行的,CUDA事件可以捕获其真实耗时:

cudaEvent_t start, stop;
float elapsed_time;

cudaEventCreate(&start);
cudaEventCreate(&stop);

// 注意:如果图像在CPU内存,需先上传到GPU(若不需要统计上传耗时,放在事件记录前)
cv::cuda::GpuMat gpu_img1(img1), gpu_img2(img2), gpu_result;

cudaEventRecord(start, 0);

// 执行OpenCV CUDA图像相加
cv::cuda::add(gpu_img1, gpu_img2, gpu_result);
// 可选:若需将结果回传CPU,这一步耗时若要统计就放在事件内,否则放在外面
// gpu_result.download(result);

cudaEventRecord(stop, 0);
cudaEventSynchronize(stop);

cudaEventElapsedTime(&elapsed_time, start, stop);
printf("OpenCV CUDA实现耗时:%.3f ms\n", elapsed_time);

cudaEventDestroy(start);
cudaEventDestroy(stop);

3. 对比时的注意事项

  • 排除无关耗时:图像从CPU到GPU的上传、GPU到CPU的下载操作,若不是核心对比逻辑,要放在事件记录外,只统计核心相加操作的耗时。
  • 多次取平均:单次测量可能存在误差,建议重复执行多次操作,取平均耗时作为最终结果,避免偶然因素干扰。
  • 保证环境一致:对比时使用相同尺寸、格式的输入图像,相同的GPU设备、CUDA及OpenCV版本,确保对比公平性。

4. 结论

你给出的cudaEventCreate代码是可行的,但需要补充完整的事件记录、同步和耗时计算步骤,才能完成两种实现的耗时对比。按照上述完整流程,就能准确统计出哪种实现更快。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 01:28:13