開發者為ESP32-S3微控制器編寫了一個利用其128位元SIMD指令集的加速版FAST特徵檢測器。該實現在測試中達到了約參考實作兩倍的效能,處理一幀QVGA(320x240)解析度的影像大約需要6毫秒。ESP32-S3雖然價格低廉,但內建雙核心CPU,最高運行頻率可達240MHz,並具備WiFi和藍牙低功耗等週邊功能。開發者在查閱技術參考手冊時發現該晶片支援一組有限的SIMD指令。
為了編寫這個SIMD加速的FAST角點檢測器,開發者學習了ESP32-S3上的組合語言基礎,並解決了其特殊的限制,甚至自行編寫了一個基本的暫存器分配器basm。由於網路上的相關範例極少(僅有Larry Bank的部落格、Espressif的esp-dsp庫和esp-dl庫),開發者決定自行實驗並撰寫更進階的程式碼。
在實作過程中,開發者遇到了幾個硬體限制: 1. **非對齊讀取問題**:指令集架構(ISA)不允許直接進行非對齊記憶體讀取。由於FAST演算法需要從中心像素向四個基本方向採樣,東西方向的區塊相對於中心區塊是非對齊的。開發者利用晶片提供的特定指令,透過提取兩個相鄰暫存器串接後的切片來解決此問題。 2. **比較運算限制**:ESP32-S3僅支援有符號8位元數字的比較運算,而像素資料通常為無符號8位元。若直接將無符號資料重新解釋為有符號資料,範圍[128, 255]會非線性映射到[-128, -1],導致比較操作失敗。 3. **飽和運算問題**:為了將無符號數值轉換為適合比較的範圍,需要將數值減去128。然而,ESP32-S3的所有SIMD算術運算都是飽和的(saturating),這意味著高於127的值會被鉗制在-128而不是正確下溢。
為了克服這些問題,開發者發現了一個技巧:計算 x - 128 等同於將最高位元翻轉。由於與1進行XOR運算等同於按位取反,因此可以通過將數值與位元遮罩0x80(即0b10000000)進行XOR運算來選擇性地翻轉最高位元。公式為:x - 128 == x ^ 0x80。透過在載入無符號8位元值時執行此XOR操作,開發者成功將數值轉換為線性範圍,使得算術和比較運算能夠正確進行。
最終,開發者成功編寫了SIMD加速的FAST角點預測試(pre-test),並使用類似技術撰寫了評分函數。測試結果顯示,FAST特徵檢測器的吞吐量提升了約220%(從5.1MP/s提升至11.2MP/s)。這一效能足以滿足即時電腦視覺任務的需求,使ESP32-S3能夠輕鬆處理30fps的VGA串流影像。
尚待確認:原文聲稱吞吐量提升約220%,但社群指出從5.1MP/s到11.2MP/s實際為120%的增長(2.2倍速),此處存在計算定義上的歧義或錯誤。
尚待確認:開發者提到的basm暫存器分配器僅簡略提及,未提供詳細技術細節或開源連結供驗證其具體實作方式。
事件背景
ESP32-S3是一款價格低於平均咖啡成本的強大微控制器,內建雙核心CPU(最高240MHz)及WiFi和藍牙低功耗無線電模組。其技術參考手冊顯示該晶片支援一組有限的SIMD指令。目前網路上關於ESP32-S3 SIMD指令的公開資源極少,主要僅有Larry Bank的部落格文章、Espressif提供的esp-dsp庫(用於DSP功能如卷積、FFT等)以及esp-dl庫(用於片上AI加速)。開發者基於對電腦視覺的興趣,選擇實作SIMD加速版的FAST特徵檢測器作為實驗項目。
社群觀察
社群討論主要集中在硬體價格與效能數據的準確性: 1. **價格與易用性**:使用者jwr指出,在AliExpress上可以以5.33美元購買完整的ESP32-S3-Zero開發板(包含晶片、陶瓷天線、USB連接器和LED),而ESP32-C3-Zero的價格為2.80美元。他認為這些價格對於所提供的功能來說極具競爭力,且開發板透過USB連接電腦即可使用,易用性極高。 2. **效能比較**:使用者pjmlp強調ESP32-S3確實強大,並指出其性能超過了如Amstrad PC1512這類舊式電腦。 3. **數據糾正**:使用者peesem指出原文中的百分比計算錯誤。從5.1MP/s提升到11.2MP/s並非增加220%,而是增加了120%(即速度為原本的2.2倍)。他解釋百分比增長應從0%起算,100%增長代表兩倍速,200%增長代表三倍速。 4. **開發難度**:使用者paaloeye評論ESP32-S3的SIMD指令集使用起來非常困難,並分享了Mitchell Hashimoto關於「每個人都應該了解SIMD」的文章連結。




