Magma:設計

如需 Magma 總覽,包括背景、硬體需求和架構說明,請參閱「Magma:總覽」一文。

目標

可擴充核心

Magma 的目標是將用戶端驅動程式在不同 GPU 和用戶端驅動程式庫程式設計中,與個別系統驅動程式進行通訊的方式,大幅減少架構差異。必要時,Magma 新增了 GPU 專屬的查詢、指令結構和介面,以滿足特定需求。針對這些差異,請參閱驅動程式庫專屬說明文件。

快轉

請盡可能以前饋方式使用主要處理序間通訊 (IPC) 管道,以避免封鎖用戶端執行緒。針對從系統驅動程式庫傳回用戶端的通知,系統會以非同步方式傳送驅動程式庫定義的訊息。

避免 GPU 錯誤

用戶端可能會導致 GPU 停止運作或錯誤,在這種情況下,會影響合成器等系統重要的 GPU 用戶端,導致使用者體驗明顯問題。因此,Magma 會盡可能降低客戶產生 GPU 錯誤的機會。

架構

如總覽所述,Magma 架構包含兩個驅動程式庫元件:用戶端程式庫,以及具有特殊權限的系統驅動程式庫程式程序。這兩種 API 都有專屬的 GPU;用戶端程式庫必須將 IR (例如 SPIR-V) 的軟體編譯為機器碼,並正確設定指令緩衝區的格式,以供硬體使用。這些資訊會提供給 Magma 系統驅動程式庫,該驅動程式會執行實際硬體程式設計作業。

Magma 架構的區塊圖

Magma 定義了兩個介面來對應 GPU 專用程式碼:

  • magma 介面是用戶端驅動程式庫的基礎,通常為 libvulkan
  • msd (magma 系統驅動程式庫) 介面會指定實作 Magma 服務驅動程式的進入點

libmagma 是一個便利層,可實作 magma 介面,並將呼叫適當轉送到 magma_system,此 magma_system 是無鎖層處理驅動程式庫初始化和拆解、傳輸 IPC 指令,以及一些驗證。

因此,Magma 驅動程式庫的建立程序已大致簡化為兩個步驟:

  1. 使用 Magma 介面產生用戶端驅動程式庫 (如下所述)
  2. 實作 msd 介面以產生 magma 系統驅動程式庫。

如要進一步瞭解這兩個元件的建構程序,請參閱通訊埠指南。

Magma 介面

Magma 介面是由 Magma 系統驅動程式庫提供的服務介面,介面專為實作加速圖形 API 而設計。當中包含 magma.h 和 GPU 特定標頭 (例如:intel)。

在 Fuchsia 中,Magma 含有 magma_sysmem.h 標頭,用戶端可能會用來與 sysmem 互動。您可以在 Fuchsia SDK 中取得 Magma 標頭和靜態資料庫,其網址為 @fuchsia_pkg//pkg/magma_client

實體裝置

在 Fuchsia 啟動順序期間,每個支援加速圖像的實體裝置都會將 Magma 系統驅動程式庫執行個體化。執行個體化時,系統會在 GPU 類別中建立裝置繫結,例如在單一 GPU 系統中,裝置繫結至 /dev/class/gpu 下的節點。具備適當的應用程式權限,用戶端驅動程式可能會掃描是否有一或多個 GPU 類別裝置,然後開啟這些裝置。系統會在裝置檔案描述元上執行同步查詢,以傳回各種參數,其中有些參數可協助應用程式決定要使用哪些實體裝置。

連線

當應用程式宣告其意圖與特定實體裝置搭配運作時,系統會連線到 Magma 系統驅動程式庫。舉例來說,在 Vulkan 中,使用實體裝置的意圖就是呼叫 vkCreateDevice()。此連線便成為用戶端驅動程式庫和系統驅動程式庫之間後續所有通訊的基礎。連線可讓用戶端驅動程式庫分配緩衝區,並對應至 GPU 位址空間。這個連線會定義記憶體隔離邊界,Magma 可保證預設會無法存取對應到某個連線位址空間的緩衝區。您可以透過明確匯出/匯入,在連線之間共用緩衝區。

背景資訊

如要在 GPU 上執行工作,需要有結構定義。結構定義是由 Magma 系統驅動程式庫程式在 CPU 上執行。背景資訊應包含將多個結構定義轉換為硬體所需的所有 GPU 狀態。指令緩衝區可用來設定 GPU 狀態,因此指令緩衝區會提交至特定內容。Magma 支援每個連線的多個結構定義,這是讓多個結構定義共用單一位址空間。

在用戶端連線關閉時,為避免 CPU 錯誤,當 GPU 以該位址空間執行工作時,位址空間必須保持有效,因此,結構定義會在位址空間上取得共用的參考資料。

緩衝區和對應

目前 Magma 使用統一的記憶體架構,如同大多數行動硬體的情況,cpu 和 gpu 都需存取相同的實體記憶體。Magma 緩衝區只是 zircon 虛擬記憶體物件 (VMO)。用戶端驅動程式會分配緩衝區,並向系統驅動程式庫註冊這些緩衝區。

Gpu 位址空間管理由用戶端或系統驅動程式庫執行。用戶端驅動程式庫設計可能會決定模型。

如果系統驅動程式庫管理緩衝區對應生命週期,系統驅動程式庫會確保對應及其基礎緩衝區在 GPU 上仍為待處理狀態。由於對應速度較慢 (因為必須確認緩衝區頁面,並修改頁面表格來參照每個網頁的正確公車地址),緩衝區對應必須保留緩衝區的生命週期,或是 GPU 對應快取可用於限制快取對應使用的記憶體量。

系統驅動程式庫程式管理的緩衝區對應缺點是建立指令清單時,用戶端需要知道對應緩衝區的 gpu 位址,因此在執行前,Magma 服務驅動程式庫程式必須修補指令緩衝區。因此,建議用戶端驅動程式庫明確管理 GPU 對應生命週期。明確做法的缺點是,當對應在 GPU 上進行傳輸時,用戶端可能會取消對應或釋放緩衝區;如果發生此情況,頁面資料表項目在 GPU 使用時會失效,可能引發 GPU 錯誤。

如果每個指令緩衝區都附有相依緩衝區對應清單,就能緩解這個缺點。接著,指令緩衝區可以共用 GPU 對應的擁有權;如果資源在傳輸過程中收到未對應或釋出,系統會將此視為嚴重錯誤,而不會中斷 GPU。

指令提交

指令包含廠商專屬資料,這類資料會修改 GPU 狀態,並在 GPU 運算核心上觸發程式碼執行程序。系統驅動程式庫負責將提交的指令排入佇列並加以排程,以便執行。您可以使用不同的排程演算法:FIFO (預設值)、優先等級、時間切片。如果硬體提供支援,就可以預先先佔傳入指令緩衝區,來實作結構定義的優先順序。

塞馬哥利斯

Magma 提供 Semaphor 做為通用信號機制,可用於導入 Vulkan 圍欄和深海。Magma semaphores 是以 Zircon 事件為基礎,

物件擁有權摘要

  • 用戶端:擁有連線;對緩衝區、對應、環境的共同擁有權
  • 連線:位址空間的共用擁有權
  • 背景資訊:位址空間共用擁有權
  • 位址空間:對應地圖擁有權
  • 對應:緩衝區共用擁有權
  • 指令緩衝區:背景資訊共用擁有權;可能具備對應項目的共同擁有權

執行緒模型

每個已安裝的 GPU 裝置和驅動程式庫使用的執行緒模型如下:

msd 通常是由平台匯流排驅動程式載入,且會建立 msd 主要 devhost 執行緒。接著,mmd 主執行緒會建立裝置執行緒來與 GPU 通訊,以及與驅動程式庫相關聯的中斷執行緒,進而服務 GPU 中斷。

實作 Vulkan API 的用戶端驅動程式庫程式庫稱為 vcd (Vulkan 用戶端驅動程式)。當 Vulkan 應用程式啟動並建立新的 VkDevice 時,vcd 會向 msd 發出要求,為裝置建立連線,以便用於通訊所有 Vulkan 指令。msd 主要執行緒會建立新的連線執行緒來回應所有用戶端指令,藉此回應這項呼叫。連線執行緒則會建立兩個 Zircon 通訊管道:主要管道和通知管道。

Vulkan 狀態設定、資源建立和繪圖指令緩衝區會透過主要管道從 vcd 傳送至 msd。通知管道是用來將非同步狀態訊息傳遞給 vcd。vcd 可能會感興趣的通知範例是完成指令緩衝區。透過裝置和通知管道傳送的確切訊息,以及這些訊息的處理方式,會因 GPU 驅動程式庫而異。

Vulkan 驅動程式庫執行緒模型

請注意,包含 msd 的程序邊界為 msd 的 Fuchsia 開發主機邊界。此開發主機程序可能包含其他驅動程式的執行緒,但這裡只會顯示 msd 專屬的執行緒。

處理錯誤

如果 magma 服務驅動程式庫發生錯誤,系統就會終止對應的連線。當用戶端驅動程式庫嘗試存取已關閉的連線時,通常會收到「裝置遺失」的 Vulkan API 錯誤。

電源管理

電源管理牽涉到依據 GPU 負載的測量值,以及潛在功率或溫度限制,調整 GPU 的執行頻率。詳情請參閱進一步的說明文件。

測試策略

請參閱 test_strategy 相關說明。