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

时间:2015-10-28 12:54:23

标签: opencl gpu gpgpu

Pipe是OpenCL 2.0的新功能之一,此功能已在AMDAPPSDK的生产者/消费者示例中得到证明。我已经阅读了一些与管道用例相关的文章,它们都像生产者/消费者一样。

我的问题是,在OpenCL 2.0提供共享虚拟内存的情况下,通过创建全局内存空间/对象并将指针传递给2个内核函数,可以实现相同的功能。那么管道对象和全局内存对象之间的区别是什么?或者它是为了优化而发明的?

3 个答案:

答案 0 :(得分:2)

它与std::vectorstd::queue一样有用。 一个用于存储数据,而另一个用于存储数据包。

数据包确实是数据,但是将它们作为小单位而不是大块处理起来要容易得多。

OpenCL中的管道允许您在内核中使用这些小数据包,而不必处理索引+存储+指针+ forloops地狱,如果您在内核中自己手动实现管道机制,那将会发生。

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

管道旨在将数据从一个内核传输到另一个内核,而无需在全局或主机内存中存储/加载数据。这实际上是FPGA器件上的FIFO。因此,数据的访问速度比通过DDR或主机内存快得多。这可能是使用FPGA作为加速器的原因。

有时DDR也用于在内核之间共享数据。一个例子是SIMD内核想要与单个任务内核共享一些数据,并且要求输入数据序列。因为,管道将以SIMD方式运行。

除了Pipes之外,您还可以使用Altera通道获得更多功能支持。但这对其他OpenCL设备来说无法移植。

希望这可以提供帮助。 :)