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

Posted

技术标签:

【中文标题】从共享内存中读取 int 数组是不是会排除银行冲突?【英文标题】:Does reading an int array from shared memory preclude bank conflicts?从共享内存中读取 int 数组是否会排除银行冲突? 【发布时间】:2012-06-12 18:28:53 【问题描述】:

我正在设计一个 CUDA 内核,每个线程块将启动 16 个线程。我希望处理的共享内存(即每个线程块)中有一个 N 个整数数组。

如果线程的访问模式在数组中是连续的,那么这是否意味着不会有银行冲突?我知道如果数组是 char 数组,则会发生银行冲突,但我不完全确定如果它是 int 数组会发生什么。 我猜会有存储冲突,因为每组 4 个连续的 int 共享同一个存储库?

如果这是真的,那么防止银行冲突的正确解决方案是什么?直方图样本中的地址加扰?

【问题讨论】:

【参考方案1】:

对于计算能力 >= 2.0 的设备,共享内存被安排为交错的 32 位字。因此,如果一个 warp 中的每个线程(一个 warp 是 32 个线程)寻址连续的 32 位字,就不会有任何银行冲突。此外,不同的线程可以访问相同的 32 位值,而不会导致任何银行冲突。这意味着如果所有线程从字符数组中读取连续值,也不会发生任何存储库冲突。

Bank 冲突实际上仅由两个或多个线程寻址不同的 32 位字引起,这些字是 32 个地址的倍数。

对于其他计算能力,这个问题的答案可能会有所不同——我还没有检查过。

请注意,每个块 16 个线程非常少。由于块大小如此之低,我认为您无法提高 GPU 与 CPU 的性能(除非这只是总工作负载的一小部分并且数据已经在 GPU 内存中)。

【讨论】:

这很好解释。是的,这只是工作负载的一小部分,内存已经在 GPU 上。

以上是关于从共享内存中读取 int 数组是不是会排除银行冲突?的主要内容,如果未能解决你的问题,请参考以下文章

将数据从全局加载到共享内存时如何避免银行冲突

合并与银行冲突(Cuda)

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

在 Nvidia 下读取 OpenCL 可执行文件的共享/本地内存存储/加载库冲突硬件计数器

为啥 Cuda/OpenCL 的全局内存中没有银行冲突?

从同一位置读取时 CUDA 中的银行冲突