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通道進行通訊。