部分相同地址访问是否会在CUDA中引发Bank冲突?

Whether Partial Identical Address Access Incurs Bank Conflicts in CUDA?

我阅读了一些有关 CUDA 编程的教程。他们中的大多数人提到 "If ALL threads of a half-warp access the identical address, there is no bank conflict (broadcast)"。我的问题是部分相同的地址访问是否会在CUDA中的共享内存中引起bank冲突?

假设每个warp有32个thread,那么half warp就是16个thread。

(1)如果16个线程都访问Bank0上的同一个地址A,广播后不会发生bank冲突。

(2) 但是如果 Thread-{0,1,...,6,7} 想要访问 Bank0 上的地址 A 而 Thread-{8,9,...,14,15} 想要访问 Bank1 上的地址 B?不知道会不会有银行冲突。由于NOT 所有half-warp 线程都访问相同的地址(只有half-half-warp 访问相同的地址),因此会出现bank 冲突。

理解有误请指正。非常感谢!

对于计算能力 1.x(CUDA 7 不再支持哪些设备),每个非库冲突的共享内存访问周期允许 a single broadcast word

对于计算能力 2.0 及更高版本,在单个非存储体冲突的共享内存访问周期中允许任意数量的广播字,假设所有这些广播字都来自不同的存储体。

Documentation:

and unlike for devices of compute capability 1.x, multiple words can be broadcast in a single transaction

half-warp 的讨论仅与 cc1.x 设备相关。在您的情况 2 中,在 cc1.x 设备上,将对所需的两个访问进行序列化,一个用于地址 A,一个用于地址 B。这在行为上等同于 2 路银行冲突。在您的情况 2 中,对于 cc2.0 及更高版本,将不会发生银行冲突。