PSOCの浮動小数点演算能力

PSOC浮動小数点演算能力を確認していなかったのでネットで調査。
見つけたサイトはここ。
http://dad8893.blogspot.com/2017/06/arduino-nucleo-psoc.html
以下、上記サイトの抜粋。
(その他のArm-Mシリーズの話はここを参照。 https://www.aps-web.jp/academy/cm/

単精度浮動小数点超越関数の計算時間は、
ハードウェアFPUを持つARM-M4の圧勝。
PSoC5LP@80MHz(ARM-M3)だとSoftVFPでざっと、30us、
PSoC4@48MHz (ARM-M0)だと、100us 見ておけば良さそう。

倍精度に関しては、同じ人の書いたここ
http://dad8893.blogspot.com/2016/02/nucleo-f401recortex-m4psoc-5lpcortex-m3.html
によると、M4もSoftVFPになるようで、M3の方が若干速いそうだ。

Arduino, Nucleo, PSoCの単精度浮動小数点数演算の速度比較
比較対象 MPU Core Clock FPU
Arduino Uno R3 ATMega328P ATMega(8bit) 16MHz 無
PSoC 4 Pioneer Kit PSoC 4 Cortex-M0 48MHz 無
PSoC 5LP Protyotyping Kit PSoC 5 LP Cortex-M3 80MHz 無
Nucleo F401RE STM32F401 Cortex-M4 84MHz 有
Nucldo F446RE STM32F446 Cortex-M4 180MHz 有

float型(単精度浮動小数点数型)で算術関数を呼び出して100回ループを回してバッファを埋める。
細かいところは違うが、PSoCPSoC Creatorで、Nucleoはmbedで同じ処理をするコードを書いて測定。


No Device No2 Op time(us) clock(MHz) period(us) clocks:op
1 F446RE 1 div 0.117 180 0.005555556 21.06
1 F446RE 2 sinf 0.4939 180 0.005555556 88.902
1 F446RE 3 cosf 0.4665 180 0.005555556 83.97
1 F446RE 4 expf 0.6758 180 0.005555556 121.644
1 F446RE 5 logf 0.614 180 0.005555556 110.52
1 F446RE 6 sqrtf 0.2392 180 0.005555556 43.056
2 F401RE 1 div 0.2505 84 0.011904762 21.042
2 F401RE 2 sinf 1.0109 84 0.011904762 84.9156
2 F401RE 3 cosf 0.964 84 0.011904762 80.976
2 F401RE 4 expf 1.4127 84 0.011904762 118.6668
2 F401RE 5 logf 1.3038 84 0.011904762 109.5192
2 F401RE 6 sqrtf 0.5127 84 0.011904762 43.0668
3 PSoC5LP 1 div 2.35 80 0.0125 188
3 PSoC5LP 2 sinf 17.25 80 0.0125 1380
3 PSoC5LP 3 cosf 20.69 80 0.0125 1655.2
3 PSoC5LP 4 expf 27.05 80 0.0125 2164
3 PSoC5LP 5 logf 29.78 80 0.0125 2382.4
3 PSoC5LP 6 sqrtf 9.07 80 0.0125 725.6
4 PSoC4 1 div 13.19 48 0.020833333 633.12
4 PSoC4 2 sinf 69.17 48 0.020833333 3320.16
4 PSoC4 3 cosf 80 48 0.020833333 3840
4 PSoC4 4 expf 86.38 48 0.020833333 4146.24
4 PSoC4 5 logf 106.25 48 0.020833333 5100
4 PSoC4 6 sqrtf 24.35 48 0.020833333 1168.8
5 Arduino 1 div 34 16 0.0625 544
5 Arduino 2 sinf 139.24 16 0.0625 2227.84
5 Arduino 3 cosf 146.52 16 0.0625 2344.32
5 Arduino 4 expf 196.2 16 0.0625 3139.2
5 Arduino 5 logf 182.4 16 0.0625 2918.4
5 Arduino 6 sqrtf 64.08 16 0.0625 1025.28

「time(us)」は1処理あたりの実行時間。「clock:op」は1処理あたりのクロック数(推定値)。

FPU付きのNucleo F446RE、F401REが圧倒的に高速。
Cortex-M3PSoC 5 LPもまあまあ頑張っている。