OpenCL:异步命令提交速度太慢
我的(不要害怕,这是3D CFD的自动生成代码)表现出奇怪的行为——很多时间都花在opencl_enq_job_*过程(opencl_code.c)中,其中只有异步opencl命令:OpenCL:异步命令提交速度太慢,opencl,nvidia,tesla,Opencl,Nvidia,Tesla,我的(不要害怕,这是3D CFD的自动生成代码)表现出奇怪的行为——很多时间都花在opencl_enq_job_*过程(opencl_code.c)中,其中只有异步opencl命令: clEnqueueWriteBuffer(..,CL_FALSE,...,&event1); clSetKernelArg(...); ... clEnqueueNDRangeKernel(...,1,&event1,&event2); clEnqueueReadBuffer(...,CL_
clEnqueueWriteBuffer(..,CL_FALSE,...,&event1);
clSetKernelArg(...);
...
clEnqueueNDRangeKernel(...,1,&event1,&event2);
clEnqueueReadBuffer(...,CL_FALSE,...,1,&event2,&event3);
clSetEventCallback(event3,...);
clFlush(...);
在程序输出中,在opencl_enq_job_*中花费的时间如下所示:
有机氯废物:0.60456248727985751
这意味着60%的时间浪费在了这些程序上
大部分时间(92%)用于clEnqueueReadBuffer函数,约5%用于clSetEventCallback
为什么这么多?这个代码有什么问题
我的配置:
Platform: NVIDIA CUDA
Device 0: Tesla M2090
Device 1: Tesla M2090
Nvidia cuda_6.0.37 SDK and drivers.
Linux localhost 3.12.0 #6 SMP Thu Apr 17 20:21:10 MSK 2014 x86_64 x86_64 x86_64 GNU/Linux
更新:Nvidia认为这是一个bug
更新1:在我的笔记本电脑(MBP15、AMD GPU、Apple OpenCL)上,程序显示出类似的行为,但在clFlush中等待的时间更多(>99%)。在CUDA SDK上,程序在没有clFlush的情况下工作,在没有clFlush的Apple程序上挂起(提交的任务永远不会完成)。我尝试过内存pining,它显著改善了这种情况 问题解决了
我认为这不是一个真正的错误;我只是在文档中遗漏了一些东西。我的调查得出结论,驱动程序无法执行非固定缓冲区的异步加载/存储——即使使用了非阻塞调用。驱动程序只是等待存储/加载数据的机会,这只能在任务完成后执行,这会破坏并行性。谁能说3k行自动生成的代码有什么问题?你试过小程序吗?这种行为是否只针对一个应用程序,或者API调用通常很慢?我已经定位了一个存在问题的地方,只要看看opencl_code.c中的opencl_enq_job_*过程就可以了。这些过程很小,包含非常简单的代码。对
clenqueueradbuffer
的调用很可能是阻塞的(大多数都是,因为您需要结果),所以它停在那里,等待所有异步操作完成。如果您希望在CPU上同时执行操作,请在另一个线程中执行,或者使用事件回调来知道OpenCL工作何时完成。ClenqueureAdBuffer正在取消阻止(使用CL_FALSE调用)我可以看到并行运行的未完成任务。我已将此作为错误提交给Nvidia,他们复制并接受了它。这将取决于驱动程序/HW。对于许多系统,异步即使在非固定内存上也能工作。顺便说一句:探查器有时会假定所用的时间是由clenqueuredbuffer()使用的
因为这是在继续执行之前挂起的最后一个调用。所以,我不相信任何C分析器(他们不支持底层硬件阻止执行),最好使用OpenCL分析器事件。