組み込みLinuxでプロファイルしてみよう!

Linuxのプロファイル

Linuxはperfやftrace等、プロファイルやトレースを採取するツールが揃っています。ソフトウェアでの実装なので手軽に試せる反面、測定のオーバーヘッドが発生します。今回紹介するTRACE32を使ったプロファイルやトレースはARMコアの機能を使って本番に近い環境で実施することができるので、精度の高い情報を得ることができます。

							まずは、今回使用するベンチマーク プログラムのrt-testsのダウンロードとコンパイルを行います。

							ソースのダウンロード
							$ git clone http://git.kernel.org/pub/scm/linux/kernel/git/clrkwllms/rt-tests.git

							環境変数の設定
							$ . /opt/poky/2.1.1/environment-setup-cortexa8hf-neon-poky-linux-gnueabi

							コンパイル
							$ cd rt-tests
							$ make

							今回使用するhackbenchをSDカードへコピー
							$ cp hackbench SDカードのrootfsパーティションのマウントポイント/適当なディレクトリー
						

JTAGのプロファイラ―

TRACE32を使ってプロファイルを採ることができます。JTAG通信のPCレジスタの値をサンプリングするのでオーバーヘッドなく高い精度のプロファイルを生成できます。

							ビデオで紹介したコマンドは、こちらです。

							メニューのパフォーマンス -> パフォーマンス測定設定

							Armのラジオボタンをクリックすると測定を開始します。

							下記のコマンドでコア毎にプロファイル結果が確認できます。
							B:: perf.list /core 0
							B:: perf.list /core 1
						
プロファイラ―設定画面

プロファイラ―設定画面

プロファイル結果 (コア0)

プロファイル結果 (コア0)

プロファイル結果 (コア1)

プロファイル結果 (コア1)

Embedded Trace FIFO (ETF)

Embedded Trace FIFO (ETF) は、SoC内のメモリにトレース データを保存します。容量は少ない(Cyclone V SoCは32KB)ですが、ボード上にEmbedded Trace Macrocell (ETM)の配線が不要でJTAGのみでオーバーヘッドのないトレースが取得できます。

							ETFの設定
							aps_etf.cmm

							Onchip.DISable
							Onchip.TraceCONNECT ETF1
							Trace.METHOD Onchip
							Onchip.Init
							Onchip
						
ETFの設定画面

ETFの設定画面

【トレース結果】Listボタンをクリックすると、トレース結果が表示されます。

【トレース結果】Listボタンをクリックすると、トレース結果が表示されます。

【トレース結果】概略をクリックするとC言語のビューになります。

【トレース結果】概略をクリックするとC言語のビューになります。

【トレース結果のチャート表示】

【トレース結果のチャート表示】
メニューのトレース -> チャート表示 -> シンボルをクリックすると、シンボルの遷移がチャート表示されます。

【トレース結果のチャート表示】

【トレース結果のチャート表示】
クリックまたはマウスのホイール スクロールで拡大できます。

Embedded Trace Router (ETR)

Embedded Trace Router (ETR)は、ボード上のDDRにトレース データを保存します。DDRのアクセスが発生するのでバス上にオーバーヘッドが発生しますが、ETMの配線が不要でJTAGのみで大容量のトレースが可能です。トレース データを保存する領域は、カーネル側とデバッガ側の両方の設定が必要です。今回は、DDRがマップされているアドレス0x0~0x3FFF_FFFFの最後の4MBをトレース データ用の領域として設定します。

							カーネル側の設定:
							arch/arm/boot/dts/socfpga_cyclone5_socdk.dts

							        memory {
							                name = "memory";
							                device_type = "memory";
							                reg = <0x0 0x40000000>; /* 1GB */
							        };
							        ↓ ↓ ↓ ↓
							        memory {
							                name = "memory";
							                device_type = "memory";
							                reg = <0x0 0x3fc00000>; /* 1GB - 4MB for ETR */
							        };

							dtbのコンパイル
							$ make dtbs

							dtbのコピー
							$ cp arch/arm/boot/dts/socfpga_cyclone5_socdk.dtb SDカードのFATパーティションのマウントポイント
						
クリックまたはマウスのホイール スクロールで拡大できます。

t32/demo/arm/etc/embedded_trace_router/etr_utility.cmm を実行すると、下記のダイアログが表示されます。
AXIBaseに0x3fc00000
Sizeに0x400000
を指定して、Set & Initボタンを押してください。

クリックまたはマウスのホイール スクロールで拡大できます。

トレース設定画面が自動的に表示されます。

クリックまたはマウスのホイール スクロールで拡大できます。

ETFと同様のトレースが大容量で取得できます。
メニューのトレース -> トレースデータの保存でトレースデータがPCに保存でき、トレースデータの読込みで保存したデータを読込むことができます。
大容量のトレースデータは後から解析したい内容が出てくることがあったり、画像ファイルにすることも出来るので、レビューのエビデンスとしても活用できます。