Nvccを使用してビルドするときに、コード生成のアーキテクチャを適切に指定する方法がまだわかりません。バイナリに埋め込まれたマシンコードとPTXコードがあり、これがコントローラースイッチ-code
および-Arch
(または-gencode
を使用した両方の組み合わせを介して制御できることを認識しています。 )。
this によると、2つのコンパイラフラグの他に、アーキテクチャを指定する2つの方法があります:sm_XX
とcompute_XX
。ここで、compute_XX
は仮想とsm_XX
から実際のアーキテクチャへ。フラグ-Arch
は仮想アーキテクチャの識別子(compute_XX
など)のみを取りますが、-code
フラグは実アーキテクチャと仮想アーキテクチャの両方の識別子を取ります。
ドキュメントには、-Arch
が入力ファイルがコンパイルされる仮想アーキテクチャを指定していると記載されています。ただし、このPTXコードはマシンコードに自動的にコンパイルされませんが、これはむしろ「前処理ステップ」です。
現在、-code
は、PTXコードがアセンブルおよび最適化されるアーキテクチャを指定することになっています。
ただし、どのPTXまたはバイナリコードがバイナリに埋め込まれるかは明確ではありません。たとえば-Arch=compute_30 -code=sm_52
を指定した場合、コードはまず機能レベル3.0 PTXにコンパイルされ、その後機能レベル5.2のマシンコードが作成されます。そして何が埋め込まれますか?
-code=sm_52
を指定すると、どうなりますか? V5.2 PTXコードから作成されたV5.2のマシンコードのみが埋め込まれますか? -code=compute_52
との違いは何ですか?
関連する質問/回答の一部は here および here です。
Nvccを使用してビルドするときに、コード生成のアーキテクチャを適切に指定する方法がまだわかりません。
完全な説明はやや複雑ですが、比較的単純で覚えやすい標準的な使用法を意図しています。ターゲットとするGPUを表すアーキテクチャ(仮想および実両方)向けにコンパイルします。かなり単純なフォームは次のとおりです。
-gencode Arch=compute_XX,code=sm_XX
xXは、ターゲットとするGPUの2桁の計算機能です。複数のGPUをターゲットにしたい場合は、XXターゲットごとにシーケンス全体を繰り返すだけです。これは、ほぼCUDAサンプルコードプロジェクトで採用されているアプローチです。 (実行可能ファイルにPTXを含める場合は、code
オプションと同じPTX仮想アーキテクチャを指定するArch
オプションに追加の-gencode
を含めます)。
別のかなり単純な形式は、単一のGPUのみを対象とする場合、単に使用することです:
-Arch=sm_XX
xXについても同じ説明があります。このフォームには、指定されたアーキテクチャのSASSとPTXの両方が含まれます。
さて、これによると、2つのコンパイラフラグとは別に、アーキテクチャを指定する2つの方法があります。sm_XXとcompute_XXです。compute_XXは仮想を、sm_XXは実際のアーキテクチャを指します。フラグ-Archは仮想アーキテクチャ(compute_XXなど)の識別子のみを受け取りますが、-codeフラグは実アーキテクチャと仮想アーキテクチャの両方の識別子を受け取ります。
Arch
とcode
が-gencode
スイッチ内のサブスイッチとして使用される場合、または両方が一緒に使用されるの場合、基本的に正しいです。ただし、たとえば、-Arch
が単独で(-code
なしで)使用される場合、別の種類の「速記」表記法を表します。その場合、実際のアーキテクチャ、たとえば-Arch=sm_52
ただし、どのPTXまたはバイナリコードがバイナリに埋め込まれるかは明確ではありません。たとえば-Arch = compute_30 -code = sm_52を指定した場合、コードは最初に機能レベル3.0 PTXにコンパイルされ、その後機能レベル5.2のマシンコードが作成されます。そして何が埋め込まれますか?
埋め込まれるものの正確な定義は、使用形態によって異なります。しかし、この例では:
-gencode Arch=compute_30,code=sm_52
または、同等のケースの場合、次を特定します。
-Arch=compute_30 -code=sm_52
はい、それは次のことを意味します:
ptxas
ツールはcc5.2準拠のSASSコードを生成します。(なぜこのようなコンボを実際に指定するのかわかりませんが、それは合法です。)
-code = sm_52を指定した場合、どうなりますか? V5.2 PTXコードから作成されたV5.2のマシンコードのみが埋め込まれますか? -code = compute_52との違いは何ですか?
-code=sm_52
は、中間PTXコードからcc5.2 SASSコードを生成します。 SASSコードが埋め込まれ、PTXは破棄されます。この形式で-Arch
オプションなしでこのオプションを単独で指定することは違法であることに注意してください。 (1)
-code=compute_52
はcc5.x PTXコード(のみ)を生成し、そのPTXを実行可能ファイル/バイナリに埋め込みます。この形式で-Arch
オプションなしでこのオプションを単独で指定することは違法であることに注意してください。 (1)
cuobjdump
tool を使用すると、特定のバイナリに含まれるコンポーネントを正確に特定できます。
(1)-gencode
スイッチが使用されておらず、-Arch
スイッチが使用されていない場合、nvcc
はデフォルトの-Arch=sm_20
がコンパイルコマンドに追加されると想定します(これはCUDA 7.5用です) 、デフォルトの-Arch
設定はCUDAバージョンによって異なる場合があります)。 sm_20
はrealアーキテクチャであり、-Arch
オプションのときに-code
オプションでrealアーキテクチャを指定することは無効です。も提供されます。