2014-01-10 129 views
1

我正在編寫一個C++代碼,用於比較使用CPU和GPU版本的openCv的morphologyEx方法的性能。這裏是我的代碼:gpu :: morphologyEx比CPU更慢嗎?

#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形態版本,100幀的 平均時間是:: 0.027349毫秒和用於GPU的版本是:: 18.0128毫秒

請你幫我弄清楚可能是什麼原因導致這種意外的表現?

非常感謝您提前。

+1

你能給出圖像大小,處理器的確切型號和你的系統配置(包括操作系統細節)..? – scap3y

+1

任何GPU函數的第一次調用包括CUDA上下文初始化,可能需要很長時間。所以第一次測量是異常的,這會影響總的平均時間。 – jet47

+0

@ scap3y圖片尺寸540 * 960。 Ubuntu 12.04 LTS 64位。英特爾公司Xeon E5 /酷睿i7 DMI2(rev 07) –

回答

1

在初始化你應該叫:

cv::gpu::setDevice(0); 

這將加快初始化。

+0

即使加入了這個初始化後,結果仍然完全一樣? :( –