高通云 AI 100 (AIC100)

概述

高通云 AI 100/AIC100 系列产品(包括 SA9000P - Snapdragon Ride 的一部分)是 PCIe 适配器卡,其中包含一个专用的 SoC ASIC,用于高效运行人工智能 (AI) 深度学习推理工作负载。 它们是 AI 加速器。

AIC100 的 PCIe 接口能够通过八个通道 (x8) 实现 PCIe Gen4 速度。 卡上的单个 SoC 最多可以有 16 个 NSP 用于运行工作负载。 每个 SoC 都有一个 A53 管理 CPU。 卡上最多可以有 32 GB 的 DDR。

可以在单个系统中托管多个 AIC100 卡以扩展整体性能。 AIC100 卡具有多用户能力,能够以并发方式执行来自多个用户的工作负载。

硬件描述

AIC100 卡由一个 AIC100 SoC、板载 DDR 和一组杂项外围设备(PMIC 等)组成。

AIC100 卡可以是 PCIe HHHL 外形尺寸(传统的 PCIe 卡)或双 M.2 卡。两者都使用 PCIe 连接到主机系统。

作为 PCIe 端点/适配器,AIC100 使用标准的 VendorID(VID)/ DeviceID(DID) 组合来唯一标识自身到主机。 AIC100 使用标准的高通 VID (0x17cb)。 所有 AIC100 SKU 都使用相同的 AIC100 DID (0xa100)。

AIC100 不实现 FLR(功能级复位)。

AIC100 实现 MSI,但不实现 MSI-X。 AIC100 首选 17 个 MSI 来运行(1 个用于 MHI,16 个用于 DMA 桥)。在无法保留 32 个 MSI 的情况下,可以回退到 1 个 MSI。

作为 PCIe 设备,AIC100 利用 BAR 为设备硬件提供主机接口。 AIC100 提供 3 个 64 位 BAR。

  • 第一个 BAR 的大小为 4K,并将 MHI 接口暴露给主机。

  • 第二个 BAR 的大小为 2M,并将 DMA 桥接口暴露给主机。

  • 第三个 BAR 的大小根据单个 AIC100 的配置而变化,但默认为 64K。 此 BAR 目前没有用途。

从主机的角度来看,AIC100 有几个关键的硬件组件 -

  • MHI (调制解调器主机接口)

  • QSM (QAIC 服务管理器)

  • NSP(神经信号处理器)

  • DMA 桥

  • DDR

MHI

AIC100 在 PCIe 上有一个 MHI 接口。 MHI 本身记录在 MHI。MHI 是主机用来与 QSM 通信的机制。 除了通过 DMA 桥传输工作负载数据外,与设备的所有交互都通过 MHI 进行。

QSM

QAIC 服务管理器。 这是一个 ARM A53 CPU,它运行卡的主要固件并执行板载管理任务。 它还通过 MHI 与主机通信。 每个 AIC100 都有一个这样的处理器。

NSP

神经信号处理器。 每个 AIC100 最多有 16 个。 这些是在 AIC100 上运行工作负载的处理器。 每个 NSP 都是一个带有 HVX 和 HMX 的高通 Hexagon (Q6) DSP。 每个 NSP 一次只能运行一个工作负载,但可以将多个 NSP 分配给单个工作负载。 由于每个 NSP 只能运行一个工作负载,因此 AIC100 限制为 16 个并发工作负载。 工作负载“调度”由主机负责。 AIC100 不会自动进行时间分片。

DMA 桥

DMA 桥是自定义 DMA 引擎,用于管理工作负载中数据的流入和流出。 AIC100 有一个这样的 DMA 桥。 DMA 桥有 16 个通道,每个通道都由一组请求/响应 FIFO 组成。 每个活动的工作负载都会分配到一个 DMA 桥通道。 DMA 桥公开硬件寄存器以管理 FIFO(头/尾指针),但需要主机内存来存储 FIFO。

DDR

AIC100 具有板载 DDR。 总的来说,一个 AIC100 可以有高达 32 GB 的 DDR。 此 DDR 用于存储工作负载、工作负载的数据,并由 QSM 用于管理设备。 QSM 允许 NSP 访问 DDR 的各个部分。 主机无法直接访问 DDR,必须向 QSM 发出将数据传输到 DDR 的请求。

高层次使用流程

AIC100 是一种多用户可编程加速器,通常用于在推理模式下运行神经网络,以高效地执行 AI 操作。 AIC100 不适用于训练神经网络。 AIC100 可用于通用计算工作负载。

假设用户想要使用 AIC100,他们将遵循以下步骤

  1. 将工作负载编译成以 NSP 为目标的 ELF

  2. 向 QSM 发出请求,将工作负载和相关工件加载到设备 DDR 中

  3. 向 QSM 发出请求,以将工作负载激活到一组空闲的 NSP 上

  4. 向 DMA 桥发出请求,将输入数据发送到要处理的工作负载,并发出其他请求以接收来自工作负载的已处理输出数据。

  5. 一旦不再需要工作负载,向 QSM 发出请求以停用工作负载,从而使 NSP 返回空闲状态。

  6. 一旦未来的会话不再需要工作负载和相关工件,则向 QSM 发出请求以从 DDR 中卸载数据。 这会释放 DDR 以供其他用户使用。

引导流程

AIC100 使用从高通 MSM 派生的无闪存引导流程。

当 AIC100 首次上电时,它会开始从 ROM 执行 PBL(主引导加载程序)。 PBL 枚举 PCIe 链路,并初始化 MHI 的 BHI(引导主机接口)组件。

使用 BHI,主机将 PBL 指向 SBL(辅助引导加载程序)映像的位置。 PBL 从主机提取映像,对其进行验证,并开始执行 SBL。

SBL 初始化 MHI,并使用 MHI 通知主机设备已进入 SBL 阶段。 SBL 执行多项操作

  • SBL 初始化大多数硬件(PBL 未初始化的所有内容),包括 DDR。

  • SBL 将引导日志卸载到主机。

  • SBL 与主机同步时间戳,以便将来记录日志。

  • SBL 使用 Sahara 协议从主机获取运行时固件映像。

一旦 SBL 获取并验证了运行时固件,它就会将 NSP 从复位状态拉出,并跳转到 QSM。

QSM 使用 MHI 通知主机设备已进入 QSM 阶段(MHI 术语为 AMSS)。 此时,AIC100 设备功能齐全,可以处理工作负载。

用户空间组件

编译器

可以在以下位置找到基于上游 LLVM 的 AIC100 开源编译器:https://github.com/quic/software-kit-for-qualcomm-cloud-ai-100-cc

用户模式驱动程序 (UMD)

可以在以下位置找到与 qaic 内核驱动程序接口的开源 UMD:https://github.com/quic/software-kit-for-qualcomm-cloud-ai-100

Sahara 加载程序

可以在以下位置找到名为 kickstart 的 Sahara 协议的开源实现:https://github.com/andersson/qdl

MHI 通道

AIC100 为不同的目的定义了许多 MHI 通道。 这是已定义通道及其用途的列表。

通道名称

ID

EE

用途

QAIC_LOOPBACK

0 & 1

AMSS

在此通道上发送到设备的任何数据都会发送回主机。

QAIC_SAHARA

2 & 3

SBL

由 SBL 用来从主机获取运行时固件。

QAIC_DIAG

4 & 5

AMSS

用于通过 DIAG 协议与 QSM 通信。

QAIC_SSR

6 & 7

AMSS

用于通知主机子系统重启事件,并卸载 SSR 崩溃转储。

QAIC_QDSS

8 & 9

AMSS

用于高通调试子系统。

QAIC_CONTROL

10 & 11

AMSS

用于神经网络控制 (NNC) 协议。 这是主机和 QSM 之间管理工作负载的主要通道。

QAIC_LOGGING

12 & 13

SBL

SBL 使用此通道将启动日志发送到主机。

QAIC_STATUS

14 & 15

AMSS

用于将可靠性、可访问性、可维护性 (RAS) 事件通知主机。

QAIC_TELEMETRY

16 & 17

AMSS

用于获取/设置电源/热量等属性。

QAIC_DEBUG

18 & 19

AMSS

未使用。

QAIC_TIMESYNC

20 & 21

SBL

用于将设备端日志中的时间戳与主机时间源同步。

QAIC_TIMESYNC_PERIODIC

22 & 23

AMSS

用于定期将设备端日志中的时间戳与主机时间源同步。

IPCR

24 & 25

AMSS

AF_QIPCRTR 客户端和服务器。

DMA 桥

概述

DMA 桥是设备连接到主机的主要接口之一(另一个是 MHI)。作为在 NSP 上激活工作负载的一部分,QSM 为该网络分配一个 DMA 桥通道。工作负载的 DMA 桥通道(简称 DBC)仅供该工作负载使用,不与其他工作负载共享。

每个 DBC 都是一对 FIFO,用于管理工作负载的输入和输出数据。一个 FIFO 是请求 FIFO。另一个 FIFO 是响应 FIFO。

每个 DBC 在硬件中包含 4 个寄存器

  • 请求 FIFO 头指针(偏移量 0x0)。主机只读。指示设备已使用的 FIFO 中的最新项。

  • 请求 FIFO 尾指针(偏移量 0x4)。主机读/写。主机递增此寄存器以将新项添加到 FIFO。

  • 响应 FIFO 头指针(偏移量 0x8)。主机读/写。指示主机已使用的 FIFO 中的最新项。

  • 响应 FIFO 尾指针(偏移量 0xc)。主机只读。设备递增此寄存器以将新项添加到 FIFO。

每个寄存器中的值是 FIFO 中的索引。要获取由寄存器指向的 FIFO 元素的位置:FIFO 基址 + 寄存器 * 元素大小。

DBC 寄存器通过第二个 BAR 暴露给主机。每个 DBC 占用 BAR 中的 4KB 空间。

实际的 FIFO 由主机内存支持。当向 QSM 发送激活网络的请求时,主机必须捐赠内存以供 FIFO 使用。由于设备的内部映射限制,每个 DBC 必须提供一个连续的内存块,该内存块同时承载两个 FIFO。请求 FIFO 将占用内存块的开头,响应 FIFO 将占用内存块的末尾。

请求 FIFO

请求 FIFO 元素具有以下结构

struct request_elem {
      u16 req_id;
      u8  seq_id;
      u8  pcie_dma_cmd;
      u32 reserved;
      u64 pcie_dma_source_addr;
      u64 pcie_dma_dest_addr;
      u32 pcie_dma_len;
      u32 reserved;
      u64 doorbell_addr;
      u8  doorbell_attr;
      u8  reserved;
      u16 reserved;
      u32 doorbell_data;
      u32 sem_cmd0;
      u32 sem_cmd1;
      u32 sem_cmd2;
      u32 sem_cmd3;
};

请求字段描述

req_id

请求 ID。具有相同请求 ID 的请求 FIFO 元素和响应 FIFO 元素指的是同一个命令。

seq_id

请求内的序列 ID。DMA 桥忽略此项。

pcie_dma_cmd

描述此请求的 DMA 元素。

  • Bit(7) 是强制 MSI 标志,它会覆盖 DMA 桥 MSI 逻辑,并在完成此请求时生成 MSI,并且 QSM 配置 DMA 桥来查看此位。

  • Bits(6:5) 是保留位。

  • Bit(4) 是完成代码标志,指示 DMA 桥应在此请求完成时生成响应 FIFO 元素。

  • Bit(3) 指示此请求是链接列表传输 (0) 还是批量传输 (1)。

  • Bit(2) 是保留位。

  • Bits(1:0) 指示传输类型。无传输 (0)、到设备 (1)、从设备 (2)。值 3 是非法值。

pcie_dma_source_addr

批量传输的源地址或链接列表的地址。

pcie_dma_dest_addr

批量传输的目标地址。

pcie_dma_len

批量传输的长度。请注意,此字段的大小将传输限制为 4G。

doorbell_addr

此请求完成时要响铃的门铃地址。

doorbell_attr

门铃属性。

  • Bit(7) 指示是否要写入门铃。

  • Bits(6:2) 是保留位。

  • Bits(1:0) 包含门铃长度的编码。0 为 32 位,1 为 16 位,2 为 8 位,3 为保留位。门铃地址必须与指定的长度自然对齐。

doorbell_data

要写入门铃的数据。只有与门铃长度对应的位有效。

sem_cmdN

信号量命令。

  • Bit(31) 指示此信号量命令已启用。

  • Bit(30) 是到设备 DMA 栅栏。阻止此请求,直到所有到设备 DMA 传输完成。

  • Bit(29) 是从设备 DMA 栅栏。阻止此请求,直到所有从设备 DMA 传输完成。

  • Bits(28:27) 是保留位。

  • Bits(26:24) 是信号量命令。0 是 NOP。1 是使用指定的值初始化。2 是递增。3 是递减。4 是等待直到信号量等于指定的值。5 是等待直到信号量大于或等于指定的值。6 是“P”,等待直到信号量大于 0,然后递减 1。7 是保留位。

  • Bit(23) 是保留位。

  • Bit(22) 是信号量同步。0 是后同步,这意味着信号量操作在 DMA 传输之后完成。1 是预同步,它控制 DMA 传输。每个请求只允许一个预同步。

  • Bit(21) 是保留位。

  • Bits(20:16) 是要操作的信号量的索引。

  • Bits(15:12) 是保留位。

  • Bits(11:0) 是在操作中使用的信号量值。

总的来说,请求分 4 个步骤处理

  1. 如果指定,则预同步信号量条件必须为真

  2. 如果启用,则会发生 DMA 传输

  3. 如果指定,则后同步信号量条件必须为真

  4. 如果启用,则写入门铃

通过将信号量与在 NSP 上运行的工作负载结合使用,可以同步数据管道,以便主机可以为工作负载排队多个数据请求以进行处理,但只有当工作负载准备好处理下一个输入时,DMA 桥才会将数据复制到工作负载的内存中。

响应 FIFO

一旦请求被完全处理,如果 pcie_dma_cmd 中指定,则会生成响应 FIFO 元素。响应 FIFO 元素的结构

struct response_elem {
      u16 req_id;
      u16 completion_code;
};
req_id

与生成此元素的请求的 req_id 匹配。

completion_code

此请求的状态。0 表示成功。非零表示错误。

作为对 DBC 响应 FIFO 中活动的反应,DMA 桥将向主机生成 MSI。DMA 桥硬件具有 IRQ 风暴缓解算法,其中仅当响应 FIFO 从空转换为非空时才会生成 MSI(除非启用并触发了强制 MSI)。为了响应此 MSI,主机应清空响应 FIFO,并且必须注意处理清空 FIFO 与设备将元素插入 FIFO 之间的任何竞争条件。

神经网络控制 (NNC) 协议

NNC 协议是主机向 QSM 发出管理工作负载请求的方式。它使用 QAIC_CONTROL MHI 通道。

每个 NNC 请求都打包到一个消息中。每个消息都是一系列事务。直通类型事务可以包含称为命令的元素。

QSM 要求 NNC 消息以小端编码,并且字段自然对齐。由于某些 NNC 消息中存在 64 位元素,因此必须保持 64 位对齐。

消息包含一个标头,然后是一系列事务。从 QSM 到主机的消息大小最大为 4K。从主机到 QSM,消息大小最大为 64K(单个 MHI 数据包的最大大小),但有一个延续功能,其中消息 N+1 可以标记为消息 N 的延续。这用于非常大的 DMA xfer 事务。

事务描述

直通

允许用户空间将不透明的有效负载直接发送到 QSM。这用于 NNC 命令。用户空间负责管理有效负载中的 QSM 消息要求。

dma_xfer

DMA 传输。描述 QSM 应通过地址和大小元组 DMA 到设备中的对象。

激活

将工作负载激活到 NSP 上。主机必须提供供 DBC 使用的内存。

停用

停用活动的工作负载,并将 NSP 返回到空闲状态。

状态

查询 QSM 关于其 NNC 实现的信息。返回 NNC 版本以及是否使用 CRC。

终止

释放用户的资源。

dma_xfer_cont

先前 DMA 传输的延续。如果无法在单个消息中指定 DMA 传输(高度碎片化),则可以使用此事务指定更多范围。

validate_partition

向 QSM 查询以确定分区标识符是否有效。

每个消息都标记有用户 ID 和分区 ID。用户 ID 允许 QSM 跟踪资源,并在用户消失时(例如进程崩溃时)释放它们。分区 ID 标识 QSM 管理的资源分区,此消息应用于该分区。

消息可以有 CRC。消息应应用 CRC,直到 QSM 通过状态事务报告不需要 CRC 为止。SA9000P 上的 QSM 需要 CRC 用于黑通道安全。

子系统重启 (SSR)

SSR 是限制错误影响的概念。AIC100 设备可能有多个用户,每个用户都有自己的工作负载在运行。如果一个用户的工作负载崩溃,则该崩溃的后果应仅限于该工作负载,而不会影响其他工作负载。SSR 可以实现此目的。

如果特定工作负载崩溃,QSM 会通过 QAIC_SSR MHI 通道通知主机。此通知通过分配的 DBC 来标识工作负载。然后使用多阶段恢复过程来清理两侧,并使 DBC/NSP 进入工作状态。

当发生 SSR 时,工作负载中的任何状态都会丢失。正在处理中或排队但尚未提供服务的任何输入都会丢失。加载的工件将保留在卡上的 DDR 中,但如果主机希望恢复工作负载,则需要重新激活该工作负载。

可靠性、可访问性、可维护性 (RAS)

AIC100 预计将部署在应用 RAS 理念的服务器系统中。简而言之,RAS 是检测、分类和报告错误的概念。虽然 PCIe 具有 AER(高级错误报告),它会影响 RAS,但 AER 不允许设备报告有关内部错误的详细信息。因此,AIC100 实现了自定义 RAS 机制。当发生 RAS 事件时,QSM 将通过 QAIC_STATUS MHI 通道报告该事件及其相应的详细信息。系统管理员可以根据 RAS 报告确定特定设备是否需要额外的服务。

遥测

QSM 能够报告设备的各种物理属性,并且在某些情况下,允许主机控制它们。示例包括热限制、热读数和功率读数。这些项目通过 QAIC_TELEMETRY MHI 通道进行通信。