普通内存对象和OpenCL的管道之间有什么不同?

3
管道是OpenCL 2.0的新特性之一,这个特性已经在AMDAPPSDK的生产者/消费者示例中得到了演示。我已经阅读过一些关于管道用例的文章,它们都像生产者/消费者那样。
我的问题是,通过创建一个全局内存空间/对象并将指针传递给两个内核函数,可以实现相同的功能,因为OpenCL 2.0提供了共享虚拟内存。那么管道对象和全局内存对象有什么区别?或者它是只为优化而发明的?
3个回答

2

它与std::vectorstd::queue一样有用。

一个用于存储数据,而另一个用于存储数据包。

数据包确实是数据,但将其作为小单元处理比作为大块处理要容易得多。

在OpenCL中,管道允许您在内核中消耗这些小数据包,而无需处理索引+存储+指针+for循环混乱的情况,如果您在内核中手动实现管道机制,则会发生这种情况。


1
那么管道就只是一组实用函数,对吗? - deicide

2

管道在每个工作项生成可变数量的输出时非常有用。在 OpenCL 2.0 之前,这很难处理。

管道可以驻留在更快的内存中(供应商特定),例如 Altera 建议使用管道在内核之间交换数据,而不是使用全局内存。


1
管道旨在将数据从一个内核传输到另一个内核,而无需将数据存储/加载到全局或主机内存中。这本质上是FPGA设备上的先进先出队列。因此,访问数据的速度比通过DDR或主机内存的速度要快得多。这可能是使用FPGA作为加速器的原因。

有时,DDR也用于在内核之间共享数据。一个例子是,SIMD内核希望与具有对输入数据序列的要求的单个任务内核共享一些数据。由于管道会以SIMD方式无序运行。

除了管道外,您还可以使用Altera通道进行更多的功能支持。但这不适用于其他OpenCL设备。

希望这可以帮助。 :)


1
我理解你的答案是基于FPGA的。但是在GPU方面使用管道是否有类似的优势(例如能够使用更快的内存)?因为当我尝试在GPU上使用管道时,管道似乎正在使用全局内存(因为没有运行时改进)。所以,在可能使用普通缓冲区(在GPU上)的情况下,使用管道是否有性能优势? - Johns Paul
@JohnsPaul 说实话,我对GPU编程不是很熟悉。但根据OpenCL框架,应该有私有/本地内存空间,其访问速度比全局快。也许可以查看GPU供应商手册,看管道是如何实现的?如果只是将数据路由到全局,则我认为通过管道很难获得任何性能提升。 - liuyz
好的。我正在使用AMD A10 APU,但是我找不到任何关于我正在使用的A10设备上管道实现细节的文档。我编写了一些测试程序,以查看如果我们使用管道而不是全局缓冲区是否有性能提升。从这些测试中,由于需要实现管道的额外同步(例如调用reserve_pipe),性能只会变得更差。无论如何,还是谢谢 :) - Johns Paul
@JohnsPaul,感谢您告诉我们您的发现 :) - liuyz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接