【发布时间】:2015-05-24 15:45:42
【问题描述】:
这是我第一次在 ARM 上使用 openCL(CPU:Qualcomm Snapdragon MSM8930,GPU:Adreno(TM)305)。
我发现使用 openCL 确实非常有效,但是 CPU 和 GPU 之间的数据交换需要太多时间,我无法成像。
这是一个例子:
cv::Mat mat(640,480,CV_8UC3,cv::Scalar(0,0,0));
cv::ocl::oclMat mat_ocl;
//cpu->gpu
mat_ocl.upload(mat);
//gpu->cpu
mat = (cv::Mat)mat_ocl;
就这样一张小图,上传选项需要10ms,下载选项需要20ms!这需要的时间太长了。
谁能告诉我这种情况正常吗?或者这里出了什么问题?
提前谢谢你!
添加:
我的打法是
clock_t start,end;
start=clock();
mat_ocl.upload(mat);
end = clock();
__android_log_print(ANDROID_LOG_INFO,"tag","upload time = %f s",(double)(end-start)/CLOCKS_PER_SEC);
实际上,我并没有完全使用 openCL,而是 openCV 中的 ocl 模块(尽管它说它们是相等的)。在阅读openCV文档时,我发现它只是告诉我们将cv::Mat转换为cv::ocl::oclMat(即从CPU上传到GPU的数据)来进行GPU计算,但我没有找到内存映射方法ocl 模块文档。
【问题讨论】:
-
您如何衡量上传/下载时间?
-
您的传输硬件带宽是多少?
-
我还没有找到硬件带宽参数,只能说处理器是高通骁龙MSM8930,GPU是Adreno(TM)305。
-
rossi_lhf,你的操作系统是什么?
clock()通常是最不精确的(在某些配置为将所有报告时间四舍五入为 10 毫秒的内核上),尝试使用gettimeofday()或clock_gettime()测量时间 - 检查 stackoverflow.com/questions/8594277/clock-precision-in-time-h。您还可以测量多个复制操作的时间(循环 10 次上传,或 50 次上传) -
我的操作系统是 android 4.2.2。实际上,我确实测量了几次复制操作的时间,所以时间 10ms 和 20ms 是平均时间。