GPU — CPU-GPU 异构计算系统

Posted 范桂飓

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GPU — CPU-GPU 异构计算系统相关的知识,希望对你有一定的参考价值。

目录

文章目录

CPU-GPU 异构计算系统

在现代的异构计算系统中,GPU 是以 PCIe 卡的形式作为 CPU 的辅助计算设备。根据 CPU 和 GPU 是否共享了内存,可分为两种类型的 CPU-GPU 异构计算架构:

  1. 分离式架构:CPU 和 GPU 拥有各自独立的缓存和内存,两者之间通过 PCIe 总线通信。目前主要做计算机、智能手机中使用。
  2. 耦合式架构: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)等等。

以上是关于GPU — CPU-GPU 异构计算系统的主要内容,如果未能解决你的问题,请参考以下文章

CPU+GPU异构计算编程简介

您好有个问题请教一下cpu怎么和gpu并行计算处理好日常软件

异构计算 — 异构芯片融合趋势

阿里云异构计算发布:轻量级GPU云服务器实例VGN5i

移动端异构运算技术-GPU OpenCL 编程(基础篇)

10点公开课:快手GPU/FPGA/ASIC异构平台的应用探索