パスワードを忘れた? アカウント作成
174152 journal

L.Entisの日記: GPGPUプログラミングメモ

日記 by L.Entis
GTX275 にて。

レイトレ on CUDA コードを修正していて感じた&気が付いたこと。

◆ 条件式の評価値は { 0, 1 } ではない?

if ( a == b ) i ++ ;
のつもりで、いつも通り CUDA でも
i += (a == b) ;
と書いたら意図通りの動作にはならなかった。(より明示的なコードにしたら正常になった)
C 言語では整数にキャストされると 0 か 1 に評価される仕様だったような気がするのだが、nvcc は仕様が違うのかどうなのかは未確認。

 
◆ スレッドは意外とバラけても大丈夫?

SSE の SIMD 的な感じで、スレッド32個が32要素を有するベクトルレジスタのようなイメージで組んでいたが、そうでもないらしい。
コンパイラの最適化が効いているからかもしれないし、条件分岐が思っているより32スレッドであまりバラけていない(多分こっち)からかもしれないが(もちろん大枠ではまとまったフローになるように設計してあるものの)、とりあえず、SSE コードでやっているアルゴリズムに近いコードに変更したら2倍くらい高速になった。(GPU には向かないかと思っていた)
完全に SSE コードと同じようなアルゴリズムにしたらもうちょっと高速化できるかも?

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
typodupeerror

長期的な見通しやビジョンはあえて持たないようにしてる -- Linus Torvalds

読み込み中...