简介

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

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

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

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

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

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

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

与 DRM 共享代码

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

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

与 GPU 的区别

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

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

加速器设备将以专用的 261 主设备号暴露给用户空间,并遵循以下约定:

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

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

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

入门

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

其次,确保内核已配置 CONFIG_DRM_ACCEL。

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

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

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

外部参考

邮件线程

会议演讲