4

我已经阅读了 OpenCL 2.x 管道 API 的描述,并通过khronos.org上的管道 API 页面进行了介绍。我有点嫉妒,几乎完全在 CUDA 中工作,这个漂亮的功能只在 OpenCL 中可用(很抱歉,CUDA 功能没有被 OpenCL 正确包含,但这是一个不同的问题),所以我想我会问“如何来吧 CUDA 没有管道机制”。但后来我意识到我什至不知道这到底意味着什么。所以,相反,我会问:

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

    • 什么信息写在哪里?
    • 使用管道如何影响内核工作组到内核的调度?
    • 管道内核是否一起编译(例如,它们的 SPIR 形式)?
    • 管道的使用是否允许通过特定于内核的缓存(OpenCL 术语中的“本地内存”,CUDA 术语中的“共享内存”)在不同内核之间传递数据?那将是真棒。
  2. 一般来说,管道是否“应该”在 GPU 上工作?即API作者设想甚至写成的东西?
  3. OpenCL 管道如何在基于 CPU 的 OpenCL 实现中工作?
4

1 回答 1

5

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

于 2016-08-05T03:59:22.517 回答