G ゼミ 2010/5/14 渡辺健人
パフォーマンスの測定 CUDA Visual Profiler CUDA の SDK に標準でついているパフォーマン ス測定用のツール 使い方: exe ファイルのパスと作業ディレクトリ指定して実 行するだけ 注意点 : GPU のコード実行後にプログラム終了前に, cudaThreadExit() などで終了処理をきちんと入れて ないと結果がでない
CUDA Visual Profiler の出力 出力内容 各カーネルの実行時間 メモリの store,load の回数 分岐の回数 命令数 命令のスループットなど
実行結果
CUDA の処理 CUDA は GPU を扱えるように C を拡張したも の 各スレッドで処理する内容を記述する 実行は32スレッドを 1 warp として warp 単 位で実行する
パフォーマンスチューニング レジスタ数 1スレッド単位ではレジスタ数が多い方がよい が多くなると同時に走るスレッドが減る ー>メモリのアクセスのレイテンシを隠すため にはある程度レジスタを少なくした方が良い スレッドの割り振り 32 スレッドまとめて処理するので1スレッドと 1ピクセルを対応付けした場合なるべく warp で 処理する範囲は正方形に近いほうがよい
結果 10万個のメタボールのレイキャスティング で計測 CPU:0.272 sec GPU:0.543 sec( 初期状態) レジスタ数: 32 個、 16 個、 8 個で実験 実行時間 (sec) は 0.543, 0.450, スレッドの割り当て: x 方向を 16,8,4 で実験 実行時間 (sec) は 0.450, 0.433, 0.417
BVH の構築のチューニング BVH の最大深さ、最大プリミティブ数は CPU で速くなるようにしていたので GPU で早く なるようにした CPU では最大深さ 33, 最大プリミティブ数 6 GPU は演算処理が速い + 葉ノード内での処理す るデータはメモリ上で連続に配置してある ー>深さを少し浅くして、葉ノード内での処理 するプリミティブ数を増やす 深さを 15, プリミティブ数 80 で (0.417 sec -> sec)
GPU での分岐の処理 GPU では warp 単位で実行する 例えば、 if (e) s1 else s2 があったとすると 32 thread で並列に e の真偽値を評価 true のスレッドで s1 を実行 次に、 false のスレッドで s2 を実行 提案法では分岐先で処理時間が長いところ があるので、その部分は同時に処理した方 が効率が良い
warp 単位で分岐をそろえる GPU では warp 単位で真偽値を調べる方法と して2つの方法がある(今回は1つ目が使 える) __all(bool): 全てのスレッドが真の場合のみ真 __any(bool): 1つでも真の値があれば真 _all(bool) を使った結果 sec -> sec
CUDAレイトレの参考文献 Ray Tracing on a GPU with CUDA-Comparative Study with Three Algorithm[Zlatuska] Uniform grid, kd-tree, bvh のパフォーマンス評価 Understanding with Efficiency of Ray Traversal on GPUs[Aila] 空間データ構造のトラバーサルとプリミティブの交差判定 のGPU向けの実装方法についての考察 Real-Time Ray Tracing with CUDA[Shih] スライド Optimizing ray tracing for CUDA[Saransaari] Cuda で実装するときの簡単な最適化