ESP32の演算速度メモ

現在、音声認識の基礎や色々な手法の勉強をしつつ、PC上でシミュレータを作成し、独自アルゴリズムを検討しています。

その結果、「うえ、した、ひだり、みぎ」のような簡単な単語であれば、認識できそうな感じになってきました。

ただし、私の声の特徴量でしか見ていないのですが…。

事前に声の特徴量を取得する「音声登録モード」みたいなものを作れば、他の人の声でもいけるかもしれませんね。

んまぁでも、私の声でドロイド君が反応してくれたら、それだけで結構感動しちゃう気もします。
(満足げ)

さて、今回の音声認識で重要なポイントは「なるべく軽いアルゴリズム」であること、です。

リソースの限られたESP32で、リアルタイムに音声認識を行いたいので、なるべく単純になるよう設計しています。

これと並行して、そもそものESP32のCPUの演算能力を測ってみたので、以下にメモしておきます。

ESP32演算速度

100万回ループ比較(Iはint, Fはfloat演算, Dはdouble演算)
演算内容 使用math関数 時間(us) 比率
AddI  - 33,566 x1
MultI  - 37,761 x1.1
DivI  - 41,949 x1.2
AddF  - 37,754 x1.1
MultF  - 37,768 x1.1
DivF  - 188,783 x5.6
AddD  - 400,038 x11.9
MultD  - 370,195 x11.0
DivD  - 349,317 x10.38
LogF logf 178,5741 x53.2
SqrtF sqrtf 553,873 x16.5
SinF sinf 887,768 x26.4
CosF cosf 888,830 x26.4
SinCosF sincosf 1,822,992 x54.3
AtanF atan2f 2,223,685 x66.1
SinD sin 9,062,509 x269.9

「比率」は、AddIの計算時間を1としたとき、他の演算で相対的にどれくらいかかるか、を示しています。(ループ処理や引数演算のオーバーヘッドも含まれているので、目安程度)

intの加算とfloatの乗算の演算速度がほぼ同じなので、ESP32のCPUに浮動小数点用の乗算器が乗ってるってことでしょうか。

これはうれしい誤算でした。安価なマイコンだってのに、最近はすごいですね。というか、まずアルゴリズム検討前に測っときなさいよ。基本の「き」ですよ。ですよね~。

(追記: 2018/6/17)
ちゃんと、ESP32の仕様書に「浮動小数点演算用ユニットあるよ」って書いてありました。

また、こちらのサイトで、floatとdoubleの演算比較をやっているようです。興味深い。

(追記: 2019/6/22)
三角関数と平方根を追加しました。

float精度であれば、三角関数と平方根は思ってたより処理が軽いイメージです。logのほうが重いのね…。

そしてESP32の場合、sincosfで同時に算出しても、別に効率があがるわけじゃないのね。単に中でsinとcosをそれぞれ呼ぶような実装になってるのかな。

あと、double精度のsinを見ると、さすがにちと重いなあ、って感じかしら。

初心者向けの解説

まず用語の説明として、intは整数のみ(12とか)、floatは小数(12.3とか)も扱える、数字の箱のことです。

また、Addは加算(足し算)、Multは乗算(かけ算)、Divは除算(わり算)を表しています。

一般的には、同じ足し算でも、整数(int)のみの演算よりも、小数(float)のほうが難しいです。

また、人間と似ていて「加算/減算 ⇒ 乗算 ⇒ 除算」の順番に難しくなっていきます。

これらを踏まえた上で、上記の表の1行目(AddIの行)は「100万回の整数の足し算を、33,566(us)で出来たよ」ということを意味しています。

つまり「1秒間に約2979万回の足し算ができるよ」ということです。

さらに、MultF(=小数の乗算)の行を見てみると、AddIの計算時間とあまり変わらないことがわかります。

なので、このCPUには、苦手克服用として、小数乗算の専用回路が入っているのかもしれません。

まったく、小数の掛け算なんて、1秒に1回だって難しいのに!ここら辺の計算力は、人間には到底勝てない分野ですよね。

さて、次はついに実機への実装です。もうすぐドロイド君で音声認識ができるようになるかも!
ということで、また次回をお楽しみに。