首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenCV图形处理器模糊速度慢

OpenCV图形处理器模糊速度慢
EN

Stack Overflow用户
提问于 2015-07-20 17:57:32
回答 1查看 5K关注 0票数 2

GPU:GeForce GTX 750

CPU:Intel i5-4440 3.10 GHz

下面是我正在运行的一个简单的C++代码。

代码语言:javascript
复制
    #include <iostream>
    #include "opencv2/highgui/highgui.hpp"
    #include "opencv2\gpu\gpu.hpp"

    int main(int argc, char** argv) {
        cv::Mat img0 = cv::imread("IMG_0984.jpg", CV_LOAD_IMAGE_GRAYSCALE); // Size 3264 x 2448
        cv::Mat img0Blurred;

        cv::gpu::GpuMat gpuImg0(img0);
        cv::gpu::GpuMat gpuImage0Blurred;

        int64 tickCount;

        for (int i = 0; i < 5; i++)
        {
            tickCount = cv::getTickCount();
            cv::blur(img0, img0Blurred, cv::Size(7, 7));
            std::cout << "CPU Blur " << (cv::getTickCount() - tickCount) / cv::getTickFrequency() << std::endl;

            tickCount = cv::getTickCount();
            cv::gpu::blur(gpuImg0, gpuImage0Blurred, cv::Size(7, 7));
            std::cout << "GPU Blur " << (cv::getTickCount() - tickCount) / cv::getTickFrequency() << std::endl;

        }

        cv::gpu::DeviceInfo deviceInfo;
        std::cout << "Device Info: "<< deviceInfo.name() << std::endl;

        std::cin.get();

        return 0;
    }

因此,我通常会得到这样的东西:

代码语言:javascript
复制
CPU Blur: 0.01
GPU Blur: 1.7
CPU Blur: 0.009
GPU Blur: 0.012
CPU Blur: 0.009
GPU Blur: 0.013
CPU Blur: 0.01
GPU Blur: 0.012
CPU Blur: 0.009
GPU Blur: 0.013

Device Info: GeForce GTX 750

因此,GPU上的第一次操作需要时间。

但是,其他的GPU电话呢?

为什么GPU没有为此提供任何加速。它毕竟是一个大图像(3264x2448)。这个任务很适合并行化,不是吗?

我的CPU是那么好,还是我的GPU那么差?或者这是组件之间的某种通信问题吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-21 07:26:58

你的第一次gpu测量远离其他,我也经历过同样的事情。第一次调用opencv内核(腐蚀/扩展/等)比其他跟随者更长。在应用程序中,当我们初始化GPU内存时,我们第一次调用cv::gpu::XX,以避免这种测量噪声。

我还看到cv::gpu在每次调用后使用cudaDeviceSynchronize,而不使用cv::gpu::Stream参数。这可能是很长的,并导致你的噪音测量。然后,opencv可能会为临时缓冲区分配内存,以存储用于模糊映像的内核。

在您的示例中,我没有看到gpuImage0Blurred的分配,您能确保您的目标图像在循环之外被正确地分配了吗?否则,您也将度量这个矩阵的分配时间。

使用nvvp可以为您提供运行应用程序以删除不必要操作时实际发生的情况的线索。

编辑:

代码语言:javascript
复制
#include <iostream>
#include "opencv2/highgui/highgui.hpp"
#include "opencv2\gpu\gpu.hpp"


int main(int argc, char** argv) {
    cv::Mat img0 = cv::imread("IMG_0984.jpg", CV_LOAD_IMAGE_GRAYSCALE); // Size 3264 x 2448
    cv::Mat img0Blurred;


    cv::gpu::GpuMat gpuImg0;
    cv::gpu::Stream stream;
    stream.enqueueUpload(img0, gpuImg0);
    stream.waitForCompletion();

    // allocates the matrix outside the loop
    cv::gpu::GpuMat gpuImage0Blurred( gpuImg0.size(), gpuImg0.type() );

    int64 tickCount;

    for (int i = 0; i < 5; i++)
    {
        tickCount = cv::getTickCount();
        cv::blur(img0, img0Blurred, cv::Size(7, 7));
        std::cout << "CPU Blur " << (cv::getTickCount() - tickCount) / cv::getTickFrequency() << std::endl;

        tickCount = cv::getTickCount();
        cv::gpu::blur(gpuImg0, gpuImage0Blurred, cv::Size(7, 7), cv::Point(-1, -1), stream);
        // ensure operations are finished  before measuring time spent doing operations
        stream.WaitCompletion();
        std::cout << "GPU Blur " << (cv::getTickCount() - tickCount) / cv::getTickFrequency() << std::endl;

    }

    std::cin.get();

    return 0;
}

是的,事实证明,waitForCompletion带来了所有的不同。我得到了同样的值,就像刚开始的那样:

代码语言:javascript
复制
CPU Blur: 0.01
GPU Blur: 1.7
CPU Blur: 0.009
GPU Blur: 0.012
CPU Blur: 0.009
GPU Blur: 0.013
CPU Blur: 0.01
GPU Blur: 0.012
CPU Blur: 0.009
GPU Blur: 0.013
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31523216

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档