Nios® II 高速化手法シリーズ
このシリーズでは Nios® II の高速化に役に立つ情報について紹介します。
GNU プロファイラー ( gprof )
Nios® II では GNU プロファイラー (gprof) を利用する事ができます。gprof は関数毎の処理時間と、何度呼ばれているか、どの関数に呼ばれているか等を計測しコンソール(またはファイル)に出力する事ができますので、この機能を使って処理負荷の高い関数を特定し、その関数を高速化する事でソフトウェア全体の処理性能を高める事ができます。
gprof を使用するための条件
Nios® II で gprof を使用するためには、最低限、以下のモジュールを Nios® II に接続しておく必要があります。
- JTAG UART Core
- Interval Timer Core
[ Platform Designer Example ]
JTAG UART Core の Parameters についてはソフトウェアに関連する設定はありませんので、デフォルトのままで結構ですが、Interval Timer Core の Parameters については Period/Units を 10ms※1 以上とする必要があります。
※1 Interval Timer は BSP-Editor の sys_clk_timer に設定する必要があります。 sys_clk_timer は定周期割り込みを発生させますので、あまり周期が短いと main() が動作しなくなります。したがって、システムの動作に影響を与えない程度の周期で設定する必要があります。
[ Interval Timer Parameters ]
計測のための設定
Nios® II で gprof を実行するためには、BSP-Editor で下記の設定を行う必要があります。
- sys_clk_timer
- stdin / stdout / stderr
- enable_gprof
[ BSP-Editor Settings ]
上記の設定を行った後、アプリケーションおよびライブラリーの Clean Project ⇒ Build Project を行います。
[ Nios II SBT Clean Project ]
こうする事で、全ての関数の先頭に mcount() への呼び出しが付加されます。※2
[ Objdump code ]
※2 計測対象のソフトウェアの関数全て(ライブラリーも含む)に追加される事になりますので、関数追加による処理速度の低下が起こりますがご了承ください。
計測のための条件
・ プロファイル結果は exit(0); の実行を持って出力されますので、計測対象のソフトウェアは、任意の箇所で exit(0) を呼ぶ必要があります。
・ gprof はプロファイリング中にヒープ上にデータを格納するパケットを確保します。各パケットのサイズは 2 byte で、各パケットは .text セクションのコードの 32 byte のサンプルを保持していますので、下記のサイズのヒープ領域が必要となります。(.text のサイズは .objdump ファイルを参照してください)
ヒープサイズ = (.text のセクションサイズ) / 32 * 2 byte
・ Nios® II SBT からの実行はできません。Nios® II Command Shell を起動してロード及び実行してください。
計測の実行
Nios® II SBT でビルドが済んだら、Nios® II Command Shell を 2 つ起動します。※3
※3 Nios® II SBT のプロジェクトを選択した状態で、右クロック⇒ Nios II ⇒ Nios II Command Shell で起動するとアプリケーション・フォルダーパスで Command Shell が開きますので便利です。
[ Nios® II Command Shell ]
一方のウィンドウで
$ nios2-terminal
もう一方のウィンドウで
$ nios2-download -g --write-gmon gmon.out <測定対象のソフトウェア>.elf
と入力します。
アプリケーション・フォルダーに gmon.out ファイルが生成されれば計測は完了です。※4
※4 正常に動作が完了しても gmon.out ファイルが生成されない場合がありますので、その際は再度実行してください。
[ Nios® II Command Shell - nios2-terminal ]
[ Nios® II Command Shell - nios2-download -g --write-gmon gmon.out ]
続いて、gmon.out から計測結果を出力します。
ウィンドウで下記を入力しますと、結果が Command Shell に出力されます。
$ nios2-elf-gprof profiler_gnu.elf gmon.out
リダイレクトを使って下記のように入力しますと、ファイルに出力する事ができます。
$ nios2-elf-gprof profiler_gnu.elf gmon.out > report.txt
[ Report.txt ]
出力結果の詳細については、GNU のサイトを参照ください。
おすすめページ
弊社では Nios® II に関する各種情報とまとめた「Nios® II まとめページ」をご用意しております。本記事以外にも有用な情報が満載ですのでこちらも併せてご確認ください。