第一次调用OpenCV CUDA API时非常慢

问题描述

我正在使用cuda::resize调整图像矢量的大小(在GpuMat中)

显示一个呼叫大约需要15毫秒,其余的仅大约0.3毫秒。因此,我想问一下是否有办法缩短首次通话的时间。

这是我的代码(简体):

for (int i = 0; i < num_images; ++i)
    {
        full_img = v_GpuMat[i].clone(); // vGpuMat is vector of images in cuda::GpuMat
        seam_scale = 0.4377;
        cuda::resize(full_img,img,Size(),seam_scale,INTER_LINEAR);
    }

非常感谢您。

解决方法

CUDA设备的内存分配以及将数据从设备复制到主机(反之亦然)非常慢。请尝试分配内存并在主循环之外加载数据。克隆矩阵每次都会分配新的设备内存,尝试使用复制数据而不是克隆数据可以加快代码的速度。

,

在Nvidia-Visual-Profile中检查了结果之后,我发现它是 cudaLaunchKernel ,该过程大约需要20毫秒,并且只会在第一次调用。

NVPP Screenshot

如果您必须像我一样进行连续的流程,那么在您处理自己的任务之前,解决方案之一可能是空投。对于此示例,使cuda::resize跳出循环要快得多。