Nvidia GPU Model

从上述图可以看出组成 GPU 的几个重要组成:

  • MMIO:
    • CPU 与 GPU 的交流就是通过 MMIO 进行的。
    • DMA 传输大量的数据就是通过 MMIO 进行命令控制的
    • I/O 端口可用于间接访问 MMIO 区域,像 Nouveau 等开源软件从来不访问它
  • GPU context
    • GPU context 代表了 GPU 计算的状态
    • 在 GPU 上拥有自己的虚拟地址
    • 在 GPU 上可以共存多种 context
  • GPU channel
    • 任何命令都是由 CPU 发出
    • 命令流(command stream)被提交到硬件单元,也就是 GPU channel
    • 每个 GPU channel 关联一个 context,而一个 GPU context 可以有多个 GPU channel。
    • 每个 GPU context 包含相关 channel 的 GPU channel descriptors 。 每个 descriptor 都是 GPU 内存中的一个对象。
    • 每个 GPU channel descriptor 存储了 channel 的设置,其中就包括 page table 。
    • 在每个 GPU channel 中,在 GPU 内存中分配了唯一的命令缓存,这通过 MMIO 对 CPU 可见。
    • GPU context switching 和命令执行都在 GPU 硬件内部调度。
  • GPU Page Table
    • GPU context 在虚拟基地空间由页表隔离其他的 context 。
    • GPU 的页表隔离 CPU 页表,位于 GPU 内存中。
    • GPU 页表的物理地址位于 GPU channel descriptor  中。
    • GPU 页表不仅仅将 GPU 虚拟地址转换成 GPU 内存的物理地址,也可以转换成 CPU 的物理地址。因此,GPU 页表可以将 GPU 虚拟地址和 CPU 内存地址统一到 GPU 统一虚拟地址空间来。
  • PCIe BAR
    • GPU 设备通过 PCIe 总线接入到主机上。 base address registers(BARs) 是 MMIO 的窗口,在 GPU 启动时候配置。
    • GPU 的控制寄存器和内存都映射到了 BARs 中。
    • GPU 设备内存通过映射的 MMIO 窗口去配置 GPU 和访问 GPU 内存。
  • PFIFO Engine
    • PFIFO 是 GPU 命令提交通过的一个特殊的部件
    • PFIFO 维护了一些独立命令队列,也就是  channel
    • 此命令队列是  ring buffer,有  PUT  和  GET  的指针。
    • 所有访问  channel  控制区域的执行指令都被 PFIFO 拦截下来。
    • GPU 驱动使用  channel descriptor  来存储相关的  channel  设定。
    • PFIFO 将读取的命令转交给 PGRAPH engine
  • BO
    • Buffer Object (bo),内存的一块(block),能够用于存储 texture, a render target, shader code 等等。
    • nouveau 和 gdev 经常使用 BO