这些天来,我正在尝试移动 gpu(adreno)上的程序
我用于图像处理的算法对内存访问具有“随机性”。
它引用“固定”范围内的一些像素进行过滤。
但是,我无法确切知道将引用哪个像素(取决于图像)
据我了解。如果多个线程访问本地内存银行,则会导致银行冲突。所以在我的情况下,它应该引起银行冲突。
我的问题:我可以消除随机内存访问时的银行冲突吗?
或者我可以减少它们吗?
这些天来,我正在尝试移动 gpu(adreno)上的程序
我用于图像处理的算法对内存访问具有“随机性”。
它引用“固定”范围内的一些像素进行过滤。
但是,我无法确切知道将引用哪个像素(取决于图像)
据我了解。如果多个线程访问本地内存银行,则会导致银行冲突。所以在我的情况下,它应该引起银行冲突。
我的问题:我可以消除随机内存访问时的银行冲突吗?
或者我可以减少它们吗?
有多种方法可以处理存储库冲突 - 您正在使用的元素的大小、行之间的步幅以及将坐标移动到不同的内存地址。它永远不会像非随机/无冲突那么好,因此您会注意到取决于图像 - 您会看到显着不同的计算时间。
见http://cuda-programming.blogspot.com/2013/02/bank-conflicts-in-shared-memory-in-cuda.html
假设您随机访问的像素的距离以某种方式呈正态分布,您可以考虑将您的图像平铺成子图像。
我的意思是:您可能有 4x4 大小为 256x256 的图像,而不是使用(比如说)1024x1024 图像。它们中的每一个都一起保存在内存中,因此“近”像素访问保持在同一个图像对象中。只有远距离操作需要访问不同的子图像。
第二种选择:CLImage
尝试将数据保存到数组中,而不是使用对象。数组中的数据可以按Z 顺序曲线排序存储。这也导致空间分布减少(与行顺序排序相比)
但是,当然,这在很大程度上取决于您的图像大小。