0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

如何高效處理LMEM中的數(shù)據(jù)?這篇文章帶你學會!

算能開發(fā)者社區(qū) ? 2024-01-19 08:33 ? 次閱讀

Weight Reorder是TPU-MLIR的一個pass(參考TPU-MLIR編譯流程圖),其完成了對部分常量數(shù)據(jù)的Layout變化和合并。本文介紹其中Convlotion Kernel的Reorder行為以及合并Bias機制,幫助大家理解Conv2D.cpp代碼中的原理。

在SOPHON硬件中,存儲單元多種多樣,包括LMEM(本地存儲器)、SMEM(靜態(tài)SRAM)和GMEM(全局存儲器,即片外DDR存儲)。其中,LMEM作為一種高速SRAM,因其靠近執(zhí)行單元(EU)而提供了高帶寬和低延遲的訪問特性。為了實現(xiàn)這種高速訪問,SOPHON BM1684X處理器將LMEM劃分為64個分區(qū),每個分區(qū)均可由相應的NPU單元獨立訪問。每個NPU包含多個EU,并且在不同的計算類型下,EU處理的數(shù)據(jù)各不相同。NPU無法跨分區(qū)訪問數(shù)據(jù)。下圖展示了這種結構的概覽。6da8586a-b662-11ee-aa22-92fbcf53809c.png

64個分區(qū)的地址是連續(xù)編碼的,即第一個分區(qū)的下一個地址便是第二個分區(qū)的起始地址。為了簡化編程,SOPHON定義了數(shù)據(jù)在LMEM中的布局(Layout)。為了更直觀地描述這種布局,本文將采用numpy中的ndarray形式來演示,并使用numpy定義的操作來說明數(shù)據(jù)在存儲器中的布局與神經(jīng)網(wǎng)絡中定義的數(shù)據(jù)存在的差異。

本文涉及的ndarray操作包括reshape和transpose,并定義了一個resize函數(shù)來整理數(shù)據(jù)布局。resize函數(shù)可以對數(shù)據(jù)的指定維度進行擴展。例如:

tensor_a.shape=(1,2,3,4)#對應于d0=1,d1=2,d2=3,d3=4
tensor_b=resize(tensor_a,(2,4,3,8))

此時,在d0、d1、d3維度上使用0進行填充,以達到最終尺寸。

In[1]:tensor_a
Out[1]:
array([[[[0, 1, 2, 3],
[4, 5, 6, 7],
[8, 9,10,11]],

[[12,13,14,15],
[16,17,18,19],
[20,21,22,23]]]])

In[2]:resize(tensor_a,(1,3,3,6))
Out[2]:
array([[[[0, 1, 2, 3, 0, 0],
[4, 5, 6, 7, 0, 0],
[8, 9,10,11, 0, 0]],

[[12,13,14,15, 0, 0],
[16,17,18,19, 0, 0],
[20,21,22,23, 0, 0]],

[[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0]]]])

resize函數(shù)的一個參考實現(xiàn)如下:

defresize(src,shape):
out=np.zeros(shape,dtype=src.dtype)
_src_slice=tuple(slice(0,min(i,j))fori,jinzip(src.shape,shape))
out[_src_slice]=src
returnout

LMEM中四維數(shù)據(jù)的排布

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

shape=(2,5,2,3)
a=np.arange(np.prod(shape)).reshape(shape)

6dbc2818-b662-11ee-aa22-92fbcf53809c.png

b=a.reshape(2,5,6)#數(shù)據(jù)hw合并
b=(
resize(b,(2,8,8)) #channel對齊到NPU,hw對齊到EU
.reshape(2,2,4,2,4)
.transpose(2,0,1,3,4)#(4,2,2,2,4)<-?(npu_id,?n^,?c^,?h^,?w^)
)

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

6dbc2818-b662-11ee-aa22-92fbcf53809c.png在4個NPU上對齊EU的數(shù)據(jù)排列

卷積權重的排列

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

c=a.reshape(2,5,6)
c=(
resize(c,(1*4,2*4,6)) #npu,eu_align,h*w
.reshape(1,4,2,4,6)
.transpose(1,0,2,4,3) #<4x1x2x6x4>
)

6dd8092a-b662-11ee-aa22-92fbcf53809c.png卷積權重的存儲方式

卷積權重與偏置的合并

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

d=np.arange(60,65).reshape(1,5,1,1)
d=(
resize(d,(1,2*4,1,1)) #npu,eu_align
.reshape(1,2,4,1,1)
.transpose(2,0,3,4,1) #<4x1x1x1x2>
.resize(4,1,2,1,4)#EUalign<4x1x1x1x4>
)
e=np.concatenate((d.reshape(4,1,4),c.reshape(4,12,4)),axis=1)

6de437b8-b662-11ee-aa22-92fbcf53809c.png卷積權重和偏置合并后的形式

通過上述方法,我們可以有效地組織LMEM中的數(shù)據(jù),以適應SOPHON BM1684X處理器的計算需求,從而提高整體的執(zhí)行效率和性能。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 處理器
    +關注

    關注

    68

    文章

    19038

    瀏覽量

    228469
  • 存儲器
    +關注

    關注

    38

    文章

    7403

    瀏覽量

    163396
  • 編譯
    +關注

    關注

    0

    文章

    647

    瀏覽量

    32743
收藏 人收藏

    評論

    相關推薦

    學會NI-DAQmx的十個函數(shù)解決80%的數(shù)據(jù)采集應用問題

    學會NI-DAQmx的十個函數(shù)解決80%的數(shù)據(jù)采集應用問題
    發(fā)表于 01-12 22:16

    輕松學會單片機

    電平,就可以學習引腳的數(shù)字I/O功能,在按下某個按鈕后,某發(fā)光二極管發(fā)亮,這就是數(shù)字電路組合邏輯的功能,雖然很簡單,但是可以學習一般的單片機編程思想,例如,必須設置很多寄存器對引腳進行初始化處理
    發(fā)表于 09-14 10:51

    帶你分析圖像傳感器與軟件圖像處理流水線

    一篇文章帶你分析圖像傳感器與軟件圖像處理流水線。
    發(fā)表于 04-27 06:28

    從0開始,181頁知識帶你輕松搞定C++語言

    擅長面向對象程序設計的同時,還可以進行基于過程的程序設計,因而C++就適應的問題規(guī)模而論,大小由之。 C++不僅擁有計算機高效運行的實用性特征,同時還致力于提高大規(guī)模程序的編程質量與程序設計語言的問題描述能力。 這個資料帶你從最基礎開始了解學習C++,
    發(fā)表于 07-24 13:10

    如何處理好FPGA設計跨時鐘域間的數(shù)據(jù)

    跨時鐘域處理是FPGA設計中經(jīng)常遇到的問題,而如何處理好跨時鐘域間的數(shù)據(jù),可以說是每個FPGA初學者的必修課。如果是還是在校的學生,跨時鐘域處理也是面試中經(jīng)常常被問到的一個問題。在本篇
    發(fā)表于 07-29 06:19

    教你怎樣學會PID調(diào)參

    不會PID調(diào)參?這篇文章圖文結合帶你學會PID調(diào)參!讓你成為PID調(diào)參大神?。?!
    發(fā)表于 01-06 07:47

    帶你玩轉RT-Thread,開發(fā)教程匯總(共13篇)

    本教程帶你手把手帶你學會玩轉RT-Thread,從RT-Thread的內(nèi)核到外設、傳感器、組件包,應用開發(fā),讓對于剛剛接觸使用RTT的你不再膽怯,開心玩耍RT-Thread!本教程使用的開發(fā)板:正點原子-戰(zhàn)艦V3.0 型號:st
    發(fā)表于 05-11 14:10

    帶你深入探索okio組件高效的奧秘

    。中間多次拷貝,降低了IO效率,同時增加了系統(tǒng)消耗。為了滿足開發(fā)者對IO的更高要求,三方組件庫推出IO處理利器——okio(JS版本)。okio使用Segment作為數(shù)據(jù)存儲容器,通過提供Segment
    發(fā)表于 07-08 14:43

    無法讓SWO數(shù)據(jù)在MCUXpresso上高效工作怎么處理?

    我正在使用 IMXRT-1061/1062 進行項目 我試圖讓 SWO 數(shù)據(jù)在 MCUXpresso 上高效工作,但沒有成功。 設置配置: 從 MCUXpresso 11.5.0 轉移到
    發(fā)表于 06-02 06:59

    基于ARM處理器的高效異常處理解決方案

    。測試結果表明,該方案的異常處理更為高效。 在航空航天、工業(yè)控制及醫(yī)療等領域中,嵌入式系統(tǒng)的安全性、可靠性以及高效性作用顯著,而異常是系統(tǒng)在運行過程的突發(fā)事件,異常
    發(fā)表于 02-03 03:38 ?1344次閱讀
    基于ARM<b class='flag-5'>處理</b>器的<b class='flag-5'>高效</b>異常<b class='flag-5'>處理</b>解決方案

    老司機帶你深入理解ST庫的 assert_param 語句

    老司機帶你深入理解ST庫的assert_param語句
    的頭像 發(fā)表于 03-14 14:52 ?4084次閱讀

    關于選擇處理器的八個認知錯誤

     我們購買電腦,往往會關心處理器的性能好壞,處理器的性能好壞直接影響了電腦的運算速度,我們可以將處理器比喻成大腦,是計算機的核心,決定了電腦速度好壞。那么如何選購處理器呢?今天小編分享
    發(fā)表于 05-20 09:23 ?781次閱讀

    Python數(shù)據(jù)清洗和預處理入門完整指南

    凡事預則立,不預則廢,訓練機器學習模型也是如此。數(shù)據(jù)清洗和預處理是模型訓練之前的必要過程,否則模型可能就「廢」了。本文是一個初學者指南,將帶你領略如何在任意的數(shù)據(jù)集上,針對任意一個機器
    的頭像 發(fā)表于 12-21 13:50 ?831次閱讀

    labview處理excel數(shù)據(jù)的粗大誤差

    實際應用,我們經(jīng)常需要處理和分析來自不同來源的數(shù)據(jù)。其中,Excel表格是一個常見的數(shù)據(jù)格式,因為它易于使用和管理。然而,Excel數(shù)據(jù)
    的頭像 發(fā)表于 01-05 16:15 ?767次閱讀

    盛顯科技:拼接處理器如何實現(xiàn)高效數(shù)據(jù)拼接操作?

    眾所周知,高效數(shù)據(jù)拼接操作無疑是數(shù)據(jù)處理領域的核心優(yōu)勢,它能極大地縮短了處理時間,讓拼接處理器能夠迅速應對海量
    的頭像 發(fā)表于 10-23 10:58 ?50次閱讀
    盛顯科技:拼接<b class='flag-5'>處理</b>器如何實現(xiàn)<b class='flag-5'>高效</b><b class='flag-5'>數(shù)據(jù)</b>拼接操作?