我正在 Opencl 中编写去隔行扫描代码。我正在使用本地内存中的 read_imageui() API 读取像素。
就像下面的代码: https://opencl-book-samples.googlecode.com/svn-history/r29/trunk/src/Chapter_19/oclFlow/lkflow.cl
根据我的理解,当我们使用此 API 读取像素时,我们是从纹理内存中读取的。我怀疑在共享内存中首先使用像素是否会帮助我获得任何速度,因为纹理内存已经充当缓存并提供对数据的快速访问。
谁能解开我的疑惑?
最佳答案
如果您可以在使用 read_imageui 读取数据后将所有数据放入私有(private)内存中,那么您绝对应该这样做。请记住,如果您的内核编译 SIMD16,则每个工作项只有 256 字节的私有(private)内存;如果编译 SIMD8,则只有 512 字节。
是否应该使用本地内存实际上取决于访问模式。事实上,采样器有自己的 L1 和 L2 缓存,所以如果你的数据访问总是命中缓存,你应该没问题。请记住,本地内存是分块的,因此您有 16 个内存块,一次可以从中获取 4 个字节,这意味着如果您从一个硬件线程(通常为 16 或 8 个)中的所有工作项访问所有 16 个内存块,您将获得全带宽其中)。因此,您可能会遇到这样一种情况,您最好先将图像数据读入本地内存,然后以有序的方式访问本地内存。这方面的一个很好的例子是像 SIFT 或 SURF 这样的算法,在这些算法中,您以采样器缓存确实没有多大帮助的方式访问图像(您仍然可以获得采样器插值的好处),但随后您将所有数据放在本地内存中并重复访问它以相当规则的模式。
关于image-processing - opencl中的共享内存与纹理内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31139774/