Я пишу код на C ++ для сравнения производительности метода morphologyEx в opencv с использованием версий CPU и GPU. Вот мой код:
#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,02 мс на кадр, загрузка составляет 0,1 мс, а основное потребление времени связано с операцией morphologyEx. ,
Результаты времени для этого моделирования следующие:
для версии морфологии процессора, The
среднее время 100 кадров составляет :: 0,027349 мс, а для версии графического процессора: 18,0128 мсНе могли бы вы помочь мне выяснить, в чем причина такого неожиданного выступления? !!
Огромное спасибо заранее.
При инициализации вы должны позвонить:
cv::gpu::setDevice(0);
Это ускорит инициализацию.
Других решений пока нет …