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

ein*_*ica 3 pipeline gpgpu opencl opencl-pipes

我已经阅读了OpenCL 2.x管道API的这个描述,并通过khronos.org上的Pipe API页面引导.我觉得有点嫉妒,几乎完全在CUDA工作,这个漂亮的功能仅在OpenCL中可用(并且抱歉CUDA功能未被OpenCL正确包含,但这是一个不同的问题),所以我想我会问"如何来CUDA没有管道机制".但后来我意识到我甚至都不知道那究竟是什么意思.所以,相反,我会问:

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

    • 什么信息写在哪里?
    • 如何通过使用管道来实现内核工作组到核心的调度?
    • 管道内核是否被编译在一起(例如,他们的SPIR表单)?
    • 管道的使用是否允许通过特定于核心的高速缓存在不同内核之间传递数据(OpenCL用语中的"本地存储器",CUDA用语中的"共享存储器")?那将是真棒.
  2. 有没有一种方法管道"应该"在GPU上工作?即API作者设想甚至是书面形式的东西?
  3. OpenCL管道如何在基于CPU的OpenCL实现中工作?

Joh*_*aul 5

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