mbedも2.0でオープン化され、対応ハードがずいぶん増えました。Myコレクションも少々増えたので、各mbedのベンチマークテストを行いました。
ベンチマークに使ったソフトは、CoreMarkです。CoreMarkのサイトからソースをダウンロードできるのですが、mbedにポーティングされたものが、ClockControlとして公開されています。このポーティングからLPC1768 CPUクロック変更用のコードを取り去ってCoreMarkだけにして使っています。
LPC1768の場合、インポートしたままのmbedライブラリ版数(かなり古いです)で動くのですが、LPC1768以外のmbedはライブラリを最新化する必要があります。しかし、ライブラリを最新化するとコンパイル時に謎のエラーが大量に発生し、当初は、LPC1768以外でCoreMarkを動かすのをあきらめていました。
あるときCoreMark/core_porteme.cにmbed.hがincludeされていることに気がつき、mbed.hで定義されている各種クラスとCoreMarkのCコードがコンフリクトしている可能性に思い至りました。このパートで、mbed.h全体をincludeする必要はなく、時間を測定するためにclock()関数を使えるよう、time.hをincludeするだけでOKなはずです。この部分のコードを変えるとビンゴで、最新のmbedライブラリでもエラーが出なくなりました。
また、main.cppでは、以下のように、#include “CoreMark/CoreProteme.h”をextern “C”でくくっています(これもコンパイルエラー対策)。
#include "mbed.h" extern "C" { #include "CoreMark/core_portme.h" } int main() { printf("Run CoreMark\n"); printf("CPU clock: %d MHz\n", SystemCoreClock/1000000); mainCoreMark(); printf("CoreMark End \n\n"); }
修正1:SystemCoreClockを表示してCPU周波数を確認するコードを追加
時間測定は機種非依存ののclock()関数を使っているため、コードは全機種で共通です。CoreMarkのLicence条件では、CoreMarkサイト以外でcodeを配布してはいけないようなことが書いてあるので、私の全codeをpublishするのは控えます…
□実行結果
実行結果(CoreMark値)は以下の通りで、上位から記載すると(mbedライブラリは執筆時点で最新の88版を使用。O3/Otimeの最適化。);
機種名 | コア | CPUクロック(MHz) | CoreMark値 | |
1 | FRDM-K64F | Cortex-M4 | 120 | 286.204923 |
2 | LPC4088 | Cortex-M4 | 120 | 263.435195 |
3 | NucreoF401RE | Cortex-M4 | 84 | 220.167327 |
4 | LPC1768 | Cortex-M3 | 96 | 217.485863 |
5 | LPCXpresso11U68 | Cortex-M0+ | 74.316290 | |
6 | LPC1114FN28 | Cortex-M0 | 68.119891 | |
7 | HRM1017 | Cortex-M0 | 16 | 30.175015 |
修正2:LPC1114FN28のCPUクロックを48MHzに修正
修正3:LPCXpresso11U68のCPUクロックを48MHzに修正
□考察
- 120MHz Cortex-M4同士の対決は、FRDM-K64Fの勝ち
- 第二グループの100MHzクラスは、NucreoF401REが84MHzながら、96MHzのLPC1768を僅かに押さえて3位に。NucreoF401REはCortex-M4コアのため、M3コアのLPC1768を上回ったか
- 第三グループの50MHzクラスは、Cortex-M0+を積むLPCXpresso11U68がLPC1114FN28を僅かに上回り5位。
クロック周波数差見合いということか。
以前書いた、「LPCXpresso LPC1769でCoreMarkを動かす」では、mbed LPC1768のCoreMark値は、最適化をかけて188.394876でしたので、15%程度スコアが伸びています。これは、コンパイラのバージョンが上がり、最適化が進んだということでしょうか。<追記>@toyowataさんより、「mbedオンラインコンパイラのarmcc 4.1→5ではCortex-M系の最適化が向上しています。」とのコメントをいただきました。
mbedユーザーは常に最新版のコンパイラが使えるなんてステキです。