課題と目標
以前作った形態係数計算の計算プログラム
Total number of nodes : 60734
Total number of boundary faces: 25704
Total number of elemnts : 326559
のデータに対して、計算時間内訳は、現状で以下の通り
[0:geometry] viewfactor preparation completed: total cpu = 1.2407467
[1:isfaced] viewfactor preparation completed: total cpu = 28.47784
[2:isfinished/isobstacle] viewfactor preparation completed: total cpu = 17638.96 (5Hr !)
[3:lwij] viewfactor preparation completed: total cpu = 1.041016
[4] viewfactor completed: total cpu = 53.09961
[5] viewfactor nomalized: total cpu = 7.597656
※デフォルトはS2S法使用です。
VF自体の計算部分はHemicubeなりHemisphereなりに置き換えればもっと小さくなりそうだが、精度との兼ね合いもある。むしろ(流体計算中に1度しか使わないのだが)、サーフェスメッシュ同士の邪魔関係計算に圧倒的に時間がかかっていることが問題なので、こいつを何とかしたい。
この部分の基本アルゴリズムは、サーフェスメッシュから、2つの異なるメッシュi, jを選び、それ以外のメッシュが視線ベクトルi,jを遮るかどうかと判定している。従ってn^3アルゴリズムになってしまっている。一応、i,j間のバウンディングボックスなんかを計算して無駄な判定をなくすようにしてみているが、イマイチなので、なんか新しいアルゴリズムを入れることと、GPUを使って高速化ということをやってみたい。
①実行時間がかかっている部分の詳細確認
pgfortranの機能pgcollect/pgprofを使ってプロファイリングしてみる。
- -Minfo=ccff をつけてmake(それ以外の最適化オプションはそのまま使える)
- pgcollect -time a.out(実行後pgprof.outが作成)
- pgprof -exe a.out (Profilerツールが起動)
※pgcollectを動かすには、numactl*パッケージが必要っぽいので追加でyum install numactl*.x86_64 しておく
※ccffはコンパイラフィードバック情報を作成してくれる。(http://www.pgroup.com/lit/articles/insider/v1n2a2.htm)