ESP32でCoreMarkを動かす

ESP32がどれくらいの性能なのかをある程度客観的に押さえておくために、ESP32でCoreMarkベンチマークを動かしてみます。
Espressifのフォーラムの情報をかなり参考にしましたが、私の手元の環境ではそのままでは動かなかったため、一部手順を変えています。

前提・注意事項

  • ESP-IDFがインストールしてあること。
  • ESP32の片コアのみで実行するものとする
  • 実験環境: macOS Mojava
  • 対象ボード: HUZZAH32 (たまたま手元にあったものを使用。ESP32-DevKitCでも手順は変わらない)

Step1: ESP-IDF一式をワークディレクトリにコピーする。

$ mkdir workspace
$ cd workspace    # 適当なディレクトリを作り、そこに移動する。
$ cp -r $IDF_PATH/examples/get-started/hello_world CoreMark
$ cd CoreMark

Step2: CoreMarkのソースコードをクローンする。

$ git clone https://github.com/eembc/coremark.git

Step3: CoreMarkの中から必要なファイルのみ取り出し、不要なファイルを削除する。

$ cd coremark
$ cp core_list_join.c core_main.c coremark.h core_matrix.c core_state.c core_util.c simple/core_portme.c simple/core_portme.h ../main/
$ cd ..
$ rm -rf coremark main/hello_world_main.c

Step4: ESP32用にファイルを書き換える。

  • main/core_portme.cの38行目
    volatile ee_s32 seed4_volatile=ITERATIONS;

    volatile ee_s32 seed4_volatile=10000;
  • main/core_portme.hの77行目
    #define COMPILER_FLAGS FLAGS_STR /* "Please put compiler flags here (e.g. -o3)" */

    #define COMPILER_FLAGS "-Os" /* "Please put compiler flags here (e.g. -o3)" */
  • main/core_portme.hの159行目
    #define MAIN_HAS_NOARGC 0

    #define MAIN_HAS_NOARGC 1
  • main/core_main.cの89行目
    MAIN_RETURN_TYPE main(void) {

    MAIN_RETURN_TYPE app_main(void) {

Step5: ビルドパラメータを設定する。

$ make menuconfig

メニューから以下のパラメータを設定する。

  • Compiler options > Optimization Level
    最適化オプションを最大レベルにする。
( ) Debug (-Og)
(X) Release (-Os)
  • Component config > Common ESP-related
    ベンチマーク実行中にウォッチドッグタイマーが動作しないようにする。
[ ] Interrupt watch dog
[ ] Initialize Task Watchdog Timer on startup
  • Component config > ESP32-specific
    最大クロックで動作するようにする。
( ) 80MHz
( ) 160MHz
(X) 240MHz
  • Serial flasher config > Default serial port
    ESP32に書き込むためのシリアルポートを指定する(実行環境に応じて変えること)
/dev/tty.SLAB_USBtoUART

Step6: ビルドする。

$ make -j4

Step7: 正常にビルドできたらESP32に書き込んで実行する。

$ make flash monitor
(中略)
2K performance run parameters for coremark.
CoreMark Size    : 666
Total ticks      : 28200
Total time (secs): 28.200000
Iterations/Sec   : 354.609929
Iterations       : 10000
Compiler version : GCC5.2.0
Compiler flags   : -Os
Memory location  : STACK
seedcrc          : 0xe9f5
[0]crclist       : 0xe714
[0]crcmatrix     : 0x1fd7
[0]crcstate      : 0x8e3a
[0]crcfinal      : 0x988c
Correct operation validated. See README.md for run and reporting rules.
CoreMark 1.0 : 354.609929 / GCC5.2.0 -Os / STACK

この最後の行の354.609929がCoreMark値となる。

投稿者: けむしろう

プログラミング、サーバ構築、電子工作、旅行が好きです。

コメントを残す

メールアドレスが公開されることはありません。