我最近已将OpenCL应用程序从NVIDIA GPU移动到Radeon HD 6320 Fusion在Ubuntu 12.04上运行的融合,并且意外地运行速度较慢。
我的程序将设置上的非常大的数据结构复制到GPU(此数据结构再也不会由CPU读取或访问),然后是:
- 排队几个内核和一个读取缓冲区(将很小的数据结构复制回主内存)。
- 打电话给Clfinish,等待内核和读取缓冲区完成
- 这不断重复,偶尔会根据读取缓冲区返回的信息复制一些额外的数据(这意味着读取缓冲区必须在将下一轮添加到队列之前完成。 )。
在两个GPU进行了分析后,ATI GPU的延迟似乎完全是从第一个内核添加到队列中(cl_profling_command_queque)到第一个内核启动执行(cl_profiling_command_start)。在NVIDIA GPU上,这需要每次迭代几微秒。在ATI GPU上,每次迭代都需要20毫秒,这对于我使用太长了。
有什么原因为什么我可以得到这么大的延迟?
它在AMD平台中的一个已知问题。检查此论坛链接https://community.amd.com/thread/159060希望它是/将被修复
这可能是很多事情,您是否正在运行其他可能需要完成的GPU程序,以便调度程序可以为您腾出时间吗?
问题是OpenCL规范不能定义可能的等待时间。从排队内核到执行的时间不需要时间,仅在某个时候它将执行。我可能会在ATI OpenCL板上发布,那里的开发人员在此主题上有很好的提高,并且可能会给您一个答案。