ESP32-S3におけるSIMDアクセラレーションによるコンピュータビジョン:2ドルのマイクロコントローラで高スループットを実現

ESP32-S3におけるSIMDアクセラレーションによるコンピュータビジョン

ESP32-S3マイクロコントローラ向けに、SIMDアクセラレーションを適用したFAST特徴検出器が実装され、128ビットのSIMD命令を活用して約220%のスループット向上を達成しました。この最適化により、低コストのマイクロコントローラが30フレーム毎秒(fps)のVGAストリームを処理できるようになり、手頃な価格のエッジハードウェアでのリアルタイムコンピュータビジョンの実現可能性が示されました。

パフォーマンスとハードウェアの背景

ESP32-S3は、その価格帯において強力なマイクロコントローラであり、最大240MHzで動作するデュアルコアCPUに加え、統合されたWiFiおよびBluetooth Low Energy無線を備えています。FAST特徴検出器の実装では、チップの限られた利用可能なSIMD命令を活用して、処理速度を大幅に向上させました。

テストでは、SIMDアクセラレーションを適用した実装は、QVGA(320x240)フレームを約6ミリ秒で処理しました。全体のスループットは5.1メガピクセル/秒(MP/s)から11.2 MP/sに向上し、組み込みシステムにとって大幅な性能向上を表しています。

技術的な課題と解決策

SIMDアクセラレーションを適用したFAST検出器の開発には、ESP32-S3のアセンブリ言語を直接扱い、Xtensa LX ISAの特定のハードウェア制限を回避する必要がありました。

アライメントされていないメモリアクセスの処理

SIMDアーキテクチャは、直接のアライメントされていない読み取りをサポートしていません。中心ピクセルの周囲のカーディナル方向(東と西)でピクセルデータをサンプリングする際、必要なメモリブロックがアライメントされていませんでした。これは、2つの連結されたレジスタのスライスを単一のレジスタに抽出できる特定のチップ命令を利用することで解決され、必要なピクセルデータの抽出が可能になりました。

符号付きと符号なしの算術の克服

ESP32-S3のSIMD命令は、符号付き8ビット数の比較のみを実装していますが、ピクセルデータは符号なし8ビット数として格納されています。符号なしデータを符号付きデータとして直接再解釈すると、特に128から255の範囲で非線形なマッピングの問題が発生し、標準的な比較演算が壊れます。

これを解決するために、ピクセル値を符号なし範囲[0, 255]から符号付き範囲[-128, 127]にシフトする必要がありました。SIMD算術演算は飽和型であるため、標準的な減算は不可能でした。つまり、127を超える値はアンダーフローせずに-128でクランプされます。

これは、2の補数演算の特性を利用することで克服されました。$x - 128$は$-128$を加算することと等価であり、$-128$は最上位ビット(0b10000000)で表されるため、$x - 128$の演算は、符号なしバイト$x$とマスク$0\text{x}80$($x \text{ XOR } 0\text{x}80$)をXORすることで達成できます。この手法により、プロセッサは符号なしデータを比較および算術演算に適した正しい線形範囲にあるかのように扱うことができます。

実装の詳細

実装には、低レベルの操作を管理するためのbasmという名前の基本的なレジスタアロケータを含む、カスタムアセンブリコードの作成が含まれていました。FASTコーナーの事前テストは、ベクタレジスタの容量に一致する16ピクセル同時に極値カウントを計算する関数を設計することで最適化されました。

コミュニティの洞察とさらなる考慮事項

このプロジェクトに関する技術的な議論では、ESP32-S3のSIMD機能と代替ハードウェアに関するいくつかのポイントが強調されました:

  • SIMDの難しさ: 複数の貢献者が、ESP32-S3のSIMD命令は複雑で効果的に使用するのが難しいと指摘しました。
  • パフォーマンス指標: あるコメントでは、報告された5.1 MP/sから11.2 MP/sへの増加は、パーセンテージ増加が開始値に対して計算されるため、220%の増加ではなく120%の増加であると明確にしました。
  • 代替アーキテクチャ: より強力なSIMDを求めるユーザー向けに、CH32V407/CH32V467が代替として言及され、ESP32-S3の実装と比較してより広いSIMD ISA(64ビット幅)を提供するRISC-Vベクタ拡張の組み込みサブセットをサポートしています。

Sources