2010年3月26日金曜日

Matlab の mex をプロファイリング と Intro 書き直し

今日は、まず SDPARA の原稿の Intro を書き直した。
やはり、プロットを先に書いておくと、英語と内容の同時進行が英語だけになるので楽である。
これで数値実験の前のところまでは一通り書いたので、もう一度英語を校正することにする。

あと、SparseCoLO で、特定の問題のときに mexMaxSpanningTree2 が遅くなる、ということで調べることにした。
Matlab には、もともと profile というコマンドがあって、これを使うと行ごとの実行時間を表示してくれる。
しかし、profile は mex の時間は測定しても mex のソースは解析しないので、mex が重いときに改善が大変だった。
今回は、gcov というプログラムを使って、ある程度の解析ができることが解かった。

gcov についての説明は、
http://d.hatena.ne.jp/ku-ma-me/20090721/p1
がよくまとまっていて解りやすい。
これを mex に応用する。
なお、mexMaxSpanningTree2 は、通常のコンパイルは、

mex -O2 -largeArrayDims mexMaxSpanningTree2.cpp ccputime.cpp

で、コンパイルしているが、ここで -O を外すとともに -coverage を CXXFLAGS につけ、さらに -lgcov を最後につける。(-Oは最適化してしまうので外す。)
mex -largeArrayDims CXXFLAGS="-fPIC -coverage" mexMaxSpanningTree2.cpp ccputime.cpp -lgcov

これでコンパイルが通る。
(mex が内部的に gcc を呼び出しているため。)

Matlab は mexMaxSpanningTree2.cpp があるディレクトリ SparseCoLO/mex で起動し、この中で SparseCoLO を呼び出して実行する。
すると、いろいろなファイルができるが、その中に
mexMaxSpanningTree2.gcda
というファイルができる。
ここで
gcov mexMaxSpanningTree2.gcda
を実行すると gcov を拡張子とするファイルがたくさんできる。(iostream.h などをincludeしているため、それらの解析ファイルも同時にできる。)
最後に
less mexMaxSpanningTree2.cpp.gcov
とすると、mexMaxSpanningTree2.cpp の各行が何回実行されているかを知ることができる。
(#### で始まるところは、if 文などの分岐の影響で1度も実行されていない。)

Matlab の profile のように秒単位ではなく、何回実行されたかのため、実際のボトルネックかどうか難しいが、今回計測したところでは、ある特定の部分が 100 倍以上実行されていたので、ここがボトルネックと見て間違いなさそうであった。

今日の作業内容: 原稿校正 4h + gcov 1h
今日のBGM: NOIR OST [1-2], FF12 OST [1,2,4]
今日のランチ: 食堂 鶏竜田サラダセット
明日の予測作業時間: 2h

0 件のコメント:

コメントを投稿