Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image processing opencl中的共享内存与纹理内存_Image Processing_Opencl - Fatal编程技术网

Image processing opencl中的共享内存与纹理内存

Image processing opencl中的共享内存与纹理内存,image-processing,opencl,Image Processing,Opencl,我正在用Opencl编写逐行扫描代码。我正在使用本地内存中的read_imageui()API读取像素 就像下面的代码: 根据我的理解,当我们使用这个API读取像素时,我们是从纹理内存中读取的。我怀疑在共享内存中首先使用像素是否能帮助我提高速度,因为纹理内存已经起到缓存的作用,并提供对数据的快速访问 有人能澄清我的疑问吗?总的来说,这是真的。然而,即使是从纹理缓存读取也可能比从共享本地内存读取慢,因此对于从相邻位置进行多次重叠读取的算法来说,使用共享本地内存仍然可以从某种程度上受益。但是,这会

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

就像下面的代码:

根据我的理解,当我们使用这个API读取像素时,我们是从纹理内存中读取的。我怀疑在共享内存中首先使用像素是否能帮助我提高速度,因为纹理内存已经起到缓存的作用,并提供对数据的快速访问


有人能澄清我的疑问吗?

总的来说,这是真的。然而,即使是从纹理缓存读取也可能比从共享本地内存读取慢,因此对于从相邻位置进行多次重叠读取的算法来说,使用共享本地内存仍然可以从某种程度上受益。但是,这会使内核更加复杂,因此在许多情况下(当然是在算法开发过程中),只能依赖缓存的纹理读取

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

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