GPU 内存架构
GPU 内存架
Global Memory
- 一个在GPU上的主要内存。
- 在GPU上存在大量Global Memory。所有的运行中的线程都可从Global Memory中读取信息。
- 所有的地址都是Byte Addressable。
- 读写速度最慢。
Local Mmeory
- 另一个在GPU上的主要内存。
- 当没有足够的寄存器时,每个线程会调用Local Memory (被称作Register Spilling)。
- Addresssable,被用于不被常量indexed数组。
- 每个线程有独立的 Local Memory。
Caches
- L1, L2 Cache作用于Global Memory和Local Memory。
- L1 和 Shared Memory共享地址,并且Configable它们的具体分配。
- 所有的 Global Memory 读写都通过L2 Cache,包括CPU的读写请求。
Shared Memory
- 速度仅次于寄存器(registers),在同一个Block内的线程中被共享。
Constant Memory
- 只读并拥有自己的Cache。
Texture Memory
- 同样拥有自己的Cache。(Read-Only to GPU, Sets Up by CPU)
- 有一些额外的关于Addressing的奇技淫巧,方便一些如interpolation的计算。
Streams Multiprocessors(SM)
Warp 和 Active Block 及 线程数量。
- Warp是Scheduler执行的基本单元。每个Warp拥有32个线程
- 一个重要的提高GPU效率的方法为Latency Hidden,即当某些“远程”资源(例如贴图纹理)的读取没有到位时,可通过Context Switch来运行别的线程Warp使GPU占有率保持在一定数值。当资源到位时,可转换会之前的Warp继续运行。
- 高占有率(High Occupancy)需要足够的Warp数量:
- 反例1, 每个block里thread数量太少:当一个Block只有一个Warp(32 threads), 由于每个SM最多支持16个active blocks,所以也只有16个active warp。当前硬件支持64-128个active Warp。
- 反例2, 每个block里thread数量太多:由于register总数量限制,则active blocks的数量将被迫减少,同业也导致active warp的数量减少。
- 一般选用 128 - 512 threads per block
__syncthreads()
通过__syncthreads来确保每一段cuda代码所加载的资源完全已经准备好