gpt4 book ai didi

c++ - 为什么 Opencv GPU 代码比 CPU 慢?

转载 作者:IT老高 更新时间:2023-10-28 23:22:17 24 4
gpt4 key购买 nike

我在笔记本上使用opencv242 + VS2010。
我试图在 OpenCV 中对 GPU block 进行一些简单的测试,但它显示 GPU 比 CPU 代码慢 100 倍。在这段代码中,我只是将彩色图像转为灰度图像,使用 cvtColor

的功能

这是我的代码,PART1 是 CPU 代码(测试 cpu RGB2GRAY),PART2 是上传图像到 GPU,PART3 是 GPU RGB2GRAY,PART4 是 CPU RGB2GRAY。 有三件事让我很想知道:

1 在我的代码中,part1是0.3ms,而part4(和part1完全一样)是40ms!!!
2 上传图片到GPU的part2是6000ms!!!
3 Part3(GPU代码)是11ms,对于这个简单的图像来说太慢了!

    #include "StdAfx.h"
#include <iostream>
#include "opencv2/opencv.hpp"
#include "opencv2/gpu/gpu.hpp"
#include "opencv2/gpu/gpumat.hpp"
#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <cuda.h>
#include <cuda_runtime_api.h>
#include <ctime>
#include <windows.h>

using namespace std;
using namespace cv;
using namespace cv::gpu;

int main()
{
LARGE_INTEGER freq;
LONGLONG QPart1,QPart6;
double dfMinus, dfFreq, dfTim;
QueryPerformanceFrequency(&freq);
dfFreq = (double)freq.QuadPart;

cout<<getCudaEnabledDeviceCount()<<endl;
Mat img_src = imread("d:\\CUDA\\train.png", 1);

// PART1 CPU code~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// From color image to grayscale image.
QueryPerformanceCounter(&freq);
QPart1 = freq.QuadPart;
Mat img_gray;
cvtColor(img_src,img_gray,CV_BGR2GRAY);
QueryPerformanceCounter(&freq);
QPart6 = freq.QuadPart;
dfMinus = (double)(QPart6 - QPart1);
dfTim = 1000 * dfMinus / dfFreq;
printf("CPU RGB2GRAY running time is %.2f ms\n\n",dfTim);

// PART2 GPU upload image~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
GpuMat gimg_src;
QueryPerformanceCounter(&freq);
QPart1 = freq.QuadPart;
gimg_src.upload(img_src);
QueryPerformanceCounter(&freq);
QPart6 = freq.QuadPart;
dfMinus = (double)(QPart6 - QPart1);
dfTim = 1000 * dfMinus / dfFreq;
printf("Read image running time is %.2f ms\n\n",dfTim);

GpuMat dst1;
QueryPerformanceCounter(&freq);
QPart1 = freq.QuadPart;

/*dst.upload(src_host);*/
dst1.upload(imread("d:\\CUDA\\train.png", 1));

QueryPerformanceCounter(&freq);
QPart6 = freq.QuadPart;
dfMinus = (double)(QPart6 - QPart1);
dfTim = 1000 * dfMinus / dfFreq;
printf("Read image running time 2 is %.2f ms\n\n",dfTim);

// PART3~ GPU code~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// gpuimage From color image to grayscale image.
QueryPerformanceCounter(&freq);
QPart1 = freq.QuadPart;

GpuMat gimg_gray;
gpu::cvtColor(gimg_src,gimg_gray,CV_BGR2GRAY);

QueryPerformanceCounter(&freq);
QPart6 = freq.QuadPart;
dfMinus = (double)(QPart6 - QPart1);
dfTim = 1000 * dfMinus / dfFreq;
printf("GPU RGB2GRAY running time is %.2f ms\n\n",dfTim);

// PART4~CPU code(again)~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

// gpuimage From color image to grayscale image.
QueryPerformanceCounter(&freq);
QPart1 = freq.QuadPart;
Mat img_gray2;
cvtColor(img_src,img_gray2,CV_BGR2GRAY);
BOOL i_test=QueryPerformanceCounter(&freq);
printf("%d \n",i_test);
QPart6 = freq.QuadPart;
dfMinus = (double)(QPart6 - QPart1);
dfTim = 1000 * dfMinus / dfFreq;
printf("CPU RGB2GRAY running time is %.2f ms\n\n",dfTim);

cvWaitKey();
getchar();
return 0;
}

最佳答案

上面的大多数答案实际上都是错误的。它之所以慢 20.000 倍的原因当然不是因为“CPU 时钟速度更快”和“它必须将其复制到 GPU”(已接受的答案)。这些都是因素,但是说你忽略了一个事实,即你有更多的计算能力来解决一个令人作呕的并行问题。说 20.000 倍的性能差异是因为后者实在是太荒谬了。这里的作者知道出了点问题,这不是直截了当的。解决方案:

你的问题是 CUDA 需要初始化!它总是会初始化第一张图像,一般需要 1-10 秒,具体取决于木星和火星的对齐方式。现在试试这个。计算两次,然后对它们进行计时。在这种情况下,您可能会看到速度在同一数量级内,而不是 20.000 倍,这太荒谬了。你能对这个初始化做点什么吗?不,不是我所知道的。这是一个障碍。

编辑:我刚刚重新阅读了这篇文章。你说你在笔记本上运行。那些通常有破旧的 GPU,而 CPU 的速度还不错。

关于c++ - 为什么 Opencv GPU 代码比 CPU 慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12074281/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com