OpenCL2.x管道-它们实际上是如何工作的?

OpenCL2.x管道-它们实际上是如何工作的?,opencl,gpgpu,pipeline,opencl-pipes,Opencl,Gpgpu,Pipeline,Opencl Pipes,我已经阅读了OpenCL2.x管道API,并在khronos.org上介绍了。我有点嫉妒,在CUDA工作时几乎完全是这样,这个只有OpenCL才能使用的漂亮功能(很抱歉,OpenCL没有适当地包含CUDA功能,但这是另一个问题),所以我想我会问“为什么CUDA没有管道机制?”。但后来我意识到我甚至不知道那到底意味着什么。因此,我要问: OpenCL管道如何在AMD离散GPU/APU上工作 什么信息写在哪里 使用管道如何影响内核工作组到内核的调度 管道内核是一起编译的吗(比如说,它们的SPIR形

我已经阅读了OpenCL2.x管道API,并在khronos.org上介绍了。我有点嫉妒,在CUDA工作时几乎完全是这样,这个只有OpenCL才能使用的漂亮功能(很抱歉,OpenCL没有适当地包含CUDA功能,但这是另一个问题),所以我想我会问“为什么CUDA没有管道机制?”。但后来我意识到我甚至不知道那到底意味着什么。因此,我要问:

  • OpenCL管道如何在AMD离散GPU/APU上工作

    • 什么信息写在哪里
    • 使用管道如何影响内核工作组到内核的调度
    • 管道内核是一起编译的吗(比如说,它们的SPIR形式)
    • 管道的使用是否允许通过特定于内核的缓存(OpenCL术语中的“本地内存”,CUDA术语中的“共享内存”)在不同内核之间传递数据?那太棒了
  • 一般来说,有没有一种方法可以让管道在GPU上工作?i、 e.API作者设想的东西,甚至是写出来的东西
  • OpenCL管道如何在基于CPU的OpenCL实现中工作

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

    我要补充的是,使用全局缓冲区、保留缓冲区和原子时,CUDA上的模拟管道相当简单。另外,我相信AMD上的管道使用本地内存作为保留缓冲区。@JohnsPaul:“更好的缓存命中率”-你是指二级缓存还是特定于核心的一级缓存?和-AMD GPU或其驱动程序是否能够“偏好”来自上次生成管道数据的同一内核的管道使用者,而不是其他内核上的使用者,从而利用一级缓存?@AndreasPapadopoulos:1。避免由于使用原子进行同步而牺牲性能可能不是那么简单。2.看到不同内核上的工作组需要进行保留,使用本地内存进行保留缓冲区将如何工作?@einpoklum:我说的是所有GPU内核共享的二级缓存。我不确定一级缓存。@einpoklum没有“牺牲性能”,GPU上的OpenCL管道也可能使用原子。事实上,GPU上的管道API主要是语法。保留缓冲区是每个工作项/工作组的缓冲区。