1

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

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

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

4

1 回答 1

2

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

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

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

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

于 2012-06-08T17:46:03.417 回答