Pipe是OpenCL 2.0的新功能之一,此功能已在AMDAPPSDK的生产者/消费者示例中得到证明。我已经阅读了一些与管道用例相关的文章,它们都像生产者/消费者一样。
我的问题是,在OpenCL 2.0提供共享虚拟内存的情况下,通过创建全局内存空间/对象并将指针传递给2个内核函数,可以实现相同的功能。那么管道对象和全局内存对象之间的区别是什么?或者它是为了优化而发明的?
答案 0 :(得分:2)
它与std::vector
和std::queue
一样有用。
一个用于存储数据,而另一个用于存储数据包。
数据包确实是数据,但是将它们作为小单位而不是大块处理起来要容易得多。
OpenCL中的管道允许您在内核中使用这些小数据包,而不必处理索引+存储+指针+ forloops地狱,如果您在内核中自己手动实现管道机制,那将会发生。
答案 1 :(得分:2)
管道非常有用,例如,当每个工作项可以生成可变数量的输出时。在OpenCL 2.0之前,这很难处理。
管道可以驻留在更快的内存中(特定于供应商),即Altera建议使用管道在内核之间交换数据,而不是使用全局内存。
答案 2 :(得分:1)
管道旨在将数据从一个内核传输到另一个内核,而无需在全局或主机内存中存储/加载数据。这实际上是FPGA器件上的FIFO。因此,数据的访问速度比通过DDR或主机内存快得多。这可能是使用FPGA作为加速器的原因。
有时DDR也用于在内核之间共享数据。一个例子是SIMD内核想要与单个任务内核共享一些数据,并且要求输入数据序列。因为,管道将以SIMD方式运行。
除了Pipes之外,您还可以使用Altera通道获得更多功能支持。但这对其他OpenCL设备来说无法移植。
希望这可以提供帮助。 :)