年末に書いていたつもりが、もう2016年ですね。
32ビットのArduino互換機を比較してみる目的で、円周率を計算させ、実行速度を出してみた。
「C言語によるアルゴリズム辞典」 に載っていた多倍長演算による円周率の計算(Machinの公式)を使って、1000桁ほどを実行するのにかかる時間を調べる。
手元の32ビットな互換機は、
・ChipKit MAX32 (PIC32MX795F512L MIPS32 M4k )
・Arduino DUE ( SAM3X8E ARM Cortex-M3 )
・MSP432launchPad (MSP432 ARM Cortex-M4F )
・Teency LC (MKL26Z64VFT4 ARM Cortex-M0+) 2017_Feb 追加
それぞれ開発環境はArduino, MPIDE(Chipkit Core), Energia
参考枠として、8ビットのATmega328Pにも頑張ってもらった。
結果
処理時間/ (MCU名、@動作周波数)/ 処理時間x動作周波数 / ( ATmega328Pのスコアを1とした時の倍率)
732ms ( PIC32MX795F512L @15MHz ) 10980 (29.8)
364ms ( PIC32MX795F512L @30MHz ) 10920 (30.0)
136ms ( PIC32MX795F512L @80MHz ) 10880 (30.1)
139ms ( SAM3X8E @84MHz ) 11676 (28.1)
222ms ( MSP432 @48MHz ) 10656 (30.8)
2149ms ( MKL64Z @48MHz ) 103152 (3.2)
20512ms ( ATmega328P @16MHz ) 328192 (1)
周波数の差を補正したスコアでは、32ビットMCUを比較すると、大体似たような結果になった。
ATmega328Pの場合、8ビット長、かつ除算器が無いことが結果に表れた。
Cortex-M0/M0+も同様に除算器が無く、32ビットMCUとしては10倍程度の差がついた。
ちなみにRAMが64kB以上あれば、そのままのコードで2万桁も出力できた。 80MHzのPIC32MXで56秒ほど。
その他
・本当の比較という点では、CoreMarkのような組み込みマイコン向けのベンチマークが参考になる。同時期の同じクラスの製品であれば、圧倒的な差とはなりにくい。
・ 今回の処理では浮動小数点は使用されていないけれど、MSP432には単精度のFPUが内蔵されている。 Energia IDE上ではfloat型をつかえば自動的にハードウェア支援の恩恵が得られる。
・ PIC32MXやSAM3X8Eは、07~09年に登場している。 パフォーマンス重視の石なので、互換ボード系の実装ではクロックも最大値で動作し、消費電力も大きい。 今回の実験で、高性能なArduinoとして使うだけなら、クロックを15~30MHz程度まで落としてもたいていの用途には問題なさそうということが分かった。 コンスタント電流消費や素子の熱損失がかなり抑えられる。
・ PIC32MXの実行速度の変更は、改変したブートローダーで行った。 30MHz時の消費電流は40mAほど。
・最近登場したMSP432は、今トレンドのエネルギー効率を重視した設計になっている。
複雑なデータ処理を伴うアプリケーションが増える中で、リッチなCPUで処理時間を短縮し、スリープ時間を増やすことで省電力を目指す。内部のパワードメインはMSP430を引き継いだ多彩な省電力モードを備え、さらにスリープ時データ保持用に8kBの専用SRAMをもつ。
・マイコンのエネルギー効率の指標にはULPBench(http://www.eembc.org/ulpbench/index.php)というものがあり、サイトで各社のマイコンとスコアが公開されている。 スコア上位は32ビットアーキテクチャが多い。
・ AVR、MSP430/432、PIC32の純正開発環境でも、最近はArduinoAPIでコンパイルできる拡張機能の整備が進んでいるので、本格的な開発環境でデバッグしながら開発するというのもとっつきやすいかもしれない。
32ビットのArduino互換機を比較してみる目的で、円周率を計算させ、実行速度を出してみた。
「C言語によるアルゴリズム辞典」 に載っていた多倍長演算による円周率の計算(Machinの公式)を使って、1000桁ほどを実行するのにかかる時間を調べる。
手元の32ビットな互換機は、
・ChipKit MAX32 (PIC32MX795F512L MIPS32 M4k )
・Arduino DUE ( SAM3X8E ARM Cortex-M3 )
・MSP432launchPad (MSP432 ARM Cortex-M4F )
・Teency LC (MKL26Z64VFT4 ARM Cortex-M0+) 2017_Feb 追加
それぞれ開発環境はArduino, MPIDE(Chipkit Core), Energia
参考枠として、8ビットのATmega328Pにも頑張ってもらった。
結果
処理時間/ (MCU名、@動作周波数)/ 処理時間x動作周波数 / ( ATmega328Pのスコアを1とした時の倍率)
732ms ( PIC32MX795F512L @15MHz ) 10980 (29.8)
364ms ( PIC32MX795F512L @30MHz ) 10920 (30.0)
136ms ( PIC32MX795F512L @80MHz ) 10880 (30.1)
139ms ( SAM3X8E @84MHz ) 11676 (28.1)
222ms ( MSP432 @48MHz ) 10656 (30.8)
2149ms ( MKL64Z @48MHz ) 103152 (3.2)
20512ms ( ATmega328P @16MHz ) 328192 (1)
周波数の差を補正したスコアでは、32ビットMCUを比較すると、大体似たような結果になった。
ATmega328Pの場合、8ビット長、かつ除算器が無いことが結果に表れた。
Cortex-M0/M0+も同様に除算器が無く、32ビットMCUとしては10倍程度の差がついた。
ちなみにRAMが64kB以上あれば、そのままのコードで2万桁も出力できた。 80MHzのPIC32MXで56秒ほど。
その他
・本当の比較という点では、CoreMarkのような組み込みマイコン向けのベンチマークが参考になる。同時期の同じクラスの製品であれば、圧倒的な差とはなりにくい。
・ 今回の処理では浮動小数点は使用されていないけれど、MSP432には単精度のFPUが内蔵されている。 Energia IDE上ではfloat型をつかえば自動的にハードウェア支援の恩恵が得られる。
・ PIC32MXやSAM3X8Eは、07~09年に登場している。 パフォーマンス重視の石なので、互換ボード系の実装ではクロックも最大値で動作し、消費電力も大きい。 今回の実験で、高性能なArduinoとして使うだけなら、クロックを15~30MHz程度まで落としてもたいていの用途には問題なさそうということが分かった。 コンスタント電流消費や素子の熱損失がかなり抑えられる。
・ PIC32MXの実行速度の変更は、改変したブートローダーで行った。 30MHz時の消費電流は40mAほど。
・最近登場したMSP432は、今トレンドのエネルギー効率を重視した設計になっている。
複雑なデータ処理を伴うアプリケーションが増える中で、リッチなCPUで処理時間を短縮し、スリープ時間を増やすことで省電力を目指す。内部のパワードメインはMSP430を引き継いだ多彩な省電力モードを備え、さらにスリープ時データ保持用に8kBの専用SRAMをもつ。
・マイコンのエネルギー効率の指標にはULPBench(http://www.eembc.org/ulpbench/index.php)というものがあり、サイトで各社のマイコンとスコアが公開されている。 スコア上位は32ビットアーキテクチャが多い。
・ AVR、MSP430/432、PIC32の純正開発環境でも、最近はArduinoAPIでコンパイルできる拡張機能の整備が進んでいるので、本格的な開発環境でデバッグしながら開発するというのもとっつきやすいかもしれない。