image-processing - opencl中的共享内存与纹理内存

标签 image-processing opencl

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

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

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

谁能解开我的疑惑?

最佳答案

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

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

关于image-processing - opencl中的共享内存与纹理内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31139774/

相关文章:

linux - AMD OpenCL 编译器忽略内核属性 "work_group_size_hint"

css - 使用css设置原始图片宽度和高度的50%

python - 无法加载OpenCL运行时-OpenCV3 Python

opencv - 使用 OpenCV 的视角和光照条件略有不同的两幅图像之间的差异

16 位数据双线性插值的 Java 错误

windows - 无法将 Windows 上的 OpenCL 与 GHC 链接起来

postgresql - 在 PostgreSQL UDF 中调用时出现 clGetPlatformIDs 错误 -1001

linux - 英特尔酷睿 i5 (linux) 的 OpenCL 实现

python - Yolo Darknet 仅检测特定类别,如人、猫、狗等

c++ - 彩色图像之间的相似度测量(OpenCV)