2.x设备设备中的银行冲突是什么?据我了解CUDA C编程指南,在2.x设备中,如果两个线程在同一共享内存库中访问相同的32位字,则不会导致存储体冲突。相反,这个词是广播的。当两个线程在同一共享存储区中写入相同的32位字时,只有一个线程成功。
由于片上存储器为64 KB(共享存储器为48 KB,L1为16 KB,反之亦然),并且它由32个存储体组成,我假设每个存储体由2 KB组成。所以我认为如果两个线程在同一共享内存库中访问两个不同的32位字,就会出现银行冲突。这是对的吗?
答案 0 :(得分:3)
您的描述是正确的。有许多访问模式可以产生银行冲突,但这里有一个简单而常见的例子:跨步访问。
__shared__ int smem[512];
int tid = threadIdx.x;
x = smem[tid * 2]; // 2-way bank conflicts
y = smem[tid * 4]; // 4-way bank conflicts
z = smem[tid * 8]; // 8-way bank conflicts
// etc.
Bank ID = index%32,所以如果你看一下x,y和z访问中的地址模式,你可以看到在32个线程的每个warp中,对于x,2个线程将访问每个bank,对于y,4个线程将访问每个银行,对于z,8个线程将访问每个银行。