PR

プロファイル版ライブラリを使う

 プログラムのどの部分がボトルネックになっているかを具体的に調べるには,RTSオプションだけでは情報が足りません。GHCのプロファイル機能が必要になります。

 GHCのプロファイル機能を利用するには,通常のライブラリの代わりにプロファイル用にビルドされた特別なライブラリを使う必要があります。Haskell PlatformのWebサイトやGHCのWebサイトで提供されているバイナリには,通常のライブラリに加えてプロファイル版ライブラリも含まれています。問題になるのは,cabalコマンドなどを使って後からインストールしたライブラリです。

 cabalコマンドはそのままでは,パッケージのインストール時にプロファイル版ライブラリをインストールしません。--enable-library-profilingオプション(または省略形の-pオプション)を使って,プロファイル版ライブラリをインストールするよう指示する必要があります(参考リンク)。

cabal install vector -p
Configuring vector-0.7.0.1...
Preprocessing library vector-0.7.0.1...
Building vector-0.7.0.1...
[ 1 of 19] Compiling Data.Vector.Storable.Internal ( Data/Vector/Storable/Internal.hs, dist/build/Data/Vector/Storable/Internal.o )
~ 略 ~
[19 of 19] Compiling Data.Vector      ( Data/Vector.hs, dist/build/Data/Vector.o )
[ 1 of 19] Compiling Data.Vector.Storable.Internal ( Data/Vector/Storable/Internal.hs, dist/build/Data/Vector/Storable/Internal.p_o )
~ 略 ~
[18 of 19] Compiling Data.Vector.Mutable ( Data/Vector/Mutable.hs, dist/build/Data/Vector/Mutable.p_o )
[19 of 19] Compiling Data.Vector      ( Data/Vector.hs, dist/build/Data/Vector.p_o )
Registering vector-0.7.0.1...
Installing library in
/Users/shelarcy/.cabal/lib/vector-0.7.0.1/ghc-7.0.1.20101215
Registering vector-0.7.0.1...

cabal install vector -p -v
~ 略 ~
[19 of 19] Compiling Data.Vector      ( Data/Vector.hs, dist/build/Data/Vector.p_o )
Linking...
/usr/bin/ar -r dist/build/libHSvector-0.7.0.1.a dist/build/Data/Vector/Internal/Check.o ~ 略 ~ dist/build/Data/Vector.o
ar: creating archive dist/build/libHSvector-0.7.0.1.a
/usr/bin/ar -r dist/build/libHSvector-0.7.0.1_p.a dist/build/Data/Vector/Internal/Check.p_o ~ 略 ~  dist/build/Data/Vector.p_o
ar: creating archive dist/build/libHSvector-0.7.0.1_p.a
~ 略 ~
Installing dist/build/Data/Vector.hi to
/Users/shelarcy/.cabal/lib/vector-0.7.0.1/ghc-7.0.1.20101215/Data/Vector.hi
~ 略 ~
Installing dist/build/Data/Vector.p_hi to
/Users/shelarcy/.cabal/lib/vector-0.7.0.1/ghc-7.0.1.20101215/Data/Vector.p_hi
Creating /Users/shelarcy/.cabal/lib/vector-0.7.0.1/ghc-7.0.1.20101215 (and its
parents)
Installing dist/build/libHSvector-0.7.0.1.a to
/Users/shelarcy/.cabal/lib/vector-0.7.0.1/ghc-7.0.1.20101215/libHSvector-0.7.0.1.a
Creating /Users/shelarcy/.cabal/lib/vector-0.7.0.1/ghc-7.0.1.20101215 (and its
parents)
Installing dist/build/libHSvector-0.7.0.1_p.a to
/Users/shelarcy/.cabal/lib/vector-0.7.0.1/ghc-7.0.1.20101215/libHSvector-0.7.0.1_p.a
Creating /Users/shelarcy/.cabal/lib/vector-0.7.0.1/ghc-7.0.1.20101215 (and its
parents)
~ 略 ~
Registering vector-0.7.0.1...
/usr/bin/ghc-pkg update - --global --user

 -pオプションを使った結果,通常のライブラリのビルドとインストールに加え,拡張子の頭に「p_」が付いたファイル(Vector.p_o,Vector.p_hi)や,ファイル名の末尾に「_p」が付いたファイル(libHSvector-0.7.0.1_p.a)のビルドとインストールが行われます。

 ただし,-profオプションを利用したGHCのプロファイル機能は,並列プログラムの性能測定には適していません。実用上の理由から,-profオプションとマルチスレッド版RTSを利用する-threadedオプションを同時に使用することは可能です。しかし,これら二つのオプションを付けて作成した並列プログラムが複数のCPUコアの上で正しく動作する保証はありません。多くの場合,動かないか,誤った結果が出力されるでしょう(参考リンク)。

 GHCでは,並列プログラムの性能を測定するために,特別なプロファイル機能が提供されています。GHCの並列プログラム向けプロファイル機能は,次回以降の記事で説明する予定です。