跳转至

QEMU 训练营 2026 专业阶段总结

主要贡献者


背景介绍

在校硕士生,主要从事卫星网络方向的研究。因为开发和维护卫星网络仿真器,之前接触过容器、QEMU、Linux 内核等系统软件相关技术。后来偶然从 B 站了解到 QEMU 训练营,正好也希望更系统地理解虚拟化和底层设备模拟,于是加入训练营。

专业阶段

专业阶段我选择的是 GPGPU 方向。我对这个方向的理解可以分成三部分:设备建模,RISC-V kernel 执行,以及浮点数操作。

设备建模

设备建模首先需要理解 PCIe 的一些概念,主要是 BAR MMIO 和 DMA。

实践上,需要在 QEMU 里走完一个 PCIe 设备从注册、初始化到访问的基本流程。GPGPU 设备通过 BAR0 暴露控制寄存器(包含设备信息、全局控制、中断状态、内核 dispatch 参数、DMA 参数和 SIMT 上下文寄存器),并通过 BAR2 暴露 VRAM。

在设备前端,完成了以下内容:

  • DEV_IDDEV_VERSIONDEV_CAPS 和 VRAM 大小寄存器读取
  • GLOBAL_CTRLGLOBAL_STATUSERROR_STATUS 的读写和软复位行为
  • Grid/Block维度、内核地址、DMA参数、中断状态、SIMT上下文寄存器的读写
  • BAR2 VRAM 的基本读写
  • DISPATCH 写入后的校验、内核执行触发和状态更新

RISC-V kernel

这部分主要是解释执行 GPGPU kernel,即一个 RISC-V 程序,运行在设备的 SIMT 执行器上。

SIMT 部分的核心是把 Grid、Block、Warp、Lane 的层次映射到一个串行解释器中。实验中的 warp 固定为 32 lane,每个 lane 有独立的通用寄存器、浮点寄存器、PC 和mhartid。执行时以 warp 为单位取指,所有 active lane 锁步执行同一条指令;当 lane 执行到ebreak时,将对应 active bit 清零,直到整个 warp 的 active mask 为 0。

实现了基础的 warp 初始化和 kernel 调度循环:

  • 根据 Grid 三维坐标遍历 block
  • 根据 block 内线程数切分 warp
  • 为每个 lane 初始化 PC、active 状态和 mhartid
  • 串行执行所有 warp,并限制最大执行周期

由于 RISC-V 指令的规整性,RV32I 解释器可以比较简单地实现,按照类似递归下降的方式解析指令格式,用 switch-case 处理每类 opcode,再在每个函数中进一步处理。实验中只实现了测例需要的最小子集,分支(B 类型)和跳转指令(J 类型)没有实现。

浮点数操作

除了标准的 RV32F 指令(在上一部分的解释框架中增加对浮点指令的处理),这部分主要的工作是实现低精度浮点格式的 FP32 转换,包括 BF16、E4M3、E5M2 和 E2M1,需要仔细处理边界条件。

实现的转换包括:

  • BF16 与 FP32 往返。由于指数范围相同,转换时只需要移位和舍入
  • E4M3 与 FP32 往返。需要处理非规格化数和 NaN,且 FP32 往 E4M3 转换时,过大值和 Inf 饱和到最大有限值 448(指数 1111,尾数 110)
  • E5M2 与 FP32 往返。需要处理非规格化数、NaN 和 Inf,且 FP32 往 E5M2 转换时,过大值饱和到最大有限值 57344(指数 11110,尾数 11)
  • E2M1 与 FP32 往返。由于范围比较简单,按照规格表{0, 0.5, 1, 1.5, 2, 3, 4, 6}进行转换

总结

这次实验最大的收获是从实践层面理解 QEMU PCIe 设备模型和 SIMT 执行模型。

在设备建模层面,除了基本的 PCIe 设备知识,还走了一遍 QEMU 设备注册、初始化、MMIO 访问和 VRAM 访问的完整流程。

在执行模型层面,对 SIMT 有了更具体的认识。以前只是写 CUDA 程序,从应用性能优化层面理解 Grid、Block、Warp、SM、发散执行等概念;通过这次实验,尽管是一个串行的解释器,但还是会更多地以实现者的视角去理解 SIMT 执行模型的细节。

给后续同学的建议:

  • 在学习 QEMU 设备建模、PCIe 设备、GPGPU 原理等基础原理后,先读实验架构图和硬件手册,再跟着tests/qtest/gpgpu-test.c和实验手册逐步实现
  • 做好 RISC-V 解释器的可维护性设计,少硬编码,便于后续添加新指令
  • 浮点转换注意好各种边界情况,注意查阅各种浮点数格式的特殊情形,如非规格化数、NaN、Inf 等