2012-06-08 42 views
1

我正在设计一个CUDA内核,它将以每个线程块16个线程启动。我在我想处理的共享内存(即每个线程块)中有N个ints数组。从共享内存读取int数组是否排除了银行冲突?

如果线程的访问模式连续进入数组,那么这是否意味着没有银行冲突?我明白如果数组是一个char数组,那么会有bank冲突,但我不完全确定如果它是一个int数组会发生什么。 我猜猜会有银行冲突,因为每组4个连续的int共享相同的内存银行?

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

回答

2

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

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

其他计算能力的答案可能不同 - 我没有检查过。

请注意,每个块有16个线程非常低。如果块的大小很低,我认为你不能提高GPU和CPU的性能(除非这只是总工作负载的一小部分,而且数据已经存在于GPU内存中)。

+0

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