2011-10-08 4 views
11

私はCompute_Capability 2.0デバイス(GTX460)でCUDA 4.0 archを使用しています。 'cubin'と 'ptx'ファイルの違いは何ですか? 私はcubinがgpuのネイティブコードだと思うので、これはarchです。 ptxはJITコンパイルを介してFermiデバイス(たとえばGeforce GTX 460)上で実行される中間言語です。私がcuソースをコンパイルするとき、私はptxかcubinターゲットのどちらかを選ぶことができます。私がcubinファイルを望むなら、私は "code = sm_20"を選択します。しかし、ptxファイルが必要な場合は、 "code = compute_20"を使用します。 正しいですか?NVIDIA NVCCとCUDA:Cubin vs. PTX

+2

'.cubin'はCUDAバイナリで、' .ptx'は 'ptxas'アセンブラに渡されるCUDAアセンブラソース(テキスト)です。 –

答えて

17

あなたは、ターゲットとするデバイスを制御するためのオプションでコンパイル段階(-ptx-cubin)を選択するためのオプション(-code)を混同しているので、あなたは、ドキュメントを再訪する必要があります。

NVCCはNVIDIAコンパイラドライバです。 -ptx-cubinオプションは、デフォルトでコンパイルの特定のフェーズを選択するために使用されます。フェーズ固有のオプションはありません。nvccは入力から実行可能ファイルを生成しようとします。ほとんどの人は-cオプションを使用してnvccにオブジェクトファイルを生成させ、その後デフォルトのプラットフォームリンカによって実行可能ファイルにリンクされます。-ptxおよび-cubinオプションは、ドライバAPIを使用している場合にのみ有効です。中間段階の詳細については、CUDA Toolkitのインストール時にインストールされているnvccマニュアルを参照してください。

  • -ptxの出力はプレーンテキストのPTXファイルです。 PTXはNVIDIA GPUの中間アセンブリ言語であり、まだ完全に最適化されておらず、後にデバイス固有のコードにアセンブルされます(異なるデバイスのレジスタ数が異なるため、完全に最適化されたPTXは間違っています)。
  • -cubinからの出力は、1つ以上のデバイス固有のバイナリイメージと(オプションで)PTXを含むことができる太いバイナリです。

あなたが参照する-code引数は、まったく異なる目的を持っています。私はいくつかの例を含むnvccのドキュメントをチェックすることをお勧めします。一般的には、より多くの制御を可能にし、1つのバイナリで複数のデバイスをターゲットにすることができるので、-gencodeオプションを使うことをお勧めします。簡単な例として:

  • -gencode arch=compute_xx,code=\'compute_xx,sm_yy,sm_zz\'原因は、計算能力xxのすべてのデバイスを標的とする(すなわちarch=ビット'S)及び最終的な脂肪バイナリにsm_yyとsm_zzに特異的なバイナリをPTX(code=compute_xx)を埋め込むだけでなく、装置にNVCC 。
関連する問題