从共享内存中读取 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 数组是不是会排除银行冲突?的主要内容,如果未能解决你的问题,请参考以下文章