nvccコマンドの最適化オプション(-O)ではデバイスコードは最適化されない???

CUDAでの最適化オプションについて理解できていなかったので、防備録としてまとめます。

 

nvccコマンドのオプションはNVIDIA社のサイトNVCC :: CUDA Toolkit Documentation

に記載されています。

 

これによると、nvccコマンドにもOオプションがありますね。

CやC++などをコンパイルするときはコンパイラに最適化してもらうためにOオプションでコンパイルすると全て良しなにしてくれることが多いです。

なのでCUDAでも何も考えずにOオプションを付ければ最適化はいい感じにしてくれそうな気が一見します。

ただ、ドキュメントを読んでみるとちょっと不穏な空気になります。なんと、Oオプションの説明には以下のように書かれているのです。

Specify optimization level for host code.

????ホストコードの最適化レベルを特定するだと。。。。。

なんと、Oオプションだとホストコードの最適化レベルしか与えられないようです。。。

 

CUDAのプログラムはホストコードとデバイスコードの2種類に分類することができます。ざっくりですが、下記のように考えてもらえばいいです。

  • ホストコード  :CPUで処理されるプログラム部分
  • バイスコード :GPUで処理されるプログラム部分

CUDAを使う目的は、プログラムを並列化するためであるため、プログラマの関心はホストコードよりもむしろデバイスコードの処理速度に関心があるかと思います。

 

とりあえず、

nvccコマンドのOオプションではホストコードの最適化レベルを指定するのみで、

バイスコードの最適化レベルを指定するものではないってことが(ドキュメント上では)わかりました。

 

そうなると色々と気になることがでてきますね。

  • nvccのOオプションではホントにホストコードしか最適化されないの??
  • なんでホストコードとデバイスコードで最適化レベルの指定方法が同じじゃないの??
  • バイスコードを最適化するオプションはなに??

気になることが山盛りですが、今日はこの辺で。

次回以降で突っ込んでいこうとおもいます。