C ++:升级到GTX970后cv :: gpu :: GpuMat :: upload上的延迟很长

时间:2015-01-06 09:18:15

标签: c++ opencv cuda gpu

我一直在我的程序中使用OpenCV的gpu模块(cuda)一段时间,它工作正常。现在我将显卡升级到gtx970。现在,我第一次在启动程序后调用cv :: gpu :: GpuMat :: upload我得到了很长的延迟。使用我的旧显卡(GTX770),这几乎立即完成。

示例:我的图像尺寸为512x600像素。使用此图像需要12秒。如果我之后再次执行相同的代码而不关闭程序,它会立即生效。我知道在启动程序后第一次执行CUDA代码时,它是在GPU上编译的,所以有一定的延迟是正常的。但对我来说,这似乎是莫名其妙的,特别是因为老卡片的速度要快得多。

有谁知道什么可能导致这种行为?目前的OpenCV版本是否存在与GTX970卡相关的已知问题?我使用的版本是2.4.10,除了3.0beta,最新版本。

我现在还发现有一个专门支持GTX970和GTX980卡的CUDA工具包版本:

https://developer.nvidia.com/cuda-dow ...

我下载了它并用那个再次编译了OpenCV。不幸的是,这并没有解决我的问题。不知何故,我感觉现在需要的时间更长。

这里有没有人有使用GTX900卡和OpenCV的经验?

这是代码,如果有人想看到它:

    if (_cudaAvailable){
        try{
            _gpuUploadMutex.lock();
            //upload image channels to the gpu if using cuda
            cv::gpu::GpuMat gpuMat;
            gpuMat.upload(_originalImage);
            cv::gpu::split(gpuMat, _originalImageChannelsCuda);
            _gpuUploadMutex.unlock();
            std::cout << "Image uploaded to GPU successfully" << std::endl;
        }
        catch (...){
            std::cerr << "Error occured while using CUDA, falling back to CPU. (Insufficient video RAM?)" << std::endl;
            _cudaAvailable = false;
            _gpuUploadMutex.unlock();
        }
    }

没什么特别的。导致初始延迟的代码行是gpuMat.upload。

1 个答案:

答案 0 :(得分:3)

当您的程序尝试在GPU上执行代码时,驱动程序将检查可执行文件,以查找在特定GPU上运行的合适代码。可执行文件被称为&#34; fat binary&#34;,这意味着它可以包含多个体系结构的代码。

对于GPU,可执行文件可以包含不同GPU的机器代码以及PTX,这是一种稍高级的语言(看起来像汇编),可以在运行时编译到特定的GPU。

在您的情况下,我猜测二进制文件包含原始GPU的机器代码(GTX770是计算能力3.0),但不包含新GPU(GTX970是计算能力5.2)。因此,当您在新GPU上运行时,驱动程序会找到PTX(也包含在胖二进制文件中)并将其重新编译为sm5.2。这种重新编译需要时间。

如果你能找到你的编译命令,你会看到类似的东西:

nvcc ... -gencode arch=compute_30,code=\'compute_30,sm_30\'

你应该改为:

nvcc ... -gencode arch=compute_30,code=\'compute_30,sm_30,sm_52\'