OpenCL 2.x管道 - 它们实际上如何工作?

时间:2016-08-04 22:18:09

标签: opencl gpgpu pipeline opencl-pipes

我已阅读OpenCL 2.x管道API的this description,并通过khronos.org上的Pipe API pages进行了宣传。我觉得有点嫉妒,几乎完全在CUDA工作,这个漂亮的功能仅在OpenCL中可用(并且抱歉CUDA功能未被OpenCL正确包含,但这是一个不同的问题),所以我想我和#39 ;请问"为什么CUDA没有管道机制"。但后来我意识到我甚至都不知道这究竟意味着什么。所以,相反,我会问:

  1. OpenCL管道如何在AMD独立GPU / APU上运行? ...

    • 什么信息写在哪里?
    • 如何通过使用管道来调度内核工作组到核心的影响?
    • 管道内核是否被编译在一起(例如,他们的SPIR表单)?
    • 管道的使用是否允许通过特定于核心的缓存("本地内存"在OpenCL用语中,"共享内存"在CUDA用语中)在不同内核之间传递数据?那太棒了。
  2. 有没有办法管道"假设"一般来说,在GPU上工作?即API作者设想甚至以书面形式提出的内容?
  3. OpenCL管道如何在基于CPU的OpenCL实现中工作?

1 个答案:

答案 0 :(得分:5)

OpenCL管道与OpenCL 2.0一起被引入。在GPU上,OpenCL管道就像一个具有受控访问权限的全局内存缓冲区,即您可以限制允许同时写入/读取管道的工作组数量。这种允许我们重用相同的缓冲区或管道,而不必担心来自多个工作组的冲突读取或写入。据我所知,OpenCL管道不使用GPU本地内存。但是,如果您仔细调整管道的大小,则可以增加缓存命中数,从而实现更好的整体性能。关于何时应使用管道,没有一般规则。我使用管道在两个同时运行的内核之间传递数据,这样我的程序可以通过更好的缓存命中率实现更好的整体性能。这与OpenCL管道在CPU中的工作方式相同(它只是一个全局缓冲区,如果它足够小,可能适合系统缓存)。但是在像FPGA这样的设备上,它们以不同的方式工作。管道使用本地内存而不是这些设备中的全局内存,因此使用全局内存缓冲区可以获得相当高的性能。