执行模型
MT GPU 采用单指令多线程 SIMT(Single Instruction, Multiple Threads)执行模型:
SIMT 核心特征:
├── 一组线程(线程束)同时执行同一条指令
├── 每个线程具有独立的寄存器状态
└── 当线程执行路径出现分支时,线程束序列化执行各分支
与 SIMD 的区别
| 特性 | SIMD | SIMT |
|---|---|---|
| 控制流 | 所有数据执行相同路径 | 每个线程可独立分支 |
| 编程模型 | 需显式使用向量指令 | 可编写直观标量代码 |
| 分支处理 | 必须执行所有分支 | 硬件自动处理分歧 |
| 灵活性 | 低,适合规则数据 | 高,适合不规则任务 |
线程束基础
线程束是 GPU 硬件的基本执行单元,包含固定数量的线程:
| GPU 架构 | 线程束大小 |
|---|---|
| MP31 | 32 线程 |
| MP21/MP22 | 128 线程 |
线程束执行过程
分支分化(Branch Divergence)
问题描述
当线程束内线程执行路径出现分支时,硬件必须序列化执行各分支:
__global__ void branchKernel(float* data) {
int idx = blockIdx.x * blockDim.x + threadIdx.x;
if (data[idx] > 0) {
// 路径 A:正数处理
data[idx] = data[idx] * 2.0f;
} else {
// 路径 B:非正数处理
data[idx] = 0.0f;
}
}