Tech と Culture

テクノロジーとカルチャー

gprof

処理速度をあげなければ動画にならないのでプログラム中のどこで処理時間がかかっているか調査を行います。
gprofというプロファイラを用います。

コンパイルする際に -pg オプションを付けます(オブジェクト生成の時とリンクの時両方必要)。
できあがった実行ファイルを通常通り実行するとgmon.outというファイルができているので、gprof <実行コマンド> gmon.out とするとどの関数でどれぐらいの時間がかかったかを表示してくれます。
とりあえずホストのXwindows版のプログラムで非常に大きなjpegファイルを実行した結果は、、、、、、、
Each sample counts as 0.01 seconds.
% cumulative self self total
time seconds seconds calls ms/call ms/call name
32.26 0.20 0.20 62424 0.00 0.00 decode_mcu
24.19 0.35 0.15 249696 0.00 0.00 jpeg_idct_islow
20.97 0.48 0.13 2448 0.05 0.05 ycc_rgb_convert
8.06 0.53 0.05 1722390 0.00 0.00 jpeg_fill_bit_buffer
8.06 0.58 0.05 1 50.00 50.00 finish_output_bmp
3.23 0.60 0.02 2448 0.01 0.01 put_pixel_rows
1.61 0.61 0.01 236866 0.00 0.00 jpeg_huff_decode
1.61 0.62 0.01 4896 0.00 0.00 h2v1_fancy_upsample
0.00 0.62 0.00 62424 0.00 0.00 jzero_far
0.00 0.62 0.00 15632 0.00 0.00 emit_message
0.00 0.62 0.00 15605 0.00 0.00 read_restart_marker
.................
とこんな感じです。
decode_mcu で32% jpeg_idct_slowで24%、ycc_rgb_convertで21%です。
ホストは処理能力が高いのでVGAサイズの画像では各関数の処理時間がgprofの測定範囲以下になるためすべて0%になってしまいます。今回は非常に大きな画像をX86で処理した場合の各関数の処理時間の重さとなります。
decode_mcu はハフマンデコード部分
jpeg_idct_islow はDCT部分
ycc_rgb_convert はカラー変換と画面表示
などです。

これをターゲットボードで実行するためにクロスコンパイルオプションに -pg を付けて無事コンパイル終了。ターゲットボードで実行すると、、、、、gmon.outが出力されない!!!

困った。いろいろネットを調べると、-pg オプションを付けると各関数の頭にmcountという時間をチェックする関数が追加されるらしい。またmain関数が始まる前に実行されるcrt0というファイルがgcrt0というものに変わるそうです。
sparc-linux-objdump -D でクロスコンパイル済みのバイナリーを見るとたしかにmcountという関数が散りばめられている。__gmon_start__という関数も入っている。何故 gmon.out が出力されないのだろう???
straceというプログラムでファイルオープンを確認できるそうなので実行しようと思ってクロスコンパイルするがコンパイルエラー、、、、、、
少し行き詰まってしまったので、この件は一旦放置することにしました。