我正在设计一个CUDA内核,每个线程块将启动16个线程。我在共享内存(即每个线程块)中有一个N个int的数组,我希望处理它。
如果线程的访问模式是连续进入数组,那么这是否意味着没有银行冲突?据我所知,如果数组是一个char数组,就会出现银行冲突,但我不完全确定如果它是一个int数组会发生什么。 我猜测会有银行冲突,因为每组4个连续的整数共享同一个内存库?
如果这是真的那么什么是防止银行冲突的正确解决方案?如直方图样本中的地址加扰?
答案 0 :(得分:2)
对于计算能力> = 2.0的设备,共享存储器被排列成交错的32位字。因此,如果warp中的每个线程(warp是32个线程)寻址连续的32位字,则不会有任何存储体冲突。此外,不同的线程可以访问相同的 32位值,而不会导致任何存储体冲突。这意味着如果所有线程都从字符数组中读取连续值,也不会有任何存储体冲突。
银行冲突实际上只是由两个或多个线程引起的,这些线程寻址不同的32位字,这些字是32个地址的倍数。
对于其他计算功能,答案可能有所不同 - 我没有检查过。
请注意,每个块16个线程非常低。如果块大小这么低,我认为你不能提高GPU与CPU的性能(除非这只是总工作量的一小部分,而且数据已经存在于GPU内存中)。