算豐技術(shù)揭秘|如何高效處理LMEM中的數據?這篇文章帶你學(xué)會(huì )!
Weight Reorder是TPU-MLIR的一個(gè)pass(參考TPU-MLIR編譯流程圖),其完成了對部分常量數據的Layout變化和合并。

本文介紹其中Convlotion Kernel的Reorder行為以及合并Bias機制,幫助大家理解Conv2D.cpp代碼(點(diǎn)擊閱讀原文進(jìn)行跳轉)中的原理。
在SOPHON硬件中,存儲單元多種多樣,包括LMEM(本地存儲器)、SMEM(靜態(tài)SRAM)和GMEM(全局存儲器,即片外DDR存儲)。其中,LMEM作為一種高速SRAM,因其靠近執行單元(EU)而提供了高帶寬和低延遲的訪(fǎng)問(wèn)特性。為了實(shí)現這種高速訪(fǎng)問(wèn),SOPHON BM1684X處理器將LMEM劃分為64個(gè)分區,每個(gè)分區均可由相應的NPU單元獨立訪(fǎng)問(wèn)。每個(gè)NPU包含多個(gè)EU,并且在不同的計算類(lèi)型下,EU處理的數據各不相同。NPU無(wú)法跨分區訪(fǎng)問(wèn)數據。下圖展示了這種結構的概覽。

64個(gè)分區的地址是連續編碼的,即第一個(gè)分區的下一個(gè)地址便是第二個(gè)分區的起始地址。為了簡(jiǎn)化編程,SOPHON定義了數據在LMEM中的布局(Layout)。為了更直觀(guān)地描述這種布局,本文將采用numpy中的ndarray形式來(lái)演示,并使用numpy定義的操作來(lái)說(shuō)明數據在存儲器中的布局與神經(jīng)網(wǎng)絡(luò )中定義的數據存在的差異。
本文涉及的ndarray操作包括reshape和transpose,并定義了一個(gè)resize函數來(lái)整理數據布局。resize函數可以對數據的指定維度進(jìn)行擴展。例如:

此時(shí),在d0、d1、d3維度上使用0進(jìn)行填充,以達到最終尺寸。

resize函數的一個(gè)參考實(shí)現如下:

LMEM中四維數據的排布
在LMEM中,一個(gè)四維數據(n,c,h,w)的Channel維度會(huì )被分散到不同的lane上。以一個(gè)shape為(2,5,2,3)的數據為例,假設NPU數量為4,每個(gè)NPU中EU數量為4,并且數據在h,w維度上需要與EU對齊:



其中(n^, c^, h^, w^)為每個(gè)lane上數據的實(shí)際shape,對應的stride也滿(mǎn)足處理器中的定義??梢詤⒖糡PUKernel用戶(hù)開(kāi)發(fā)手冊中的描述。npu_id維度是一個(gè)隱含維度,其值為npu數量,此處為4。

在4個(gè)NPU上對齊EU的數據排列
卷積權重的排列
為了確保EU能夠高效地使用,BM1684X處理器中卷積的權重需要按照EU對齊的方式優(yōu)先存儲IC維度的數據,然后將OC維度分布到不同的NPU上。相應的存儲方式可以表示為:


卷積權重的存儲方式
卷積權重與偏置的合并
在BM1684X中,權重需要按照EU對齊方式存儲,而偏置則采用緊湊模式。由于偏置數據量較小,直接拷貝效率不高。因為兩種模式下數據的stride不一致,無(wú)法直接將它們拼接在一起。在TPU-MLIR中,通過(guò)預先將權重和偏置合并,形成最終在LMEM中的存儲形式,然后通過(guò)一條DMA指令直接加載到LMEM中。


卷積權重和偏置合并后的形式
通過(guò)上述方法,我們可以有效地組織LMEM中的數據,以適應SOPHON ?BM1684X處理器的計算需求,從而提高整體的執行效率和性能。
?