【问题标题】:gpu::morphologyEx is slower than morphologyEx in CPU?gpu::morphologyEx 比 CPU 中的morphologyEx 慢?
【发布时间】:2014-07-16 09:26:50
【问题描述】:

我正在编写一个 c++ 代码,用于比较使用 CPU 和 GPU 版本的 opencv 的morphologyEx 方法的性能。这是我的代码:

#include <opencv2/opencv.hpp>
#include <opencv2/gpu/gpu.hpp>
#include <sys/time.h>       
#include <ctime>
using namespace cv;
using namespace std;


double start_timer()
{
     double start_time = (double) getTickCount();
     return start_time;
}

double end_timer(double start_time,int num_tests)
{
    double time = (1000 * ((double) getTickCount() - start_time)/ getTickFrequency());
    cout << "Average time of " << num_tests  << " frames is: " << time/num_tests <<  " ms" << endl;
    return time;
}


int main()
{
    Mat cpuSrc;
    cv::gpu::GpuMat src_gpu, dst_gpu;
    Mat dst;
    Mat element;
    int element_shape = MORPH_RECT;
    element = getStructuringElement(element_shape, Size(10, 10 ), Point(-1, -1) );
    cpuSrc = imread("images.jpeg",CV_LOAD_IMAGE_ANYDEPTH);

    if (!cpuSrc.data)
    {
        cerr << "Cannot read the data" << endl;
        return -1;
    }


    cout << "Starting calculating time for CPU ....." << endl;
    double start_time = start_timer();
    int d = 0;
    while(d<100)
    {
        cv::morphologyEx(cpuSrc, dst, CV_MOP_OPEN, element,Point(-1,-1),1);
    }

    double total_time_cpu = end_timer(start_time,d);



//--------------------------------------------------------------
    cout << "Starting calculating time for GPU ....." << endl;
    d = 0;
    cv::gpu::GpuMat buf1, buf2;
    gpu::Stream stream;
    double start_time_1 = start_timer();

    while(d<100)
    {
        stream.enqueueUpload(cpuSrc, src_gpu);
        cv::gpu::morphologyEx(src_gpu,dst_gpu,CV_MOP_OPEN,element,
                   buf1,buf2,Point(-1,-1),1,stream);
        stream.enqueueDownload(dst_gpu, dst);

    }
    stream.waitForCompletion();
    double total_time_gpu = end_timer(start_time_1,d);

    cout << "Gain is: " << total_time_cpu / total_time_gpu << endl;
    return 0;
}

我正在使用循环,就好像我在模拟包含 100 帧的视频一样。我正在使用 NVIDIA Corporation GF110 [GeForce GTX 570] 和 Intel Corporation Xeon E5/Core i7 DMI2。此外,我测试了上传和下载的时间,第一帧非常大,但之后上传可以忽略不计,每帧为0.02ms,下载为0.1ms,主要时间消耗是morphologyEx操作.


本次模拟的时间结果如下:

对于 CPU 形态版本,The 100帧的平均时间是:: 0.027349 ms,GPU版本是:: 18.0128 ms

能否请您帮我弄清楚造成这种意外表现的原因可能是什么?!!

非常感谢您。

【问题讨论】:

  • 您能否提供图像大小、处理器的确切型号以及您的系统配置(包括操作系统详细信息)..?
  • 任何gpu函数的第一次调用都包括CUDA上下文初始化,可能需要很长时间。所以第一次测量是异常值,这会影响总平均时间。
  • @scap3y 图像尺寸 540*960。 Ubuntu 12.04 LTS 64 位。英特尔公司至强 E5/Core i7 DMI2(修订版 07)

标签: c++ opencv cuda gpu mathematical-morphology


【解决方案1】:

在初始化时你应该调用:

cv::gpu::setDevice(0);

它将加快初始化速度。

【讨论】:

  • 即使加上了这个初始化,结果还是一模一样?!!! :(
猜你喜欢
  • 1970-01-01
  • 2019-11-06
  • 2019-04-18
  • 2012-10-31
  • 1970-01-01
  • 2015-12-27
  • 1970-01-01
  • 2017-04-05
  • 2019-12-31
相关资源
最近更新 更多