首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

VDSP (BF561) 浮點運算系列(6):float 加減運算與 Pipeline 影響

     編輯:關於C++

VDSP float 加減法對應 __float32_add/__float32_sub(libdsp/fpadd.asm),減法即翻轉減數符號後跳入加法。

快速路徑

  • y == 0:直接回傳 x(25 cycles)
  • x == 0:直接回傳 y(26 cycles)

特殊值處理

  • x == Inf 且 y 合法 → 回傳 x(50 cycles)
  • y == Inf 且同號 → 回傳 x(50 cycles)
  • Inf + -Inf 或含 NaN → 回傳 NaN
  • x 合法,y 為 NaN/Inf → 直接回傳 y(40 cycles)

指數差 > 24 時

尾數 23 位 + 隱含位,指數差 > 24 時較小數無法影響結果,直接回傳較大數(136 cycles)。

Pipeline 導致的效能反常

代碼會比較指數,若 y > x 則交換運算元:

CC = R3 <= R2 (IU)
IF CC JUMP .no_swap
// 交換邏輯
.no_swap:

實測:

  • add(10000, 10)(無交換)→ 136 cycles
  • add(10, 10000)(需交換)→ 132 cycles **更快**

原因:JUMP 不被取時 pipeline 需清空(10 cycles),被取時僅 6 cycles。編譯器將「不交換」作為預測路徑,導致常見情況(大數在前)反而較慢。類似 Linux kernel likely/unlikely 優化思想。

溢出

FLT_MAX + FLT_MAX → Inf。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved