Cuda 跨越式访问的银行冲突

Cuda 跨越式访问的银行冲突,cuda,Cuda,我正在阅读CUDA_C_编程指南,在共享内存主题中,我有一个例子: 设备计算能力:1.0,共享内存中有16个存储组 extern __shared__ float shared[]; float data = shared[BaseIndex + s * tid]; 在他们得出的结论“s”必须是奇数的解释中,有谁能帮助我理解当s为偶数时会发生什么,当s为奇数时会发生什么?奇数s的结论不容易直接看到,但如果你试图在银行发生冲突时推导出来的话(两个线程tid和tid'访问同一个银行),假设32是

我正在阅读CUDA_C_编程指南,在共享内存主题中,我有一个例子: 设备计算能力:1.0,共享内存中有16个存储组

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

在他们得出的结论“s”必须是奇数的解释中,有谁能帮助我理解当
s
为偶数时会发生什么,当
s
为奇数时会发生什么?

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

s*tid==s*tid(模块32)

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

s*tid==s*tid+s*n(模块32)

s*n==0(模32)

n=(32/d)*k表示某些k,d=gcd(s,32)

因此,当32小于或等于32/d时,不会发生银行冲突

因为d=gcd(s,2^5),s必须是奇数


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

可能会帮助您理解started@talonmies:谢谢你的回复。我看到了你发布的解决方案[16][16]在前费米体系结构的共享内存中。但我无法理解银行是如何安排的,即Row0和bank0,row1和bank1,等等?或者你能用这里发布的图片解释一下吗::谢谢你的回复。我正在努力理解。但是,如果你能让我知道,为什么每次都是(mod 32)是写的吗?我也不知道“n”是怎么来的,从哪里来的,以及“n”的方程是怎么推导出来的。这是否意味着线程0,tid=0,线程32,tid=0,n=32。你的意思是什么。我也不知道为什么32应该小于或等于32,如果它大于32,会发生什么?(mod 32)每次都写,因为它是模方程(等式的每一侧在模运算后必须相等)“n”用作两个ID之间的差值,等式是一般的,所以它可以有很多值,而且你的例子是正确的。最后一件事,如果32大于32 /d等式,对于n’的更多值。谢谢你的回答。如果我们考虑线程ID 3和线程ID 35,那么‘n’=32,因此现在如果‘s’=1,那么对于线程ID=3,TID MOD32=3和线程id=35,tid mod 32也=3。考虑到这种情况,当's'=2时,线程id为3,tid mod32=6,线程id为70时,tid mod 32=6。因此,当's'为奇数或偶数时,同样适用。那么为什么's'需要为奇数?如果32大于32/d,则方程适用于更多的'n'值,但这其中有什么问题?我想你是在正确的方法中,唯一需要实现的是将线程块划分为扭曲:谢谢你的回答。我正在尝试理解它;但是如果你能让我知道什么是baseindex,在最初的问题中;如何提供它,语法是什么?