可以访问图像存储器,如缓冲存储器?

时间:2014-08-01 14:19:41

标签: opencl

我正在考虑将我的内核从缓冲区转换为2d图像。 假设工作组中的16个线程访问16个连续像素 在一行图像中。此访问是否合并?

此外,在(n x m)中读取的最佳访问模式是什么 矩形条,其中m为8或16?

1 个答案:

答案 0 :(得分:2)

在GPU上,通过纹理缓存读取OpenCL图像。细节是依赖于实现的,通常不会记录,但通常它们存储在tile中以供参考。因此,如果相邻工作项正在访问附近的像素,则读取的速度很快。

由于纹理缓存,术语“合并”仅适用于缓冲区读取。

与合并的缓冲液读数相比,图像可能稍慢;然而,与未合并的缓冲区读数相比,但是具有一定的局部性,它们可以更快。

一个很好的例子是高斯模糊分解为垂直传递和水平传递:当你在列中进行垂直传递时,使用缓冲区会得到合并读取但是当你进行水平传递时你不会得到合并读取所以它是非常慢。所以这些示例都有一个转置步骤,它使用共享的本地内存和合并的读写,因此您可以重新使用垂直传递内核来执行水平传递,然后转置回来。一切都很好,但有了图像,你可以跳过转置,因为垂直和水平通道都是相同的速度(比合并的缓冲区读取稍慢,但比未合并的缓冲区读取速度快)。总的来说它更快,因为你可以跳过两个转置内核。

我希望有关磁贴,纹理缓存和参考位置的部分有助于回答有关访问模式的问题。

警告:有一些方法可以从缓冲区创建图像,但内存布局是线性的而不是平铺的,因此上面是窗外(您可以预期水平相邻的读取将被缓存,而不是垂直相邻的读取)。