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

 陈哲瑋66832 发布于 2023-02-07 15:50

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

这是我的工作:

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

    uchar* input_data=(uchar*)(gray_image->imageData);
    

    然后我想在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);
    

    主要处理工作在几个内核上,每个内核都需要不到0.1毫秒,这些内核都非常正常.

    clEnqueueNDRangeKernel( queue,kernel_box,2,NULL,global_work_size,local_work_size, 0,NULL, NULL);
    

    完成所有处理后,我想将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 );
    

所以,我只是想知道,因为我使用相同的设备并且数据大小完全相同,为什么上传和下载数据的时间如此不同?

哦,顺便说一句,我使用的时间测试工具就像QueryPerformanceFrequency(&m_Frequency);

谢谢!

1 个回答
  • 我记得,clEnqueueNDRangeKernel是异步调用.它将在不与设备同步的情况下返回控制.所以,当你测量时间时clEnqueueNDRangeKernel,它只是一个发射时间,而不是处理时间.clEnqueueReadBuffer强制设备同步并等待所有先前的内核调用完成.因此,您的5.5毫秒包括内核执行时间.

    2023-02-07 15:52 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有