那么,data[0] 是 bank 0、data[1] 是 bank 1、data[2] 是 bank 2、…、data[15] 是 bank 15,而 data[16] 又回到 bank 0。由于 wa……
[/Quote]讲的很好,“因此,如果程序在存取 shared memory 的时候,使用以下的方式: int number = data[base + tid];”这句解决了我的疑惑
Tesla 的每个 SM 拥有 16KB 共享存储器,用于同一个线程块内的线程间通信。为了使一
个 half-warp 内的线程能够在一个内核周期中并行访问,共享存储器被组织成 16 个 bank,
每个 bank 拥有 32bit 的宽度,故每个 bank 可保存 256 个整形或单精度浮点数,或者说目前
的 bank 组织成了 256 行 16 列的矩阵。如果一个 half-warp 中有一部分线程访问属于同一
bank 的数据,则会产生 bank conflict,降低访存效率,在冲突最严重的情况下,速度会比
全局显存还慢,但是如果 half-warp 的线程访问同一地址的时候,会产生一次广播,其速度
反而没有下降。在不发生 bank conflict 时,访问共享存储器的速度与寄存器相同。在不同
的块之间,共享存储器是毫不相关的。 ------风辰的 CUDA 入门教程
那么,data[0] 是 bank 0、data[1] 是 bank 1、data[2] 是 bank 2、…、data[15] 是 bank 15,而 data[16] 又回到 bank 0。由于 warp 在执行时是以 half-warp 的方式执行,因此分属于不同的 half warp 的 threads,不会造成 bank conflict。