Tensor
數據存儲
N:bach批量大小
C:channel特征圖通道數
H:特征圖的高
W:特征圖的寬
深度學習框架中卷積神經網絡特征圖用4D張量表示,但體現在硬件中是1D。
NCHW代表【WHCN】,NHWC代表【CWHN】
對於NCHW,存儲時是【WHCN】,從001開始沿着W方向知道003,再沿H方向挨個存004、005、006,直到019,存完第一張沿C方向按同樣方式存第二張,最后沿N方向重復上述操作。
對NHWC,存儲時按【CWHN】,從000沿C方向存020,040等,之后沿W方向存001、021等,再沿H方向,最后沿N。
RGB圖像
浮點乘法器
浮點數概念與運算規則
浮點數表示
l FP32為單精度浮點數,32bit,1bit符號位,8bit表示指數部分,23bit表示尾數部分。
l TF32為英偉達提出的代替FP32的單精度浮點數,8位指數和10位尾數。
l FP16為半精度浮點數,5bit表示指數,10bit表示小數,
l BF16是對FP32的截斷數據,8bit表示指數,7bit表示小數。
l FP32和BF16整數表示范圍一致,小數部分不同,存在誤差。
l FP32和FP16數據范圍不一致,FP16在大數據計算中可能溢出。
l 通常表示為N=MxR^E;其中M為尾數,R為基數,E為階碼,R一般取2。
以十進制12.5為例,符號位為0,轉化為二進制是1100.1,進一步寫成1.1001*2^3。
在將實際指數轉化為階碼時,要加上偏移值127,實際階碼E=實際指數+127。因為8bit既要表示正指數也要表示負指數,另外將0和255單拎出來。
若E=11111111且M=0,可根據S不同表示+∞和-∞。
若E=00000000且M=0,可根據S不同表示+0和-0.
若E=00000000且M≠0,表示為NAN,不是一個數值。
e浮點數運算
乘除
兩個浮點數相乘,乘積的階碼為相乘兩數的階碼之和,乘積的尾數為相乘兩數的尾數之積。
乘除法相比於加減法簡單,不需要對階,只需要考慮規格化和攝入問題。
乘法步驟
l 檢測兩個尾數是否一個為0,若為0則乘積必為0.
l 階碼相加減
l 尾數相乘
l 結果規格化和舍入處理
參考鏈接:
l https://zhuanlan.zhihu.com/p/92851098
l https://zhuanlan.zhihu.com/p/355615128
l https://www.cnblogs.com/qy-blogs/p/9201227.html
浮點數乘法器設計
設計要求
i. 輸入格式可配,支持int8、fp16、bf16,輸出格式根據輸入格式確定:int8->int16,fp16/bf16-> tf32;
ii. 輸入數據位寬為16bit,即可以輸入兩個int8數據或者一個fp16/bf16;
iii. 輸出數據位寬為32bit,tf32不足32bit高位補0;
iv. 浮點運算支持“最近偶數”舍入,不支持非規約數;
v. 搭建testbench環境,完成驗證,結果與dw lib庫比對;
設計點
- 按照輸入數據類型,提取符號位、階碼、尾數
- 符號位處理,直接異或
- 尾數相乘,16*16乘法器。假設A為1.M,B為1.N,則A*B為1+0.M+0.N+0.M*0.N。
- 階碼處理,分別減去127得到真實階碼,相加得到結果階碼再加127。此處考慮溢出處理。
- 規范化,左規右規。舍入處理,最近偶數。
待定:
1、 確認輸入數據屬於同一類型
2、 輸入數據表示方法是補碼還是移碼