我已阅读 OpenCL 2.x 管道 API 的此描述,并浏览了 khronos.org 上的Pipe API 页面。我几乎完全在 CUDA 中工作,对这个仅在 OpenCL 中可用的漂亮功能感到有点嫉妒(很抱歉 CUDA 功能尚未正确包含在 OpenCL 中,但这是一个不同的问题),所以我想我会问“如何CUDA 没有管道机制”。但后来我意识到我什至不知道这到底意味着什么。所以,我会问:
OpenCL 管道如何在 AMD 独立 GPU / APU 上工作? ...
OpenCL 管道与 OpenCL 2.0 一起引入。在 GPU 上,OpenCL 管道就像具有受控访问的全局内存缓冲区,即您可以限制允许同时向管道写入/读取的工作组数量。这种方式允许我们重复使用相同的缓冲区或管道,而不必担心来自多个工作组的读或写冲突。据我所知,OpenCL 管道不使用 GPU 本地内存。但是,如果您仔细调整管道的大小,则可以增加缓存命中率,从而实现更好的整体性能。对于何时应使用管道没有一般规则。我使用管道在两个并发运行的内核之间传递数据,以便我的程序由于更好的缓存命中率而获得更好的整体性能。这与 OpenCL 管道在 CPU 中的工作方式相同(它只是一个全局缓冲区,如果足够小,可能适合系统缓存)。但在 FPGA 等设备上,它们以不同的方式工作。这些管道在这些设备中使用本地内存而不是全局内存,因此比使用全局内存缓冲区获得更高的性能。