CUDA 的thread本身是有层次结构的。 thread 被grouped成多个thread blocks。 同一个block 的threads 在同一时间, 运行在同一个SM上。
每一个block都有一个shared memory, 是被这个block内的所有的thread所共享的。 一个SM一次最多只能运行8个blocks。
我们知道, global memory, texture memory, constant memory 并没有在chip上面, 所以存取速度慢。 而shared memory 是on chip 上的, 故而速度很快。
并且我们的shared memory 是block级别的, 所以我们要充分利用shared memory存取速度快的特点, 可以将数据对象一次就load到shared memory 上面, 然后直接在shared memory 上进行数据的存取相关的操作。
但是使用shared memory 容易造成bank conflicts。 所谓的bank 就是shared memory arrays 被细分成多个小的subarrays, 这些小的subarray就被称为bank。
在计算能力为2.X(1.X)的GPU上, 每个block的shared memory 有32(16)个banks。 连续的32位的words被设置为连续的banks上。 不同的banks 能够同时被访问。