Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么数据下载比使用OpenCL在GPU上上传慢得多?_C++_Opencv_Opencl_Gpu - Fatal编程技术网

C++ 为什么数据下载比使用OpenCL在GPU上上传慢得多?

C++ 为什么数据下载比使用OpenCL在GPU上上传慢得多?,c++,opencv,opencl,gpu,C++,Opencv,Opencl,Gpu,我是OpenCL图像处理的初学者,我使用Win7+VS2010+OpenCL2.0+OpenCV247。 我电脑中的平台是intel i7 CPU+NvidIA GTX760 以下是我的作品: 我使用opencv从视频中读取图像(1920*1080),然后复制图像数据并获取数据指针 uchar* input_data=(uchar*)(gray_image->imageData); 然后我想在GPU上做一些卷积和其他图像处理工作,所以我使用OpenCL将这些数据(input_数据)上传

我是OpenCL图像处理的初学者,我使用Win7+VS2010+OpenCL2.0+OpenCV247。 我电脑中的平台是intel i7 CPU+NvidIA GTX760

以下是我的作品:

  • 我使用opencv从视频中读取图像(1920*1080),然后复制图像数据并获取数据指针

    uchar* input_data=(uchar*)(gray_image->imageData);
    
  • 然后我想在GPU上做一些卷积和其他图像处理工作,所以我使用OpenCL将这些数据(input_数据)上传到之前创建的设备内存(cl_input_数据)。上传步骤大约需要0.2ms,速度很快

    clEnqueueWriteBuffer(queue, cl_input_data, 1,
        0, ROI_size*sizeof(cl_uchar), (void*)input_data, 0, 0, NULL);
    
  • 主要的处理工作在几个内核上,每个内核的处理时间都少于0.1ms,这都是很正常的

    clEnqueueNDRangeKernel( queue,kernel_box,2,NULL,global_work_size,local_work_size, 0,NULL, NULL);
    
  • 完成所有处理后,我想将GPU内存(cl_输出_数据)下载到主机(输出_数据),这一步将占用5.5ms!这比数据上传步骤慢近27倍

    clEnqueueReadBuffer( queue,cl_output_data,CL_TRUE,0,ROI_size * sizeof(char),(void*) output_data,0, NULL, NULL );
    
  • 所以,我只是想知道,既然我使用的是同一台设备,而且数据大小完全相同,为什么上传和下载数据的时间如此不同

    哦,顺便说一下,我使用的时间测试工具类似于QueryPerformanceFrequency(&m_Frequency)


    谢谢大家!

    我记得,
    clEnqueueNDRangeKernel
    是异步调用。它将返回控制,而不与设备同步。因此,当您测量
    clEnqueueNDRangeKernel
    的时间时,它只是启动时间,而不是处理时间
    clEnqueueReadBuffer
    强制设备同步,并等待所有以前的内核调用完成。因此,您的5.5ms包括内核执行时间。

    简单的回答是,GPU的设计假设数据从计算机的其余部分进入GPU,然后进入显示器。虽然很明显可以将数据从GPU返回到计算机的其他部分,但这并不是它真正的设计工作方式,所以速度要慢得多。感谢您的回答!!!你的意思是这不是一个不正常的情况,对吗?然而,我记得上传和下载的带宽几乎是一样的。这也让我感到困惑…我不记得确切的数字,所以我不确定这是否完全正常,但总的来说:是的,从GPU读取数据比向GPU写入数据慢一点是正常的。哇~!谢谢!这应该是问题所在!由于内核执行时间和数据下载时间混合在一起,如何逐个检测时间?@daviding您可以尝试clFinish(),然后启动计时器,然后下载缓冲区吗?@daviding您也可以使用OpenCL事件。