bank冲突
share memory形式
假设一共32个bank
0 _ _
1 _
2 _
3 _
.
.
.
31 _
每个位置可以放4B或者8B数据,就是32bit或者64bit数据,然后顺序是从上到下,从左到右
一维数组
假设是int[64]
分布这样分布
int=32bit=一个坑位
一共64个坑位
int[0]访问bank0
int[1]访问bank1
…
int[31]访问bank31
int[32]访问bank0
假设是double[64]
double=64bit=两个坑位
double[0]访问bank0,bank1;
以此类推
所以通用是先计算线性地址
i位置的线性地址: isizeof(类型)
占了多少个坑: isizeof(类型)/sizeof(bank)
bank号:i*sizeof(类型)/sizeof(bank)%32
一个线程可以做到同时访问多个bank,一个周期就能拿到数据
二维数组
同理,无非计算线性id不一样,因为填充share memory方式一样,就不写了
冲突原因
一个bank只能接受一个thread访问自己银行里面的一个地址,或者多个thread访问同一个地址(有广播机制),
如果两个线程同时去访问一个bank的不同位置,就需要排队,而不是并行,这样就慢。
比如thread1和2同时访问bank的第一个坑和第二个坑。
所以尽量要让他们访问不同bank或者同一个bank的一个位置