文档如下:
“在计算能力为2.x的设备上,共享内存硬件得到了改进,支持多个广播字,并且对每个线程的8位、16位、64位或128位访问生成更少的bank冲突(第G.4.3节)。”
有人能够确认我的说法吗?
不,它们并不是“无关紧要”的。
我认为你的困惑可能源自于一个常见误解,即银行冲突中的“bank”与“location”在某种程度上是相等的。虽然银行和位置之间存在联系,但它们不一定是相等的。
举个简单的例子,假设我们有4个银行(讨论仅限于32位事务,并且自然对齐32位存储,例如int
或float
)。 银行和位置(int
或float
索引“地址”)之间的关系如下:
address: bank:
0 0 <-----------------------Thread 0
1 1
2 2 ------Thread 1
3 3 /
4 0 <---------Thread 2
5 1
6 2
7 3
8 0 <-----------------------Thread 3
...
例如,我们可以看到地址1和5在同一银行,但它们不是相同的位置。
无论何种架构,如果一个warp中的两个或多个线程由于特定的事务(例如从共享内存读取)而尝试访问与另一个线程相同的bank中的数据,都可能会出现银行冲突。
在Fermi之前的情况下,即使多个线程从相同的location(也就是地址)读取,这也是一种银行冲突,因为这些线程正在从同一银行读取。
在cc2.x或更高版本的情况下,引入了一个broadcast机制。这个机制对于银行冲突的一般情况没有影响,除了一个特定的情况。当多个线程从same location读取时,这不再是一个银行冲突,所有从该位置读取的线程将在一个特定的周期内接收到数据,而不需要序列化。
然而,在任何情况下,如果多个线程从位于同一bank的不同位置读取,那么这就是一个银行冲突,无论在当前的GPU架构下还是以后的任何版本下。
在上面的图片中,如果Thread 0从地址0读取,Thread 3从地址8读取,这将始终是当前任何架构上的银行冲突(假设这只是一个有4个银行的简化示例)。如果Thread 1和Thread 2都从地址4读取,那就是Fermi之前的银行冲突,但在所有Fermi设备及以后的设备上不是。
对于32个银行的配置,这是一种实际的银行配置,共享内存中任何位置的bank由该位置的索引或偏移量的低5位给出,无论该位置是否属于一个int
或float
数组。
int
或float
的偏移量的5个低位是指该位置的偏移量的5个位,无论它是一个int
数组还是一个float
数组,即数组索引,其本身不是一个float
数量。重新措辞。 - Robert Crovella