Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.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
OpenCL:异步命令提交速度太慢_Opencl_Nvidia_Tesla - Fatal编程技术网

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_

我的(不要害怕,这是3D CFD的自动生成代码)表现出奇怪的行为——很多时间都花在opencl_enq_job_*过程(opencl_code.c)中,其中只有异步opencl命令:

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分析器事件。