DhrystoneでRaspberry Pi Picoのベンチマークを取る
過去数回の投稿記事でいよいよ準備が整ったので本題のRaspberry Pi PicoのベンチマークをDhrystoneでとってみました。
まずはプロジェクトの雛形を作っていきます。前の投稿と同じように「Getting started with Raspberry Pi Pico」”Chapter 8. Creating your own Project”をベースに新規プロジェクトを作っていきます。
Dhrystoneプロジェクト 準備
まずプロジェクト用のディレクトリを作ります。
私は./pico_exam/dhrystoneとしました。
1 2 3 |
$ mkdir pico_exam $ mkdir pico_exam/dhrystone $ cd pico_exam/dhrystone |
そのディレクトリーに前にSTマイクロマイコンでのDhrystoneベンチマークをとるときに使ったdhry_1.c、dhry_2.c、dhry.hをコピーします。
1 |
C:\Users\neocode\downloads> scp dhry_1.c dhry_2.c dhry.h 192.168.1.123:~/pico_exam/dhrystone |
同じディレクトリーに”CMakeLists.txt”を作成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
cmake_minimum_required(VERSION 3.13) include(pico_sdk_import.cmake) project(dhrystone_project C CXX ASM) set(CMAKE_C_STANDARD 11) set(CMAKE_CXX_STANDARD 17) pico_sdk_init() add_executable(dhrystone dhry_1.c dhry_2.c ) pico_enable_stdio_usb(dhrystone 0) pico_enable_stdio_uart(dhrystone 1) pico_add_extra_outputs(dhrystone) target_link_libraries(dhrystone pico_stdlib) |
“pico_sdk_import.cmake”を”pico-sdk”からコピーします。
1 |
$ cp ~/pico/pico-sdk/external/pico_sdk_import.cmake . |
コード変更
時間測定関係などが動かないので、そこを修正していきます。
修正するのは”dhry_1.c”だけです。
まず先頭にPico関連ライブラリーをインクルードします。
20 21 22 |
#include <stdlib.h> #include "pico/stdlib.h" #include "pico/time.h" |
関数定義が重複するので”malloc”のところをコメントアウトします。
35 |
// extern char *malloc (); |
“Too_Small_Time”、”Begin_Time”、”End_Time”、”User_Time”をそれぞれ先頭文字を小文字にしてPico向け変数で定義しました。
68 69 70 |
#define too_Small_Time 2e6 absolute_time_t begin_Time, end_Time; int64_t user_Time; |
“main()”関数の先頭に”stdio_init_all();”を挿入します。これを入れるとprintfが動くようになります。
98 99 |
/* Initializations */ stdio_init_all(); |
scanfも動きそうですが、うまく動かなかったので早々と諦めて繰り返し回数を決め打ちにしています。繰り返し回数はNucleoのときと同様に1,000,000回です。
136 137 |
// Number_Of_Runs = n; Number_Of_Runs = 1e6; |
時間測定コード Picoに対応
Raspberrypi.orgサイトにある「Raspberry Pi Pico C/C++ SDK」を参考に、時間測定コードを直していきます。
begin_Time、end_Time、user_Timeところを追記して時間測定できるようにしています。
154 155 156 157 |
#ifdef MSC_CLOCK // Begin_Time = clock(); begin_Time = get_absolute_time(); #endif |
216 217 218 219 |
#ifdef MSC_CLOCK // End_Time = clock(); end_Time = get_absolute_time(); #endif |
274 275 276 277 278 279 |
// User_Time = End_Time - Begin_Time; user_Time = absolute_time_diff_us(begin_Time, end_Time); // if (User_Time < Too_Small_Time) if(user_Time < too_Small_Time) { |
最後にMicroseconds、Dhrystones_Per_Secondを計算していますが元のUser_Timeが秒単位でuser_Timeがμ秒単位なので1,000,000で割っています。
290 291 292 293 294 295 296 297 |
#else // Microseconds = (float) User_Time * Mic_secs_Per_Second // / ((float) HZ * ((float) Number_Of_Runs)); // Dhrystones_Per_Second = ((float) HZ * (float) Number_Of_Runs) // / (float) User_Time; Microseconds = (float) user_Time / (float) Number_Of_Runs; Dhrystones_Per_Second = (float) Number_Of_Runs / ((float) user_Time / (float) 1e6); #endif |
build & flash
buildを行います。
1 2 3 4 5 |
$ mkdir build $ cd build $ export PICO_SDK_PATH=../../pico-sdk $ cmake .. $ make |
「BOOTSEL」ボタンを押しながらUSBケーブルを接続します(電源投入)。
VNC Viewerを使うなどしてGUIで書き込んでもいいですが、今回はターミナルから書き込んでみます。
Picoがリムーバルディスクになっているのでそれをマウントします。
1 2 3 4 |
$ dmesg | tail [ 371.973555] sd 0:0:0:0: [sda] Attached SCSI removable disk $ sudo mkdir -p /mnt/pico $ sudo mount /dev/sda1 /mnt/pico |
“dhrystone.uf2″を書き込みます。
1 2 3 |
sudo cp dhrystone.uf2 /mnt/pico sudo sync sudo umount /mnt/pico |