nvcc の最適化オプションについて
nvcc の最適化オプションについて、不正確な情報をしばしば耳にするのでそのことについて書いておきます。
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 の最適化オプションによって最適化されるのはホストコードのみです。カーネルコードは最適化されませんので!!