银行冲突的跨步访问

时间:2012-11-27 19:16:55

标签: cuda

我正在阅读CUDA_C_Programming_Guide,在共享内存主题中,我有一个例子: 设备计算能力:1.0,共享内存中的16个库

extern __shared__ float shared[]; 
float data = shared[BaseIndex + s * tid];

在解释中,他们总结's'必须是奇怪的,有人可以帮助我理解当s是偶数时会发生什么以及当s是奇数时会发生什么?

1 个答案:

答案 0 :(得分:1)

奇数s的结论并不容易直接看到,但如果你试图在银行冲突发生时推导出来(两个线程tid和tid'访问同一个银行),假设32是银行数:

s * tid == s * tid'(mod 32)

s * tid == s *(tid + n)(mod 32)其中tid'= tid + n

s * tid == s * tid + s * n(mod 32)

s * n == 0(mod 32)

对于某些k,n =(32 / d)* k,d = gcd(s,32)

因此当32小于或等于32 / d

时,不会发生银行冲突

由于d = gcd(s,2 ^ 5),s必须是奇数。

关于你在评论中提出的问题,我没有完全理解你不理解的内容,而是简单的解释:如果两个线程试图访问同一个库(这意味着访问同一行中的两个单词),则访问被序列化。