Qualcomm Cloud AI 100 (AIC100)

概述

Qualcomm Cloud 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使用标准的Qualcomm VID (0x17cb)。 所有AIC100 SKU都使用相同的AIC100 DID (0xa100)。

AIC100不实现FLR(功能级别重置)。

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

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

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

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

  • 第三个BAR的大小可变,具体取决于单个AIC100的配置,但默认为64K。 此BAR目前没有用途。

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

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

  • QSM(QAIC服务管理器)

  • NSP(神经信号处理器)

  • DMA Bridge

  • DDR

MHI

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

QSM

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

NSP

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

DMA Bridge

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

DDR

AIC100具有板载DDR。 总的来说,一个AIC100最多可以有32 GB的DDR。 此DDR用于存储工作负载、工作负载的数据,并由QSM用于管理设备。 NSP被QSM授予访问DDR的权限。 主机无法直接访问DDR,必须向QSM发出请求才能将数据传输到DDR。

高级使用流程

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

假设用户想要使用AIC100,他们将按照以下步骤操作

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

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

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

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

  5. 一旦不再需要工作负载,就向QSM发出请求以停用工作负载,从而将NSP恢复为空闲状态。

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

启动流程

AIC100使用无闪存启动流程,该流程源自Qualcomm 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

用于Qualcomm调试子系统。

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 Bridge

概述

DMA Bridge是设备到主机的主要接口之一(另一个是MHI)。 作为激活在NSP上运行的工作负载的一部分,QSM将该网络分配给一个DMA Bridge通道。 工作负载的DMA Bridge通道(简称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 Bridge忽略。

pcie_dma_cmd

描述此请求的DMA元素。

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

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

  • Bit(4)是完成代码标志,指示DMA Bridge应在此请求完成时生成响应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 Bridge仅在工作负载准备好处理下一个输入时才将数据复制到工作负载的内存中。

响应FIFO

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

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

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

completion_code

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

DMA Bridge将生成MSI到主机,以响应DBC的响应FIFO中的活动。 DMA Bridge硬件具有一个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。 在QSM通过状态事务报告不需要CRC之前,消息应应用CRC。 SA9000P上的QSM需要CRC来进行黑色通道安全。

子系统重启(SSR)

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

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

当发生SSR时,工作负载中的任何状态都会丢失。 任何正在处理中或已排队但尚未服务Input都会丢失。 加载的工件将保留在板载DDR中,但是如果主机想要恢复工作负载,则需要重新激活工作负载。

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

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

遥测

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