記憶體模型
Neat 框架的執行階段會處理大量的位元組——包括編碼後的視訊幀、解碼後的 YUV 平面、FP32 輸入張量、INT8 量化後的圖塊,以及 MLA 暫存區圖像。如果沒有明確的記憶體模型,就必須在每個階段的邊界進行複製。本頁說明了該框架如何避免這些複製操作。
緩衝區三元組:(buffer_id, paddr, vaddr)
框架移動的每個緩衝區都由以下三個要素來識別:
buffer_id— 一個穩定的整數,用於追蹤緩衝區的生命週期(參考計數、區段所有權),這是執行階段所使用的。paddr— 實體位址,這是 IOMMU 對緩衝區的視圖。MLA / EV74 / DMA 硬體會看到這個位址。vaddr— 虛擬位址,這是應用程式所使用的位址。CPU 程式碼會對此位址進行解參。
這個三重緩衝區機制讓緩衝區可以由任何一方(CPU 或加速器)直接存取,而無需複製。單次設定會同時出現在核心頁表(因此軟體可以讀取它)和 IOMMU 頁表(因此硬體可以將資料直接寫入其中)。
階段間的資料傳遞是傳遞三重緩衝區,而不是位元組。
片段
緩衝區來自具名稱的「區段」。區段是指記憶體中的一塊連續區域,由特定的設定器(例如 DMA-BUF、CMA、ION 或一般堆積)提供支援,並附加有元資料,說明哪些元件可以存取它:僅限 CPU、僅限 MLA、兩者皆可,等等。在執行階段,系統會根據每個緩衝區將要觸及的階段,選擇合適的區段。
範例:
- 一個
nv12_decode區段包含從 H.264 解碼後的 YUV 資料——CPU 可以讀取這些資料以進行診斷,IOMMU 可以讀取這些資料以供調整大小節點使用。 - 一個
mla_input區段會儲存傳遞給 MLA 的經過鑲嵌處理的張量——只有 MLA 硬體會讀取它;CPU 存取需要明確的映射。 - 一個
model_output區段在進行去網格化處理後會儲存 FP32 張量——這些張量是 CPU 可以讀取的,因此應用程式可以將它們提取出來。
一個 Tensor 會將其片段與三元組一起傳遞,因此框架可以判斷從 CPU 程式碼發起的讀取/寫入操作是否有效。