技術

nvccでアーキテクチャの設定は出来るだけ下げた方が速い?

自分とこのGTX 460(Ubuntu)でしか確認してないので全然確信は持てないんだけど、カーネルのコンパイルを

nvcc -ptx -arch=sm_21 kernel.cu

としてたのを

nvcc -ptx -arch=sm_11 kernel.cu

としただけで、例のレイキャストの処理が0.055秒から0.04秒に短縮された。
この前の共有メモリを利用した高速化の3倍の効果、と考えると結構すごい。

カーネルのコード自体はsm_11の機能しか使ってなかったけど、出来るだけそのGPUが対応する新しいアーキテクチャに合わせてコンパイルした方が色々最適化が効くんじゃないかと思ってsm_21を指定してた。
でも、こういう結果が出ると考えを改めなきゃいけないかも。

追記
sm_13から倍精度浮動小数点に対応してるが、もしかしてsm_11に下げることにより単精度浮動小数点数使うようになり高速化した?
しかし元のソースにはどこにもdoubleの変数は宣言してない。謎。
めんどいけどptxファイルの中身を比較するか…

さらに追記
速度差が出るのはsm_13以下とsm_20以上の間だった。
つまり速度が変わるポイントはsm_13とsm_20の間に存在し、sm_11とsm_13の間ではないので原因はdoubleとfloatの差ではないと思われる(そもそもdouble使ってないし)。
色々調べたところ、以下のように-prec-div=falseを付けるとsm_11の場合と同じ速度になった。

nvcc -ptx -arch=sm_21 -prec-div=false kernel.cu

helpで見たところ、prec-divオプションは、単精度浮動小数点の割り算や逆数の計算の為の丸めモードとして、IEEEに準拠した方法と、高速な近似方法のどちらを使うかを指定するためのものみたい。
当然trueでIEEE準拠、falseで高速近似となる。
このオプションはsm_20以上で有効で、sm_13以下の場合は、-prec-div=false相当で固定となる。
アーキテクチャの設定を下げたら速くなった〜って無邪気に喜んでると、浮動小数点の誤差に逆襲されるかもしれないので注意が必要。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です



※画像をクリックして別の画像を表示

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください