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 a
和threads b
,同时访问bank 1
,冲突了。冲突了怎么办,冲突的访存会被排队串行执行。
这就是shared memory 架构的设计特点。看更详细的bank,看这里。
关于bank conflict:
一个Warp中的所有(多个)threads访问不同的banks,无冲突。如图中
thread c
与thread a
不冲突,thread c
与thread 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中的任何线程。