检查此问题的最佳方法是使用“Compute Visual Profiler”配置代码;这与CUDA工具包一起提供。此外还有一个很有意思的部分GPU Gems 3 - “39.2.3避免银行冲突”。
“当在同一经线访问多个线程在同一银行,发生银行冲突,除非经访问所有线程的相同的32位字在同一地址” - 第一件事,有16个记忆库,每个4字节宽。所以基本上,如果你有在半经从一个共享存储体相同的4字节读取内存的任何线程,你将有银行的冲突和系列化等
行,所以你的第一个例子:
首先让假设你的阵列是说,例如类型INT(一个32位字)的。你的代码将这些ints保存到共享内存中,在第K个线程保存到第K个内存库的任何半变形中。所以例如前半部分warp的线程0将保存到shared_a[0]
这是在第一个存储体中,线程1将保存到shared_a[1]
,每半个warp有16个线程映射到16个4byte bank。在下一个半翘曲中,第一个线程现在将其值保存到位于第一个存储库中的shared_a [16]中。所以如果你使用4字节这样的int,float等,那么你的第一个例子不会导致银行冲突。如果使用1字节的字(例如char),则前半部分中的经线0,1,2和3将全部将其值保存到共享内存的第一个库中,这会导致库冲突。
第二个例子:
同样,这完全取决于你所使用的字的大小,但对于例如我将使用一个4字节的字。所以寻找在第一半经:
线程数= 32
N = 64
线程0:将写入0,31,63 线程1:将写为1,32
半warp中的所有线程都并发执行,因此写入共享内存不应导致bank冲突。我必须仔细检查这一个。
希望这会有所帮助,对不起,巨大的答复!
256是什么?字节? – fabrizioM 2010-12-09 19:38:01
数组中的256个元素。 – scatman 2010-12-10 10:38:06