在cuda并行计算中,共享内存在GPU速度优化上扮演着重要作用,但是如果共享内存使用不当,也会导致速度不快反降或者提速效果不佳,如发生bank conflict;
bank的中文翻译为存储体,GPU 共享内存是基于存储体切换的架构(bank-switched-architecture),一般现在的GPU都包含32个存储体,即共享内存被分成了32个bank;根据GPU计算能力的不同(Compute Capability),每个共享内存存储体的宽可以是32位(CC2.x)或64位(CC3.x以上),即连续的32-bits(或64-bits)字被分配到连续的32个bank中(计算能力不是描述GPU设备计算能力强弱的绝对指标,他是相对的,准确的说他是一个架构的版本号,他可以通过cudaDeviceSetSharedMemConfig() 配置成 cudaSharedMemBankSizeFourByte 四个字节或者 cudaSharedMemBankSizeEightByte(CC3.x以上) 。设置成8字节可以有效避免双精度数据的bank conflicts,默认是4字节), 但是这又遇到一个问题,以Telsa P100为例,我们切换bank的宽为32bit,即4个字节,那么32个bank仅仅为128B的内存,而Telsa P100的共享内存为48KB,那么多余的内存呢?
我们看到这32bit我们定义为宽,那么有宽就有高,在这个博客中https://segmentfault.com/a/1190000007533157,博主进行了这样的比喻:
在共享内存中