43

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

これによれば、2 つのコンパイラ フラグsm_XXとは別に、アーキテクチャを指定する 2 つの方法もありcompute_XXます。フラグは仮想アーキテクチャ ( など) の識別子のみを取得しますが、フラグは実際のアーキテクチャと仮想アーキテクチャの両方の識別子を取得します。compute_XXsm_XX-archcompute_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何ですか?

4

1 に答える 1

38

関連する質問/回答はこちらこちらにあります。

nvcc でビルドするときに、コード生成用のアーキテクチャを適切に指定する方法がまだわかりません。

完全な説明はやや複雑ですが、比較的単純で覚えやすい標準的な使用法を意図しています。ターゲットにする GPU を表すアーキテクチャ (仮想と現実の両方) 用にコンパイルします。かなり単純な形式は次のとおりです。

-gencode arch=compute_XX,code=sm_XX

ここで、XX はターゲットにする GPU の 2 桁の計算能力です。複数の GPU をターゲットにする場合は、XX ターゲットごとにシーケンス全体を繰り返すだけです。これは、CUDA サンプル コード プロジェクトで採用されたアプローチとほぼ同じです。(実行可能ファイルに PTX を含めたい場合は、オプションと同じ PTX 仮想アーキテクチャを指定するオプションを追加-gencodeで含めます)。codearch

単一の GPU のみを対象とする場合のもう 1 つの非常に単純な形式は、次のとおりです。

-arch=sm_XX 

XX についても同じ説明を使用します。このフォームには、指定されたアーキテクチャの SASS と PTX の両方が含まれます。

これによれば、2 つのコンパイラ フラグとは別に、アーキテクチャを指定する 2 つの方法があります。フラグ -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_52cc5.x PTX コード (のみ) を生成し、その PTX を実行可能ファイル/バイナリに埋め込みます。このオプションを指定せずに、この形式でこのオプションを単独で指定する-archことは違法であることに注意してください。(1)

このcuobjdump ツールを使用して、特定のバイナリに含まれるコンポーネントを正確に特定できます。

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

于 2016-02-26T16:54:54.670 に答える