简介

Linux 计算加速器子系统旨在以通用的方式向用户空间公开计算加速器,并提供一组通用功能。

这些设备可以是独立的 ASIC,也可以是 SoC/GPU 内部的 IP 模块。虽然这些设备通常设计用于加速机器学习 (ML) 和/或深度学习 (DL) 计算,但 accel 层并不局限于处理这些类型的加速器。

通常,计算加速器将属于以下类别之一

  • 边缘 AI - 在边缘设备上进行推理。它可以是嵌入式 ASIC/FPGA,或 SoC 内部的 IP(例如笔记本电脑网络摄像头)。这些设备通常使用寄存器进行配置,并且可以使用或不使用 DMA 工作。

  • 推理数据中心 - 大型服务器中的单用户/多用户设备。这种类型的设备可以是独立的,也可以是 SoC 或 GPU 内部的 IP。它将具有板载 DRAM(用于保存 DL 拓扑)、DMA 引擎和命令提交队列(内核队列或用户空间队列)。它可能还具有 MMU 来管理多个用户,并且还可能启用虚拟化 (SR-IOV) 以支持同一设备上的多个 VM。此外,这些设备通常会配备一些工具,例如分析器和调试器。

  • 训练数据中心 - 类似于推理数据中心卡,但通常具有更高的计算能力和内存带宽(例如 HBM),并且可能具有放大/缩小的方法,即分别连接到服务器内部或其他服务器中的其他训练卡。

所有这些设备通常具有不同的运行时用户空间软件堆栈,这些堆栈是为其硬件量身定制的。此外,它们可能还包括一个编译器,用于为其定制的计算引擎生成程序。通常,用户空间中的公共层将是 DL 框架,例如 PyTorch 和 TensorFlow。

与 DRM 共享代码

由于这种类型的设备可以是 GPU 内部的 IP,或具有与 GPU 类似的特性,因此 accel 子系统将使用 DRM 子系统的代码和功能。即 accel 核心代码将是 DRM 子系统的一部分,并且 accel 设备将是新型的 DRM 设备。

这将使我们能够利用广泛的 DRM 代码库,并与在这一类型设备方面拥有经验的 DRM 开发人员进行协作。此外,为加速器驱动程序添加的新功能也可以供 GPU 驱动程序使用。

与 GPU 的区别

因为我们希望防止广泛的用户空间图形软件堆栈尝试将加速器用作 GPU,所以计算加速器将通过使用新的主编号和新的设备字符文件来与 GPU 区分开来。

此外,驱动程序将位于内核树中的单独位置 - drivers/accel/。

加速器设备将通过专用的 261 主编号公开给用户空间,并将具有以下约定

  • 设备字符文件 - /dev/accel/accel*

  • sysfs - /sys/class/accel/accel*/

  • debugfs - /sys/kernel/debug/accel/*/

入门指南

首先,请阅读 GPU 驱动程序开发人员指南 中的 DRM 文档。它不仅会解释如何编写新的 DRM 驱动程序,而且还会包含有关如何贡献、行为准则以及编码风格/文档的所有信息。所有这些对于 accel 子系统都是相同的。

其次,请确保内核配置了 CONFIG_DRM_ACCEL。

要将您的设备公开为加速器,需要在您的驱动程序中进行两项更改(与标准 DRM 驱动程序相反)

  • 在您的 drm_driver 的 driver_features 字段中添加 DRIVER_COMPUTE_ACCEL 功能标志。重要的是要注意,此驱动程序功能与 DRIVER_RENDER 和 DRIVER_MODESET 互斥。希望公开图形和计算设备字符文件的设备应由使用辅助总线框架连接的两个驱动程序处理。

  • 将驱动程序 fops 结构中的 open 回调更改为 accel_open()。或者,您的驱动程序可以使用 DEFINE_DRM_ACCEL_FOPS 宏轻松设置正确的功能操作指针结构。

外部参考

电子邮件线程

会议演讲