【问题标题】:OpenCL 2.x pipes - how do they actually work?OpenCL 2.x 管道 - 它们实际上是如何工作的?
【发布时间】:2016-08-04 22:18:08
【问题描述】:

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

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

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

【问题讨论】:

    标签: opencl gpgpu pipeline opencl-pipes


    【解决方案1】:

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

    【讨论】:

    • 我要补充一点,在 CUDA 上模拟管道对于全局缓冲区、保留缓冲区和原子来说是相当简单的。另外,我相信 AMD 上的管道使用本地内存作为保留缓冲区。
    • @JohnsPaul:“更好的缓存命中率”——您是指 L2 缓存还是特定于内核的 L1 缓存?并且 - AMD GPU 或其驱动程序是否能够“优先”来自上次生成管道数据的同一内核的管道消费者,而不是其他内核上的消费者,以便利用 L1 缓存?
    • @AndreasPapadopoulos:1. 避免由于使用原子同步而牺牲性能可能不是那么简单。 2. 看到不同内核上的工作组需要进行预留,使用本地内存作为预留缓冲区如何工作?
    • @einpoklum:我说的是 L2 缓存,它在所有 GPU 内核之间共享。我不确定 L1 缓存。
    • @einpoklum 没有“牺牲性能”,GPU 上的 OpenCL 管道也可能使用原子。事实上,GPU 上的管道 API 主要是语法糖。预留缓冲区是每个工作项/工作组的。
    猜你喜欢
    • 2014-09-08
    • 2013-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-05
    • 1970-01-01
    • 1970-01-01
    • 2021-01-21
    相关资源
    最近更新 更多