费米及以上共享存储库冲突的相关性

时间:2014-07-03 15:04:05

标签: cuda gpu-shared-memory bank-conflict

根据我在CUDA文档中的描述,共享内存库冲突与sm_20及更高版本无关,因为在同时请求时会广播值,从而防止出现任何类型的序列化延迟。

文档:

  

共享内存硬件在计算设备上得到了改进   功能2.x支持多个广播词并生成   访问8位,16位,64位或更少的银行冲突更少   每个线程128位(第G.4.3节)。

有人可以证实我的断言吗?

1 个答案:

答案 0 :(得分:16)

不,他们不是“无关紧要”。

我相信你的困惑可能源于对银行冲突的一种常见误解,即“银行”在某种程度上等于“地点”。银行和地点之间存在关系,但它不一定是平等关系。

举一个简单的例子,假设我们有4个银行(让我们将讨论局限于32位交易,自然对齐32位存储,例如intfloat)。银行和地点(intfloat索引“地址”)之间的关系如下:

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中的两个或多个线程因特定warp事务(例如从共享内存中读取)尝试访问同一 bank 中的数据时,可能会出现银行冲突(在任何体系结构上) )。

在pre-fermi的情况下,即使多个线程从相同的位置(即地址)读取,这也是一个银行冲突,因为这些线程正在从同一个银行读取。

在cc2.x或更高版本的情况下,引入了广播机制。除一个特定情况外,该机制对银行冲突的一般情况无影响。当多个线程从相同位置读取时,这不再是存储体冲突,并且从该位置读取的所有线程将在特定周期内接收数据而不进行序列化。

但是,在任何情况下,如果多个线程从同一个银行中的不同位置读取,那么就是银行冲突,在任何当前的GPU架构下。< / p>

在上图中,如果线程0从位置/地址0读取,并且线程3从位置/地址8读取将始终在任何当前架构上发生银行冲突(假设这是一个简单的例子,只有4个银行)。如果线程1和线程2都从位置/地址4读取,那就是在pre-fermi上的银行冲突,而不是所有fermi设备上的冲突。

对于32银行安排,这是一个实际的银行配置,共享内存中任何位置的 bank 由索引的低5位或该位置的偏移量给出,无论是否该位置恰好属于intfloat数组。