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

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

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

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

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

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

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

或者我可以减少它们吗?

【问题讨论】:

  • adreno(qualcomm)与CUDA无关,去掉CUDA标签。

标签: opencl gpu shared-memory bank-conflict


【解决方案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

【讨论】:

    猜你喜欢
    • 2017-01-08
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 2015-04-07
    • 2011-01-18
    • 1970-01-01
    • 2012-05-22
    • 1970-01-01
    相关资源
    最近更新 更多