GPU — CPU-GPU 异构计算系统
Posted 范桂飓
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GPU — CPU-GPU 异构计算系统相关的知识,希望对你有一定的参考价值。
目录
文章目录
CPU-GPU 异构计算系统
在现代的异构计算系统中,GPU 是以 PCIe 卡的形式作为 CPU 的辅助计算设备。根据 CPU 和 GPU 是否共享了内存,可分为两种类型的 CPU-GPU 异构计算架构:
- 分离式架构:CPU 和 GPU 拥有各自独立的缓存和内存,两者之间通过 PCIe 总线通信。目前主要做计算机、智能手机中使用。
- 耦合式架构:CPU 和 GPU 共享内存和缓存。AMD 的 APU 采用的就是这种结构,目前主要使用在游戏主机中。
分离式架构
分离式架构的缺点在于 PCIe 传输成了其中的性能瓶颈,例如:PCIe Gen3 x1 理论带宽约为 1000MB/s,所以对于 Gen3 x32 的最大带宽约为 32GB/s,而受限于本身的实现机制,有效带宽往往只有理论值的 2/3,甚至更低。
由于,CPU 与 GPU 之间的通信开销是比较大的。而针对 GPU 之间的互连,Nvidia 推出 NVLink 技术替代传统 PCIe 总线的方式,根据 Nvidia 官网数据,GPU 性能提升了 5 倍。
下图是分离式架构的资源管理模型:
-
MMIO(Memory Mapped IO),设备上的寄存器或存储,CPU 以内存读写指令来进行直接访问。
- CPU 与 GPU 的交流就是通过 MMIO 进行的。CPU 通过 MMIO 访问 GPU 的寄存器状态。
- 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 Memory 中的一个对象。
- 每个 GPU Channel Descriptor 存储了 Channel 的设置,其中就包括 Page Table 。
- 每个 GPU Channel 在 GPU Memory 中分配了唯一的命令缓存,这通过 MMIO 对 CPU 可见。
- GPU Context Switching 和命令执行都在 GPU 硬件内部调度。
-
GPU Page Table
- GPU Context 在虚拟基地空间由 Page Table 隔离其它的 Context。
- GPU Page Table 隔离 CPU Page Table,位于 GPU Memory 中。
- GPU Page Table 的物理地址位于 GPU Channel Descriptor 中。
- GPU Page Table 不仅仅将 GPU 虚拟地址转换成 GPU 内存的物理地址,也可以转换成 CPU 的物理地址。因此,GPU Page Table 可以将 GPU 虚拟地址和 CPU 内存地址统一到 GPU 统一虚拟地址空间来。
-
PCIe BAR
- GPU 设备通过 PCIe 总线接入到主机上。BARs(Base Address Registers)是 MMIO 的窗口,在 GPU 启动时候配置。
- GPU 的控制寄存器和内存都映射到了 BARs 中。
- GPU 设备内存通过映射的 MMIO 窗口去配置 GPU 和访问 GPU Memory。
-
PFIFO Engine
- PFIFO 是 GPU 命令提交通过的一个特殊的部件。
- PFIFO 维护了一些独立命令队列,也就是 Channel。
- 此命令队列是 Ring Buffer,有 PUT 和 GET 的指针。
- 所有访问 Channel 控制区域的执行指令都被 PFIFO 拦截下来。
- GPU 驱动使用 Channel Descriptor 来存储相关的 Channel 设定。
- PFIFO 将读取的命令转交给 PGRAPH Engine。
-
Buffer Object
- Buffer Object 是内存的一个块(Block),能够用于存储纹理(Texture)、渲染目标(Render Target)、着色代码(shader code)等等。
- Buffer Object 是内存的一个块(Block),能够用于存储纹理(Texture)、渲染目标(Render Target)、着色代码(shader code)等等。
以上是关于GPU — CPU-GPU 异构计算系统的主要内容,如果未能解决你的问题,请参考以下文章