CoreMarkでRaspberry Pi Picoのベンチマークを取る

前回、書いたばかりですがDhrystoneはいささか古くて時代遅れらしいので(中身が解析されきっていてDhrystoneに最適化されやすい(しているかはともかく)、CPUのベンチマークというよりコンパイラーのベンチマークになってしまっている、など)、CoreMarkというベンチマークを使ってみます。

CoreMark ダウンロード & プロジェクト構築

開発環境は前回と同様にWindows10とRaspberry Pi 2BをSSHで接続してWindows10上のVSCodeで開発します。

Raspberry Pi 2BとRaspberry Pi PicoとはUSBもしくはSWDで接続して実行ファイルを書き込みます。

CoreMarkのスコアのサイトで多くのCPUのベンチマークが閲覧できますが、残念ながらRP2040に関してはなかったので実装してみました。

CoreMarkのコードはGitHubからダウンロードできます。

できたcoremarkディレクトリーのcoremark/barebones/core_portme.cおよびcoremark/barebones/core_portme.hをcoremarkディレクトリー直下にコピーします。

対象環境に合わせて、「linux」「macos」などのディレクトリー下の”core_portme.c”、”core_portme.h”をそれぞれ使うと思うのですが、今回は「barebones」ディレクトリーでいいと思います(もしくは「simple」ディレクトリー)。

さらにcoremarkディレクトリーに、前回の「DhrystoneでRaspberry Pi Picoのベンチマークを取る」と同様に”CMakeLists.txt”を追加します。

前回の「DhrystoneでRaspberry Pi Picoのベンチマークを取る」と大体同じです。

そして前回と同様に”pico_sdk_import.cmake”ファイルをコピーします。

コード修正

コード修正は”core_portme.h”と”core_portme.c”のみに行います。

まず”core_portme.h”です。

”#define HAS_STDIO”と”define HAS_PRINTF”を0→1に変更します。

“COMPILER_FLAGS”を定義します(buildを通すためだけで内容に意味はないと思われます)。

headerファイルをいくつかincludeします。

“size_t”を”uint32″に変えます。

次に”core_portme.c”を何箇所か変更します。

“ITERATIONS”を指定します。今回は10,000にしました。

barebones_clock()関数の#errorをコメントアウトして定義を追加します。

get_absolute_time()はpico-sdkで提供されている関数になります。

“CLOCKS_PER_SEC”を定義します。

portable_init()関数の先頭の#errorをコメントアウトしてprintfが機能するように”stdio_init_all()”関数を追加します。

RP2040はdualコアですが、今回はシングルコアのベンチマークです。

dualコア対応にするには#define MULTITHREAD を2にして呼び出される関数をpico関数の”multicore_launch_core1(some_function_pointer);”などにすればいいかなと思いますが、私にとっては中々難しいのとそれによって得られた結果が正しいのかあまり自信がないのでシングルコアにみにしました。

build & 実行

これで準備ができたので”make”します。

前回は”BOOTSEL”ボタンを押しながらPicoに電源投入するとPicoが大容量ディスクとして認識されるのでそのディスクに書き込んでいましたが、OpenOCDをインストールしてありSWD配線がされていればコマンドにて書き込めます。

Raspberry PiRaspberry Pi Pico
GND(Pin 20)SWD GND
GPIO24(Pin 18)SWDIO
GPIO25(Pin 22)SWCLK
ラズベリーパイ – Raspberry Pi Pico SWD配線表

以下のコマンドで書き込めます。

書き込まれるとCoreMarkプログラムが走り出しますので結果をシリアルモニターで確認します。ITERATIONS=10,000ならCoreMarkプログラム実行に40秒ほどかかるので、プログラム書き込みをしたターミナルと同じターミナルでシリアルモニターを起動してもいいですし、別ターミナルで事前にシリアルモニターを起動しておいてもいいです。

結果 & 比較

結果は以下のとおりです。

coremark results
CoreMark Result

CoreMark 246.50、CoreMark/MHz = 1.85 となりました。

CoreMark.orgのScoresでは前回のDhrystoneで比べてたSTM32F411はありませんが近いところでSTM32F417を見てみます(Processor Name Matchに”STM32F”と入れて「Apply Filter」ボタンをクリック)。

コンパイラーの違いなどで複数の結果がありますが一番数字の大きいところでCoreMark 565.73、CoreMark/MHz 3.37とあります。

あとExpressif ESP32も見てみるとCoreMark 660.70、CoreMark / MHz 4.13とあります。

picoも2個のコアをフルに使えれば約2倍の処理能力になると思われるので大雑把にいってしまえば3つとも大体同じくらいの能力といえるかと思います。

以下に比較表にまとめました。

  Raspberry Pi Pico STM32F417 Espressif ESP32
製造・販売元 Raspberry Pi STマイクロ Espressif
CoreMark 246.50(私による計測) 565.73(CoreMark.org Scoresより) 660.70(CoreMark.org Scoresより)
CoreMark / MHz 1.85 3.37 4.13
コア・アーキテクチャ ARM Cortex-M0+ ARM Cortex-M4 + FPU Xtensa LX6
コア数 1 1 2
クロック周波数 133MHz

168MHz

160MHz
マイコンボード価格 @550

STM32F407G-DISCO @2,356(Digikey)

Core的にはF417と同等

ESP32-WROVER-B @704(スイッチサイエンス)
マイコン単価

RP2040 @118(Digikey) + 

W25Q16JVU(Flash 2MB) @58(Digikey)

STM32F417VE @1,520(DigiKey) モジュール(マイコンボード)でないと技適が通らないので、実質入手不可
比較検討

高CP

ツール、開発ボード類が充実。使いやすい。

性能は落ちるがSTM32F0x系を用いれ低価格品あり

Bluetooth、Wifiペリフェラル付き

(アンテナ付き:技適あり)

価格は2021年7月15日現在。

pico(RP2040)は高CP、ESP32は通信ペリフェラル付き、というところに優位性があります。

STマイクロ社製はPico、ESP32と比べると見劣りしているようですが、一般的には十二分な能力を持っているので簡単に使うには向いていると思います。

終わり

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です