STM32H7x 最佳化的數學運算,採用 CMSIS-DSP 函數庫
STM32H750 的晶片核心是 ARM Cortex-M7,它是以 Armv7-M 架構所設計而成。內建浮點運算單元 (FPU - Floating Point Unit),以及數位訊號處理(DSP)模組,不過需要搭配適合的函數庫才能編譯成適合機器執行的指令碼。ARM 提供一套開源的 CMSIS-DSP 函數庫,支援 Cortext-M 系列的數學運算,能提升運算的速度。在 Keil IDE 開發環境下,STM32H750 的項目中打開下圖的選單,將CMSIS Core 和 DSP 模組載入,完成第一步驟。
接下來,我們要了解 CMSIS-DSP 有支援三種 ARM 的核心架構,這將影響程式碼的定義。ARM_MATH_NEON 是第一種定義,代表 Neon 的核心,ARM Neon 技術是一種先進單指令多資料 (SIMD) 架構延伸,應用於 Arm Cortex-A 系列及 Cortex-R 系列處理器。ARM_MATH_HELIUM 是第二種定義,代表 Helium 的核心,ARM Helium 技術是 Arm Cortex-M 處理器系列的 M 系列向量擴充方案 (MVE)。Helium 為 Armv8.1-M 架構的延伸,可協助機器學習 (ML) 與數位訊號處理 (DSP) 應用大幅提升效能。STM32H750 並不屬於前面兩種的定義,就不用將它們放進編譯的過程裡。不過,我們要將這三個定義放進編譯,分別是ARM_MATH_DSP︑ARM_MATH_MATRIX_CHECK︑ARM_MATH_ROUNDING才行。因為 STM32H750 晶片支援浮點運算,所以下圖的選單要開啟,如果不開啟的話,數學運算將會花費數倍的時間,甚至更多。
最後我們測試三角函數的運算,Cos(x)*Cos(x) + Sin(x)*Sin(x),運算一百萬次後,比較有無採用 DSP 的兩者效能。 下圖的程式碼,上半段是採用一般數學函數的運算,沒有 DSP 優化。下半段是採用 DSP 優化的函數,然後比較兩者的效能差異。
底下分別是開啟浮點運算,以及沒有浮點運算的效能比較的結果。下圖第一張,採用浮點運算單元,測試三角函數計算百萬次所花費的時間,沒有調用 CMSIS-DSP 函數需要耗時 399 ms,調用 CMSIS-DSP 函數耗時優化到 286 ms。下圖第二張,如果沒有採用浮點運算單元,同樣的三角函數計算,花費的時間明顯增加到 7346 ms,即使調用 DSP 函數也僅能優化到 4066 ms。
CMSIS-DSP 除了提供基本數學運算函數之外,還有濾波器的運算函數,矩陣的相關運算,統計運算,SVM 的運算...等。它是開源的代碼,連結如下 https://github.com/ARM-software/CMSIS-DSP,有興趣深入研究的開發人員可以仔細研讀。
留言