Opencl 对图像内存的访问可以像缓冲内存一样合并吗?

Opencl 对图像内存的访问可以像缓冲内存一样合并吗?,opencl,Opencl,我正在考虑将内核从缓冲区转换为2d图像。 假设一个工作组中的16个线程访问16个连续像素 在图像的一行中。这条通道是合并的吗 另外,在(nxm)中读取的最佳访问模式是什么 矩形条带,其中m在GPU上为8或16?,OpenCL图像通过纹理缓存读取。详细信息依赖于实现,通常不记录,但通常存储在分幅中以供参考。因此,如果相邻的工作项正在访问附近的像素,则很有可能读取速度会很快 由于纹理缓存,术语“合并”仅适用于缓冲区读取 与合并缓冲区读取相比,图像可能稍微慢一些;但是,与未合并的缓冲区读取(但具有一定

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

另外,在(nxm)中读取的最佳访问模式是什么
矩形条带,其中m在GPU上为8或16?

,OpenCL图像通过纹理缓存读取。详细信息依赖于实现,通常不记录,但通常存储在分幅中以供参考。因此,如果相邻的工作项正在访问附近的像素,则很有可能读取速度会很快

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

与合并缓冲区读取相比,图像可能稍微慢一些;但是,与未合并的缓冲区读取(但具有一定的局部性)相比,它们可以更快

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

我希望有关平铺、纹理缓存和引用位置的部分能够帮助您回答有关访问模式的问题


警告:有几种方法可以从缓冲区创建图像,但是内存布局是线性的,而不是平铺的,因此上面的内容是不在窗口中的(您可以期望缓存水平相邻的读取,而不是垂直相邻的读取)。

谢谢您,Dithermaster!我认为使用图像将大大简化我的算法。目前,我正在做您描述的事情:将数据条读入本地内存(使用合并读取),然后在本地内存上执行水平步骤,并将其写回缓冲区。但对于图像,我可以省去本地内存,也不用担心银行冲突。我发现图像在CPU上运行时比缓冲区慢得多。但这对我来说是有意义的,因为CPU缺乏纹理硬件。此外,图像提供了一些很好的功能,如边界镜像,这是我的算法所需要的。