LPCXpresso LPC1769でCoreMarkを動かす
LPCXpresso LPC1769でMCUベンチマークのCoreMarkを動かしてみました。CoreMarkはmbedへの移植版があるので、mbed IDE (RVDSコンパイラ)とLPCXpresso IDE (gcc)のコンパイラの差分が結果に現れるかを確認しました。
CoreMarkの移植
先ずユーザー登録を行ってソースをダウンロード。オリジナルのソースの他に各種プラットホーム向けの移植サンプルが入手できます。移植のために修正が必要な箇所は時間計測のためのタイマー処理をターゲットにあわせて書くのと、結果のコンソール出力まわりです。
LPC1700用の移植サンプルもあるのですが、serial関連のマクロがKeilに依存しており、そのままLPCXpresso IDEに持ってきてもコンパイルできませんでした。mbed版をベースにLPCXpressoのprintfをリンクした方が簡単そうだったので、mbed版をベースにKeil版のタイマー処理を貼り付けた形で動かしました。
移植の際の修正点は以下です。CoreMarkのライセンス条件を見ると、ソースの改変は自由ですが配布はcoremark.orgサイトからのみと書いてあるため、blogに貼るのは控えます。
- Timer0を使い1MHz周期でTCをカウントする → CLOCKS_PER_SEC = 1000000を設定
- barebones_clock()関数でLPC_TIM0->TCを返す
- core_portme.hの各種設定はmbed版を流用 → #define HAS_PRINTF 1でprintfがリンクされる
結果
結果を以下に示します。
<LPCXpresso LPC1769-100MHz>
2K performance run parameters for coremark.
CoreMark Size : 666
Total ticks : 31310974
Total time (secs): 31.310974
Iterations/Sec : 159.688421
Iterations : 5000
Compiler version : GCC4.3.3
Compiler flags : -o3
Memory location : STACK
seedcrc : 0xe9f5
[0]crclist : 0xe714
[0]crcmatrix : 0x1fd7
[0]crcstate : 0x8e3a
[0]crcfinal : 0xbd59
Correct operation validated. See readme.txt for run and reporting rules.
CoreMark 1.0 : 159.688421 / GCC4.3.3 -o3 / STACK
<mbed LPC1768-96MHz> - default
Run CoreMark
2K performance run parameters for coremark.
CoreMark Size : 666
Total ticks : 3238
Total time (secs): 32.380000
Iterations/Sec : 154.416306
Iterations : 5000
Compiler version : 4.2 (EDG g++ mode)
Compiler flags :
Memory location : STACK
seedcrc : 0xe9f5
[0]crclist : 0xe714
[0]crcmatrix : 0x1fd7
[0]crcstate : 0x8e3a
[0]crcfinal : 0xbd59
Correct operation validated. See readme.txt for run and reporting rules.
CoreMark 1.0 : 154.416306 / 4.2 (EDG g++ mode) / STACK
2K performance run parameters for coremark.
CoreMark Size : 666
Total ticks : 2654
Total time (secs): 26.540000
Iterations/Sec : 188.394876
Iterations : 5000
Compiler version : 4.2 (EDG g++ mode)
Compiler flags : #pragma O3, Otime
Memory location : STACK
seedcrc : 0xe9f5
[0]crclist : 0xe714
[0]crcmatrix : 0x1fd7
[0]crcstate : 0x8e3a
[0]crcfinal : 0xbd59
Correct operation validated. See readme.txt for run and reporting rules.
CoreMark 1.0 : 188.394876 / 4.2 (EDG g++ mode) #pragma O3, Otime / STACK
実験前はコンパイラの性能差でmbed (RVDS)がLPCXpresso (gcc)を上回ると思ったのですが、LPCXpressoの100MHz動作の場合、mbed (96MHz)に比べてクロック周波数分だけLPCXpressoの方が高スコアという結果になりました。CoreMarkはコンパイラ性能の差が出にくいアルゴリズムのためなんでしょうか。それとも、gccが意外と善戦しているのか。
2011/5/2 追記:
プログラム中に#pragmaでコンパイルオプションを指定することで、mbedでも最適化レベルを最大にすることが可能なことが分かりました(@toyowataさんのツイートより)。coremark.hの先頭に以下の2行を追加します。
#pragma O3
#pragma Otime
上記のオプション指定は、#pragmaを宣言したファイル単位で有効になるようです。そのため、全てのファイルで参照しているヘッダーファイルに指定すると効率的です。
最適化を行うと、mbed(RVDS)の性能がLPCXpresso(gcc) 100MHzを上回ります。
本家coremark.orgにアップしてあるスコアを見ると、LPC1768-100MHz + armcc 4.0 (-O3 -Otime)で175というスコアが出ているので、ARM純正コンパイラで最大限最適化を行うと、gccのO3オプションより効率がよいコードが生成できると思われます。つまり、mbed IDEのコンパイラはARM純正のRVDSを使っていますが、最適化オプションはデフォルトレベルになっていると思われます。
結果のサマリーを以下に示します。
最適化 | スコア(絶対値) | 相対値 | |
mbed (LPC1768-96MHz) | 指定なし | 154.41 | 96.7 |
mbed (LPC1768-96MHz) | O3, Otime | 188.39 | 118 |
LPCXpresso (LPC1769-100MHz) | O3 | 159.68 | 100 |
LPCXpresso (LPC1769-120MHz) | O3 | 191.62 | 120 |
LPCXpressoでprintfのシリアル出力を行う方法
LPCXpressoでprintfを使用するとIDEのconsoleに出力されます。今回の用途であればこれでも十分なのですが、printfをシリアルポートに出力する方法を試してみたので概要を記載します。
- printfを使う場合は、新規プロジェクトで"Semihosting C Project"を選択します(IDEのconsoleに出力する場合も同様)
- プロジェクトプロパティーのCompiler→TargetのライブラリをRedlibに設定、Linker→TargetのライブラリをRedlib (semihost)に設定
- RDB1768 CMSIS-based Example ProjectsからREB1768cmsis.zipをダウンロード
- RDB1768cmsis_UART_printfフォルダのretarget.c, uart0.h, uart0.hをプロジェクトフォルダーにコピー
- mainの先頭でUART0_Init(baud_rate)を呼ぶ
おわりに
LPCXpresso IDEですが、CodeSourcery G++とEclipseを使ってスクラッチでprintfが使える環境を構築した時に比べると格段に楽ちんです。LPCXpresso IDEもEclipseベースですがデバッガーが統合されていたりリンカースクリプトを自動生成してくれたりとか、IDEらしい機能があってグッド。ダウンロードできるコードサイズに128KBの上限がありますが、自分の使用範囲としては十分です。
参考資料
« LPCXpresso LPC1769の120MHzクロック設定 | トップページ | トラ技別冊MARY基板のデバッグ »
「NXP-ARM」カテゴリの記事
- LPCXpresso IDEでのC++コードサイズ肥大化の対策(2011.10.15)
- XBee APIモードライブラリのLPCXpressoへの移植(2011.10.09)
- LPCXpresso LPC1769でFree RTOSを使う(2011.07.27)
- LPCXpresso LPC1769でFatFsを動かす–USB Host編(2011.07.19)
- LPCXpresso LPC1769でFatFsを動かす - DMA編(2011.05.14)
この記事へのコメントは終了しました。
コメント