什么是bank?
shared memory被划分成大小相同的模块,这些模块叫做bank。不同bank可以被同时读写,将shared memory如此划分,将使得shared memory的访存带宽大大增加。
如果shared memory被划分成16个bank,那么它的访存带宽会比不划分bank时快16倍。
shared memory的访存速度是仅次于register,而又比global memory快100多倍。
bank 冲突
同一个Warp中不同线程去访问shared memory中同一个bank的不同字地址时,就会发生bank 冲突。
此时我们无法充分发挥bank的功能。最坏的情况是,一个warp的32个线程同时访问一个bank的32个不同字地址,那么这32个访存操作会串行化,效率非常低。
如何避免bank 冲突
不同warp的线程之间不会发生bank 冲突。
典型的线程访问方式:步长为1的时候,每个warp的线程和每个bank的ID一一对应或者每个线程对应唯一的bank。不会产生冲突,即有32个bank。
步长为2的时候,有可能产生2路bank 冲突,就是有两个线程同时访问一个bank。
多播机制:当一个warp中的多个线程同时访问一个bank的相同字地址时,会将该字广播给这些线程,不会产生bank冲突。