I am writing deinterlacing code in Opencl. I am reading the pixels using read_imageui() API in the local memory.
Just like the code at: https://opencl-book-samples.googlecode.com/svn-history/r29/trunk/src/Chapter_19/oclFlow/lkflow.cl
As per my understanding when we read pixels using this API we are reading from the Texture memory. I am doubtful that using the pixels first in shared memory will help me gaining any speed as Texture memory already acts as cache and provides fast access to data.
Can anyone clarify my doubt ?
答案 0 :(得分:5)
如果您在使用read_imageui阅读后可以将所有数据放入私有内存中,那么您一定要这样做。请记住,如果内核编译SIMD16,则每个工作项只有256字节的私有内存;如果编译SIMD8,则只有512字节。
是否应该使用本地内存实际上取决于访问模式。实际上,Samplers有自己的L1和L2缓存,所以如果你的数据访问总是打到缓存,你应该没问题。请记住,本地存储器已存储,因此您有16个存储区,您可以从中一次获取4个字节,这意味着如果您从一个硬件线程中的所有工作项(通常为16或8)中击中所有16个存储区,则可获得全带宽他们)。因此,您可能会首先将图像数据首先读入本地内存,然后以有序的方式访问本地内存。很好的例子是像SIFT或SURF这样的算法,你可以通过这种方式访问图像,使得采样器缓存真的没有多大帮助(你仍然可以获得采样器插值的好处),但是你将所有数据放在本地存储器中并重复访问它以相当规律的方式。
答案 1 :(得分:1)
总的来说,这是真的。但是,即使来自纹理的高速缓存读取可能比从共享本地存储器读取慢,因此对于使得来自相邻位置的许多重叠读取的算法仍然可以从使用共享本地存储器中获益。但是,它会使内核更复杂,因此对于许多情况(当然在算法开发期间)只需依赖缓存的纹理读取。