その手の平は尻もつかめるさ

ギジュツ的な事をメーンで書く予定です

nvcc の最適化オプションについて

nvcc の最適化オプションについて、不正確な情報をしばしば耳にするのでそのことについて書いておきます。

nvcc の最適化オプションとは

$ nvcc foo.cu -O2
'-O2' のような、'O' というスタイルのオプションです。
gcc とかで見覚えがある事と思います。

nvcc の最適化オプションが最適化するのは

ホストコードのみです。
カーネルコードは最適化しません。

実際に確認してみる

まず、object ファイルを出力して差分を取ってみましょう。
object ファイルを出力するにはgcc 等のコンパイラと同様に'-c' オプションを付加します。
$ nvcc foo.cu -c
最適化オプションを付加したものについてもobject ファイルを出力しましょう。
$ nvcc foo.cu -c -O2
これら2つのobject ファイルについて差分を取ります。
object ファイルはバイナリファイルなので普通にdiff を取ると何の事やらさっぱり分かりませんが、
バイナリエディタ等で差分を取ってみると全くの別モノである事が分かるので、最適化されている事が分かります。*1

次に、ptx ファイル (カーネルコードをGPU アセンブリ言語にしたもの) を出力してdiff を取ってみましょう。
ptx ファイルを生成するには以下のように'--ptx' オプションを付加します。
$ nvcc --ptx foo.cu
最適化オプションをくっつけたものについてもptx ファイルを出力します。
$ nvcc --ptx foo.cu -O2
この2つのdiff を取ります。*2
恐らくここで得られる差分はTemp ファイルの違いくらいで、処理に関わる部分については差が無いことが読み取れます。
つまり、最適化されていない事がわかります。

結論

nvcc の最適化オプションによって最適化されるのはホストコードのみです。
カーネルコードは最適化されませんので!!

*1:暴論ですが……

*2:ptx ファイルはテキストなので普通にdiff で良いです