随机内存访问和银行冲突

Posted

技术标签:

【中文标题】随机内存访问和银行冲突【英文标题】:random memory access and bank conflict 【发布时间】:2015-07-20 01:22:15 【问题描述】:

这些天,我正在尝试移动 gpu(adreno) 上的程序

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

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

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

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

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

或者我可以减少它们吗?

【问题讨论】:

adreno(qualcomm)与CUDA无关,去掉CUDA标签。 【参考方案1】:

假设您随机访问的像素的距离以某种方式呈正态分布,您可以考虑将您的图像平铺成子图像。

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

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

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

【讨论】:

依赖性非常强,事实上它通常会减慢较大图像的速度 - AMD 使用这种 2d 策略及其 CLImage 2d 类型,Nvidia 也是如此。始终进行基准测试,看看这些策略是否有害或有帮助!它可能无法达到您的预期。 我同意您始终对内存访问模式进行基准测试。但是是否有任何确凿的数据来支持“事实上它通常会减慢更大图像的速度”的说法?什么阈值决定了图像的大小?还是这只是一个假设?【参考方案2】:

有多种方法可以处理存储库冲突 - 您正在处理的元素的大小、行间的步幅以及将坐标移动到不同的内存地址。它永远不会像非随机/无冲突那么好,因此您会注意到取决于图像 - 您会看到显着不同的计算时间。

见http://cuda-programming.blogspot.com/2013/02/bank-conflicts-in-shared-memory-in-cuda.html

【讨论】:

以上是关于随机内存访问和银行冲突的主要内容,如果未能解决你的问题,请参考以下文章

银行冲突CUDA共享内存?

CUDA 内存库冲突

故意导致 CUDA 设备上共享内存的银行冲突

从共享内存中读取 int 数组是不是会排除银行冲突?

使用内核参数会导致银行冲突吗? [关闭]

二维内核中的银行冲突