レイのサンプリング部をtbbのblocked_range2dで換装してみた。
まずは変更が少なくて済むparallel_forでやってみる。
画素毎のループをファンクタに抽出して必要な変数を持たせてやるだけだったのでさくっと作業は完了。
さっそく実行してみる。モデルはスタンフォードのドラゴン。
// 通常バージョン store: dragon_vrip.ply vertices: 437645 faceCount: 871414 sampling count: 360000 rendered time: 6.990000 sec triangle intersection count: 131.080231 million(18.752539 million/sec) // TBBバージョン sampling count: 359201 rendered time: 16.410000 sec triangle intersection count: 130.183151 million(7.933160 million/sec)
実行時間が2倍になったorz。
もっとか。
sampling countが減っているのはスレッドが同じカウンタを加算しようとするのに
失敗しているからと推測される。
もうひとつblocked_range2dに与える空間の幅が一定数(600と640の間のどこか)
を越えるとsegmentaion faultが発生するという事態が発生。
*** glibc detected *** ./sample: free(): invalid pointer: 0xb7402008 ***
まず心当たりがあるのはすべてのタスクでレイの交差結果を画像バッファに書き込むところ。
中身は単なるstd::vectorなのでこれはよろしくないと思われる。
それ以外は基本的にリードオンリーなのだがスレッド関連のところは知らないのでなんとも言えない。
もう少し研究が必要な様子。