我专注于Mark Harris的幻灯片 Optimizing Parallel Reduction in CUDA 中说明的银行冲突问题,我来到了这个问题:
幻灯片8和12分别展示了发散分支问题和非发散解决方案,存在银行冲突问题。但是,这个问题仅在幻灯片12中提到 。
据我所知,每4个字节的数据(本例中为整数)存储在一个存储库中。在这种情况下:
10 -> bank 1
1 -> bank 2
8 -> bank 3
.
.
.
只要warp的线程请求同一个bank中的字节,就会出现 bank conflict 的问题。在幻灯片8中,所有6个线程(相同的warp)都在请求来自不同存储体的字节(没有存储体冲突)。此外,在幻灯片12中,所有6个线程(同样是相同的warp)正在请求来自不同存储体的字节(仍然没有存储体冲突)。有人会澄清这个问题何时出现?
答案 0 :(得分:1)
我想我错了。
在幻灯片8中,索引为2i的每个线程正在访问索引为2i的银行。因此,线程32(warp中的最后一个线程)访问索引为32的存储区。因此,不会发生存储体冲突(warp中没有任何线程访问同一存储区)。
在幻灯片12中,索引为i的每个线程正在访问索引为2i的银行。 因此,线程32(warp中的最后一个线程)访问索引为64的存储区。访问模式分析显示每个线程在这种情况下访问同一个存储区2次,这是严重的银行冲突。