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

use*_*357 3 cuda bank-conflict gpu-shared-memory

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

文件:

共享存储器硬件在计算能力2.x的设备上得到改进,以支持多个广播字,并且为每个线程的8位,16位,64位或128位的访问产生更少的存储体冲突(G部分). 4.3).

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

Rob*_*lla 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
...
Run Code Online (Sandbox Code Playgroud)

例如,我们看到地址1和5位于同一个库中,但它们不是同一个位置.

只要warp中的两个或多个线程试图通过特定warp事务(例如从共享存储器读取)访问同一存储体中的数据,就会出现银行冲突(在任何体系结构上).

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

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

但是,在任何情况下,如果多个线程从同一个库中的不同位置读取,即在任何当前GPU架构下存在冲突.

在上图中,如果线程0从位置/地址0读取,则线程3从位置/地址8读取,这将始终是任何当前架构上的存储体冲突(假设这是仅有4个存储体的简化示例).如果线程1和线程2都从位置/地址4读取,那就是预发射上的存储体冲突,而不是所有费米设备上的存在冲突.

对于32组排列,它是一个实际的银行结构,银行在共享存储器中的任何位置的由索引的低5位给定或偏移到该位置,不管该位置是否恰好属于一个intfloat阵列.