web-dev-qa-db-ja.com

CUDA:-Archおよび-codeとSM vs COMPUTEの使用方法

Nvccを使用してビルドするときに、コード生成のアーキテクチャを適切に指定する方法がまだわかりません。バイナリに埋め込まれたマシンコードとPTXコードがあり、これがコントローラースイッチ-codeおよび-Arch(または-gencodeを使用した両方の組み合わせを介して制御できることを認識しています。 )。

this によると、2つのコンパイラフラグの他に、アーキテクチャを指定する2つの方法があります:sm_XXcompute_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との違いは何ですか?

27
bweber

関連する質問/回答の一部は 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フラグは実アーキテクチャと仮想アーキテクチャの両方の識別子を受け取ります。

Archcode-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

はい、それは次のことを意味します:

  1. ソースコードから一時的なPTXコードが生成され、cc3.0 PTXが使用されます。
  2. そのPTXから、ptxasツールはcc5.2準拠のSASSコードを生成します。
  3. SASSコードは実行可能ファイルに埋め込まれます。
  4. PTXコードは破棄されます。

(なぜこのようなコンボを実際に指定するのかわかりませんが、それは合法です。)

-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)

cuobjdumptool を使用すると、特定のバイナリに含まれるコンポーネントを正確に特定できます。

(1)-gencodeスイッチが使用されておらず、-Archスイッチが使用されていない場合、nvccはデフォルトの-Arch=sm_20がコンパイルコマンドに追加されると想定します(これはCUDA 7.5用です) 、デフォルトの-Arch設定はCUDAバージョンによって異なる場合があります)。 sm_20realアーキテクチャであり、-Archオプションのときに-codeオプションでrealアーキテクチャを指定することは無効です。も提供されます。

27
Robert Crovella