我正在使用笔记本电脑的opencv242 + VS2010.
我试图对OpenCV中的GPU块进行一些简单测试,但它表明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 …Run Code Online (Sandbox Code Playgroud) 汉明距离:
例如,两个二进制数:1011和1000的HD(汉明距离)是2.
10000和01111的HD是5.
这是代码:
有人可以向我解释一下吗?
谢谢!
short HammingDist(short x, short y)
{
short dist = 0;
char val = x^y;// what's the meaning?
while(val)
{
++dist;
val &= val - 1; // why?
}
return dist;
}
Run Code Online (Sandbox Code Playgroud) 在我的理解中,全连接层(简称fc)用于预测。
例如,VGG Net 使用了 2 个 fc 层,均为 4096 维。softmax 的最后一层的维度与类 num:1000 相同。
但对于resnet,它使用全局平均池化,并使用最后一个卷积层的池化结果作为输入。
但他们还有FC层!这层真的是fc层吗?或者这一层只是将输入输入到特征向量中,其中的数字是类别数?该层有预测结果的功能吗?
总之,resnet和VGGnet有多少个fc层?VGGnet的第1、2、3个fc层有不同的功能吗?
我想知道本地内存的优势.由于全局内存可以单独和自由地获取项目.我们不能只使用全局内存吗?
例如,我们有一个1000*1000的图像,我们想要添加每个像素值1.我们可以使用1000*1000的全局内存吗?
如果我们使用本地内存并将1000*1000图像转换为100个100*100个部分,我们会更快吗?
如果你给我一个简单的本地记忆代码,我会非常感谢你.
我是OpenCL图像处理的初学者,我使用的是Win7 + VS2010 + OpenCL2.0 + OpenCV247.我的PC平台是intel i7 CPU + NvidIA GTX760.
这是我的工作:
我使用opencv从视频中读取图像(1920*1080),然后复制图像数据并获取数据指针.
uchar* input_data=(uchar*)(gray_image->imageData);
Run Code Online (Sandbox Code Playgroud)然后我想在GPU上进行一些卷积和其他图像处理工作,所以我使用OpenCL将这些数据(input_data)上传到之前创建的设备存储器(cl_input_data).上传步骤大约需要0.2ms,速度很快.
clEnqueueWriteBuffer(queue, cl_input_data, 1,
0, ROI_size*sizeof(cl_uchar), (void*)input_data, 0, 0, NULL);
Run Code Online (Sandbox Code Playgroud)主要处理工作在几个内核上,每个内核都需要不到0.1毫秒,这些内核都非常正常.
clEnqueueNDRangeKernel( queue,kernel_box,2,NULL,global_work_size,local_work_size, 0,NULL, NULL);
Run Code Online (Sandbox Code Playgroud)完成所有处理后,我想将GPU内存(cl_output_data)下载到主机(output_data),这一步需要5.5ms!这比数据上传步骤慢近27倍!
clEnqueueReadBuffer( queue,cl_output_data,CL_TRUE,0,ROI_size * sizeof(char),(void*) output_data,0, NULL, NULL );
Run Code Online (Sandbox Code Playgroud)所以,我只是想知道,因为我使用相同的设备并且数据大小完全相同,为什么上传和下载数据的时间如此不同?
哦,顺便说一句,我使用的时间测试工具就像QueryPerformanceFrequency(&m_Frequency);
谢谢!
他们可以将数据从主机传输到设备吗?那么,有什么区别?一个人需要创建缓冲区吗?谢谢!
关于khronos网站的解释:
clEnqueueMapBuffer:
将命令排队以将缓冲区给定的缓冲区对象的区域映射到主机地址空间,并返回指向此映射区域的指针.
clEnqueueWriteBuffer
将命令排入队列以从主机内存写入缓冲区对象.