那曲檬骨新材料有限公司

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

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

3天內不再提示

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

算能開發者社區 ? 2024-01-19 08:33 ? 次閱讀

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

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

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

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

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函數的一個參考實現如下:

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中四維數據的排布

在LMEM中,一個四維數據(n,c,h,w)的Channel維度會被分散到不同的lane上。以一個shape為(2,5,2,3)的數據為例,假設NPU數量為4,每個NPU中EU數量為4,并且數據在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)#數據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上數據的實際shape,對應的stride也滿足處理器中的定義。可以參考TPUKernel用戶開發手冊中的描述。npu_id維度是一個隱含維度,其值為npu數量,此處為4。

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

卷積權重的排列

為了確保EU能夠高效地使用,BM1684X處理器中卷積的權重需要按照EU對齊的方式優先存儲IC維度的數據,然后將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對齊方式存儲,而偏置則采用緊湊模式。由于偏置數據量較小,直接拷貝效率不高。因為兩種模式下數據的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中的數據,以適應SOPHON BM1684X處理器的計算需求,從而提高整體的執行效率和性能。

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

    關注

    68

    文章

    19407

    瀏覽量

    231183
  • 存儲器
    +關注

    關注

    38

    文章

    7528

    瀏覽量

    164343
  • 編譯
    +關注

    關注

    0

    文章

    661

    瀏覽量

    33040
收藏 人收藏

    評論

    相關推薦

    康謀分享 | 如何應對ADAS/AD海量數據處理挑戰?

    如何有效處理ADAS/AD海量數據并從中獲得見解?IVEX數據處理流程可自動從原始傳感器數據等輸入識別出值得關注的事件和場景,推動
    的頭像 發表于 12-25 10:05 ?3577次閱讀
    康謀分享 | 如何應對ADAS/AD海量<b class='flag-5'>數據處理</b>挑戰?

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

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

    輕松學會單片機

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

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

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

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

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

    如何處理好FPGA設計跨時鐘域間的數據

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

    教你怎樣學會PID調參

    不會PID調參?這篇文章圖文結合帶你學會PID調參!讓你成為PID調參大神!!!
    發表于 01-06 07:47

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

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

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

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

    無法讓SWO數據在MCUXpresso上高效工作怎么處理

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

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

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

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

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

    Python數據清洗和預處理入門完整指南

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

    labview處理excel數據的粗大誤差

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

    盛顯科技:拼接處理器如何實現高效數據拼接操作?

    眾所周知,高效數據拼接操作無疑是數據處理領域的核心優勢,它能極大地縮短了處理時間,讓拼接處理器能夠迅速應對海量
    的頭像 發表于 10-23 10:58 ?290次閱讀
    盛顯科技:拼接<b class='flag-5'>處理</b>器如何實現<b class='flag-5'>高效</b><b class='flag-5'>數據</b>拼接操作?
    缅甸百家乐网络赌博解谜| 大田县| 好运来百家乐现金网| 肃宁县| 百家乐技巧心| 真人百家乐官网对决| 优博网址| 百家乐翻天粤语qvod| 网上百家乐官网是叫九五至尊么| 蓝宝石百家乐娱乐城| 百家乐官网追号| 百家乐官网庄的概率| 二八杠网| 赌博百家乐赢不了| 澳门百家乐官网娱乐城送体验金| 粤港澳百家乐赌场娱乐网规则| 百家乐官网博彩开户博彩通| 大发888娱乐85战神版| 顶尖百家乐对单| 真人百家乐官网园| 皇冠现金网安全吗| 24山龙合向向合水秘诀| 大亨百家乐官网娱乐城| 大发888手机版下载安| 百家乐玩法开户彩公司| 网上百家乐官网真实度| 免费百家乐统计软件| 百家乐如何计算| 百家乐官网视频游戏界面| 大发888娱乐城df888| 最好的百家乐博彩网站| 豪享博百家乐官网的玩法技巧和规则 | 网上百家乐娱乐平台| 香港百家乐官网的玩法技巧和规则| 香港六合彩开码| 中骏百家乐的玩法技巧和规则| 网络百家乐官网程序| 百家乐官网销售视频| 永利高现金网可信吗| 百家乐怎么骗人| 24山向与周天360度关系示意图|