Opencl 随机内存访问与银行冲突

Opencl 随机内存访问与银行冲突,opencl,gpu,shared-memory,bank-conflict,Opencl,Gpu,Shared Memory,Bank Conflict,这几天,我在移动gpu(adreno)上试用这个程序 我用于图像处理的算法对于内存访问具有“随机性” 它引用“固定”范围内的一些像素进行过滤 但是,我不能确切知道哪个像素将被引用(取决于图像) 据我所知。如果多线程访问本地内存库 它导致银行冲突。因此,在我的情况下,这应该会导致银行冲突 我的问题:我能在随机内存访问中消除银行冲突吗 或者我可以减少它们吗?有多种方法来处理银行冲突-处理的元素的大小、行之间的跨距以及将坐标移动到不同的内存地址。它永远不会像非随机/无冲突那样好,因此您会注意到的是,这

这几天,我在移动gpu(adreno)上试用这个程序

我用于图像处理的算法对于内存访问具有“随机性”

它引用“固定”范围内的一些像素进行过滤

但是,我不能确切知道哪个像素将被引用(取决于图像)

据我所知。如果多线程访问本地内存库 它导致银行冲突。因此,在我的情况下,这应该会导致银行冲突

我的问题:我能在随机内存访问中消除银行冲突吗


或者我可以减少它们吗?

有多种方法来处理银行冲突-处理的元素的大小、行之间的跨距以及将坐标移动到不同的内存地址。它永远不会像非随机/无冲突那样好,因此您会注意到的是,这取决于图像-您将看到显著不同的计算时间


请参见

假设随机访问像素的距离在某种程度上是正态分布的,您可以考虑将图像平铺成子图像

我的意思是:与其使用(比如)1024x1024图像,不如使用大小为256x256的4x4图像。它们中的每一个都保存在内存中,因此“近”像素访问保持在同一图像对象中。只有远程操作需要访问不同的子映像

第二个选项:不要使用
CLImage
对象,而是尝试将数据保存到数组中。数组中的数据可以存储在Z顺序曲线中。这也会减少空间分布(与行顺序排序相比)


但当然,这很大程度上取决于您的图像大小。

adreno(高通公司)与CUDA无关,删除了CUDA标签。这种依赖性非常强,事实上,它通常会降低较大图像的速度-AMD和Nvidia一样,在其CLImage 2d类型中使用这种2d策略。始终基准,看看这样的策略是否有伤害或帮助!它可能不会达到您期望的效果。我同意您总是对内存访问模式进行基准测试。但是否有任何硬数据支持“事实上,对于较大的图像,它通常会减慢速度”的说法?什么阈值决定了图像的广度?或者这只是一个假设?