レイのサンプリング部を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なのでこれはよろしくないと思われる。
それ以外は基本的にリードオンリーなのだがスレッド関連のところは知らないのでなんとも言えない。
もう少し研究が必要な様子。