haskell-jp / questions #48

プロファイルは cabal.project.local という名前のファイルに profiling: Trueと書いて cabal new-buildでコンパイルすると良い感じにやってくれます。これだと各モジュールの公開される関数にSCCをつけてくれます。より細かいのを見る場合は {-# OPTIONS_GHC -fprof-auto #-} をつけたいコードの先頭に置けばできますが、やりすぎると最適化と競合を起こして本質がわからなくなるので注意する必要があります。
パフォーマンスの違いがaesniを使っているかというところになってくるとcryptoniteじゃなくてcryptonite-opensslを使うというシナリオがあるような気がしております。
cabal.project.local という名前のファイルに profiling: Trueと書いて cabal new-buildでコンパイルする
cabal new-build --enable-profでも同じことが出来ます。
numpyと同等の性能を出したいのであればblasというFortranで書かれた線形代数ライブラリをFFIで使う必要があるらしく、詳しくはわからないですが hmatrixというライブラリが使いやすそうですね。  http://lqtmirage.hatenablog.com/entry/2018/07/12/232852
あとはcudaにバックエンドしてくれるAccelerateもありましたね。一時期開発が止まってた気がするんですが、去年の10月に更新されてる http://hackage.haskell.org/package/accelerate
accelerateは開発の中心がaccelerate-cudaからaccelerate-llvmに移っています。CUDAにはaccelerate-llvm-ptx、CPUにはaccelerate-llvm-nativeを使います。
hmatrixでやっているのは知ってたんですが同じことやってもなぁと思ったのでRepaかAccelerateかだと思いまして,Aの方はGPUを使うものだと思ったのでnote pcベースでやってるんでRepaになったという事情.
-threadedと-profって食い合わせ悪い?
プロファイル取りつつと思ったけどビルドに失敗するんで調べたら過去の記事ではそんなおと書いてある.(しぇらしーさんのやつだ.)
-fprof-autoはイケたけどruntimeで+RTS -pがやはりダメ.
どうやって実行してますか?
今試しているのは

ghc-options: -Odph -rtsopts -threaded -fno-liberate-case -funfolding-use-threshold1000 -funfolding-keeness-factor1000 -fllvm -optlo-O3 -fprof-auto -eventlog

としておいてからの+RTS -s -N8 -l

です.これで起動してみてるところ.
-eventlog-prof は両立できないです
あ,pullreqしてもらったものをcoしてそこで試し中です.
一度そのまま実行してみて終了することは確認させてもらったのでこれでプロファイラを使いつつどうやって攻めれば良いのかを学習させてもらうつもりです.
はい.
今丁度それを知って,-profではなく-eventlogを仕込んでから+RTSで-pではなく-lを利用して試しているところです
cabal new-exec main -- +RTS -pでできるはずです。 --を忘れると cabalの方に+RTSが渡ってできないという罠があります。
並列の場合にも-pでOKということですか?
大丈夫なはずです。
[email protected] ~/devel/haskell/deep-learning-from-scratch (autotaker-speedup *)
$ cabal new-exec ./dist/build/main/main -- +RTS -p -s -N8
cabal: The program './dist/build/main/main' is required but it could not be
found.

と出てしまいます.
cabal buildはsuccessでmainもあるのですが,見つけられない様子.
cabal new-execはcabalファイルに設定した実行バイナリ名(おそらく main)を指定すれば良いです。また `cabal new-`系ではビルド結果は dist-newstyle以下に保存されます。昔のコンパイル結果を参照しているのではないでしょうか?
cabal clean
rm -rf dist-newstyle
cabal new-build --enable-prof
cabal new-exec main -- +RTS -p -s -N8
という流れで良いのかな...
ああダメか. --enable-profが通らない...
cabal clean
rm -rf dist-newstyle
cabal new-build
cabal new-exec main -- +RTS -s -N8
ならOKだけど-pが使えないーーー
new-execは使えたけど-pが-threadedと両立しないのかなやはり.
152,496,672 bytes allocated in the heap
51,950,384 bytes copied during GC
10,468,032 bytes maximum residency (8 sample(s))
324,928 bytes maximum slop
29 MB total memory in use (0 MB lost due to fragmentation)

Tot time (elapsed) Avg pause Max pause
Gen 0 137 colls, 137 par 0.360s 0.049s 0.0004s 0.0030s
Gen 1 8 colls, 7 par 0.090s 0.013s 0.0017s 0.0041s

Parallel GC work balance: 32.42% (serial 0%, perfect 100%)

TASKS: 18 (1 bound, 17 peak workers (17 total), using -N8)

SPARKS: 0 (0 converted, 0 overflowed, 0 dud, 0 GC'd, 0 fizzled)

INIT time 0.006s ( 0.004s elapsed)
MUT time 0.106s (583.563s elapsed)
GC time 0.450s ( 0.062s elapsed)
EXIT time 0.002s ( 0.003s elapsed)
Total time 0.564s (583.633s elapsed)

Alloc rate 1,437,976,164 bytes per MUT second

Productivity 19.2% of total user, 100.0% of total elapsed

gc_alloc_block_sync: 9791
whitehole_spin: 0
gen[0].sync: 5
gen[1].sync: 89
Productivity 19.2%
MUTが0.106sなのにelapsed 583sってこれ何やってんだって感じなんだが.
—enable-profではなく—enable-profiling のようです。
—enable-profではなく—enable-profiling のようです。
手元のcabal-installは--enable-profに限らず一意に定まるなら長いオプションの途中までで問題なく使えるのですが、古いcabal-installでは全部指定しないとダメかもしれません。
-eventlog-prof は両立できないです
こちらも比較的新しいGHCなら一緒に使えます。例えば8.2あたりからheap profilingの情報をeventlogに出力できるようになったはずです。threadscopeがまだ対応してないのであまり便利ではないですが。
Repa選んだのも並列でやれるってのも当然あるので,-threaded前提で考えています.その場合にはどっちが良いのかな?
-p-threadedが両立しない
そんなことないはずなんですが・・・
昔はダメだったという話はあるようです.当時も理論上はダメなことはないはずだけど実際にはやるとコンパイルできなかったりランタイムで落ちたりすると.
今手元で試すと,
ghc-options: -Odph -rtsopts -threaded -fno-liberate-case -funfolding-use-threshold1000 -funfolding-keeness-factor1000 -fllvm -optlo-O3

cabal new-build --enable-profiling
するとビルドに失敗しますねぇ.
どんなエラーが出ますか?
あーライブラリモジュールが見付けられない
snippetとしてログを貼ってくれますか?
Data/Default/Class.hs:61:1: error:
Could not find module ‘GHC.Generics’
Perhaps you haven't installed the profiling libraries for package ‘base-4.11.1.0’?
Use -v to see a list of the files searched for.
|
61 | import GHC.Generics
| ^^^^^^^^^^^^^^^^^^^
cabal: Failed to build StateVar-1.1.1.1 (which is required by exe:main from
deep-learning-from-scratch-0.1.0.0). See the build log above for details.
Failed to build base-compat-0.10.5 (which is required by exe:main from
deep-learning-from-scratch-0.1.0.0). See the build log above for details.
Failed to build basement-0.0.10 (which is required by exe:main from
deep-learning-from-scratch-0.1.0.0). See the build log above for details.
Failed to build blaze-builder-0.4.1.0 (which is required by exe:main from
deep-learning-from-scratch-0.1.0.0). See the build log above for details.
Failed to build bmp-1.2.6.3 (which is required by exe:main from
deep-learning-from-scratch-0.1.0.0). See the build log above for details.
Failed to build byteable-0.1.1 (which is required by exe:main from
deep-learning-from-scratch-0.1.0.0). See the build log above for details.
Failed to build cereal-0.5.8.0 (which is required by exe:main from
deep-learning-from-scratch-0.1.0.0). See the build log above for details.
Failed to build data-accessor-0.2.2.8 (which is required by exe:main from
deep-learning-from-scratch-0.1.0.0). See the build log above for details.
Failed to build data-default-class-0.1.2.0 (which is required by exe:main from
deep-learning-from-scratch-0.1.0.0). See the build log above for details.
こんなやつです.
-libdirを指定でよいのかな.
profiling libraryって昔と違って今はどれもdefaultで入ってたという認識なんだが...
cabalファイルのbaseのdependencyを < 4.13に変えて見てもらえますか?
ghc-8.6.3でコンパイルしているならbaseが4.12のはずなので外からインストールしようとして失敗している気がします。
あーいえ8.4.4だったりします.
debianのaptで入れているので
apt installing
ビルド通りそう!