CUDA-Memory Optimization-Shared Memory

Shared Memory

Shared Memory 的特点:

  • 与L1 cache 一起占据相同的物理空间
  • on-chip
  • 高带宽,低延时,相较于local 和 global memory
  • 在线程间没有bank冲突
  • 线程可通过shared memory 来进行协作。

Shared Memory 的快速访问。通常将经常要访问的数据,和计算中间结果放入shared memory,来减少访存的次数Shared Memory。

为了在并发访问中,实现高的内存带宽,shared memory被分成大小相等的块,banks,这些banks可以被同时访问。所以任何对n个不同banks进行访存,这些访存是同时的。这就实现了高带宽。

再深入一点,shared memory 被划分为banks,一个bank对外有一个接口,使得每个周期只相应这个bank中的一个地址。所以对于同一个bank的不同地址的并发访问将导致bank conflict。如下图中的threads athreads b,同时访问bank 1,冲突了。冲突了怎么办,冲突的访存会被排队串行执行。

这就是shared memory 架构的设计特点。看更详细的bank,看这里

关于bank conflict:

  • 一个Warp中的所有(多个)threads访问不同的banks,无冲突。如图中thread cthread a不冲突,thread cthread b也不冲突。

  • 一个Warp中所有(多个)的threads访问同一个地址,这是广播,无冲突。这个地址所在的bank只相应这个地址,所以可以同时访问。[In this case, multiple broadcasts from different banks are coalesced into a single multicast from the requested shared memory locations to the threads. ]

  • 关于bank conflict,一个Warp有32个threads,一个bank中的地址也是32,所以bank conflicts 可能发生在同一个warp中的任何线程。