计算机体系结构 31:GPU 执行与合并访存
计算机体系结构 31:GPU 执行与合并访存
核心问题
32 个线程发出 32 次访存,为什么不能直接说成 32 次显存事务?GPU 会按活跃线程、地址分布和架构规则组合请求。分支还会改变每条路径上的活跃掩码,因此源码线程数、模型段数和硬件事务数是三种不同口径。
本篇用 32 lane、32 字节段的题设手算地址覆盖。附件:31-gpu.json。
范围与证据等级
证据等级为手算。题设假定一个 warp 有 32 个 lane,并把地址所属的 floor(address / 32) 段数作为比较指标。它没有运行 CUDA kernel,没有采集 GPU 周期、occupancy、cache hit 或真实 memory transaction 计数。
NVIDIA CUDA C++ Programming Guide 定义 warp 的 SIMT 执行语义;Best Practices Guide 说明全局内存访问合并与设备计算能力和地址分布有关。本篇的 32 字节分段只是明确题设,不能覆盖所有代际的实际事务规则。
核心案例:连续、跨步与错位地址
每个 lane 读取一个 4 字节元素。连续地址 0,4,...,124 覆盖 4 个题设段;步长 2 的地址 0,8,...,248 覆盖 8 段;整体错位 4 字节的连续访问覆盖 5 段。模型输出保留每个段号,而非只留最终计数。
另一个案例按 lane 奇偶分支,两个掩码各有 16 个活跃 lane。若两个分支都要执行,warp 需要分别执行对应路径并屏蔽另一半 lane。这个描述不等于“固定耗时翻倍”,因为真实周期还受指令、调度、缓存和其他 warp 隐藏延迟的能力影响。
模式:先算活跃集合,再算地址覆盖
1 | |
向量掩码、GPU warp 和带 predicate 的数据流机器都能采用这个顺序。线程总数本身不足以推出有效工作量或存储事务。
验收结果
python3 examples/computer-architecture/run_batch.py 29-33 退出 0。连续、步长 2、错位三个案例的题设段数分别为 4、8、5,奇偶掩码各 16 lane。输出明确标记 not_gpu_cycles_or_measurement=true。
练习
把元素宽度改为 8 字节,仍按 32 字节段手算连续访问覆盖的段数。
若奇数分支没有任何副作用,编译器将其改为 predicated 指令后,哪些分析输入发生变化?
模式速查
| 已知量 | 可以手算 | 不能推出 |
|---|---|---|
| lane 掩码 | 每条路径活跃线程 | 实际周期 |
| 地址集合与题设段宽 | 覆盖段数 | 实机 DRAM 事务 |
| 线程块大小 | 逻辑线程数量 | 实际 occupancy |






