opencl中共享内存vs纹理内存

Man*_*mar 2 image-processing opencl

我正在Opencl中编写去隔行代码.我正在使用本地内存中的read_imageui()API读取像素.

就像下面的代码一样:https: //opencl-book-sa​​mples.googlecode.com/svn-history/r29/trunk/src/Chapter_19/oclFlow/lkflow.cl

根据我的理解,当我们使用此API读取像素时,我们正在从纹理内存中读取.我怀疑在共享内存中首先使用像素将有助于我获得任何速度,因为纹理内存已经充当缓存并提供对数据的快速访问.

任何人都可以澄清我的怀疑吗?

Man*_*mar 5

  1. 如果您在使用read_imageui读取所有数据后可以将其放入私有内存中,那么您一定应该这样做.请记住,如果内核编译SIMD16,则每个工作项只有256字节的私有内存;如果编译SIMD8,则只有512字节.

  2. 是否应该使用本地内存实际上取决于访问模式.实际上,Samplers有自己的L1和L2缓存,所以如果你的数据访问总是打到缓存,你应该没问题.请记住,本地存储器已存储,因此您有16个存储区,您可以从中一次获取4个字节,这意味着如果您从一个硬件线程中的所有工作项(通常为16或8)中击中所有16个存储区,则可获得全带宽他们).因此,您可能会首先将图像数据首先读入本地内存,然后以有序的方式访问本地内存.这方面的好例子是像SIFT或SURF这样的算法,你可以通过这种方式访问​​图像,使得采样器缓存真的没有多大帮助(你仍然可以获得采样器插值的好处),但是你将所有数据放在本地存储器中并重复访问它以相当规律的方式.