CUDA(Compute Unified Device Architecture,统一计算设备架构)资料:
GPU 体系结构
-
物理模型
- 典型的
GPU
包含一组流处理器 (stream multi-processors
,SM
),每个流处理器都有许多核心,硬件实现上这些核心之间可共享内存(shared memory
)
- 典型的
-
逻辑模型
-
逻辑模型中,引入了
Grid
/Block
/Thread
三级概念,逻辑模型与物理的对应关系如下:因此:同一个
Block
中的Thread
可共享shared memory
-
-
Memory Hierarchy
shared memory
速度几乎和 L1 cache 一样,比local memory
和global memory
都快的多(在物理上,local memory
和global memory
是同一块DRAM
) -
在对
GPU
进行编程时,需要创建一组进程块 (thread blocks
),每个thread
映射到单个核心,而block
映射到流式多处理器 (SM
),如下图所示:
- 每个线程可由
threadIdx
和blockIdx
索引,在实际应用中,可以有多维线程索引
共享内存优化
-
以矩阵乘为例,
-
同一个
block
中的多个thread
可共享内存,因此可以重排同一个block
中的thread
数据,使得尽可能少的数据缓存到shared memory
中 -
优化前:
- 每个
thread
需要计算输出矩阵中8 * 8
的数据,需要从local memory
中读取8 * 8 * 1024 * 2
数据 - 每个
block
中的thread
之间没有数据共享,所以需要从local memory
中读取 个矩阵元素
- 每个
-
优化后:
- 每个
block
计算输出矩阵的64 * 64
的数据最少需要 的数据,可提前将这部分数据缓存到shared memory
- 然后每个
thread
从shared memory
读数据计算,需读取 个数据
- 每个
-
内存优化前后每个
block
读取数据对比:- 优化前:从
local memory
读取 个矩阵元素 - 优化后:从
local memory
读取 个矩阵元素到shared memory
,再从shared memory
读取 个数据计算
- 优化前:从
-