我最近将一个 OpenCL 应用程序从 NVIDIA GPU 转移到在 Ubuntu 12.04 上运行的 Radeon HD 6320 Fusion,但它的运行速度出乎意料地慢了很多。
我的程序在设置时将一个非常大的数据结构复制到 GPU(CPU 永远不会再次读取或访问此数据结构),然后它:
- 将几个内核和一个读取缓冲区排队(将一个非常小的数据结构复制回主内存)。
- 调用 clFinish 以等待内核和读取缓冲区完成
- 这不断重复,偶尔会根据读取缓冲区返回的信息复制一些额外的数据(这意味着读取缓冲区必须在下一轮内核添加到队列之前完成)。
在分析两个 GPU 之后,ATI GPU 上的延迟似乎完全是从第一个内核被添加到队列 (CL_PROFILING_COMMAND_QUEUED) 到第一个内核开始执行 (CL_PROFILING_COMMAND_START)。在 NVIDIA GPU 上,每次迭代需要几微秒。在 ATI GPU 上,每次迭代大约需要 20 毫秒,这对我来说太长了。
我有什么理由会延迟这么大吗?