関連する質問/回答はこちらとこちらにあります。
nvcc でビルドするときに、コード生成用のアーキテクチャを適切に指定する方法がまだわかりません。
完全な説明はやや複雑ですが、比較的単純で覚えやすい標準的な使用法を意図しています。ターゲットにする GPU を表すアーキテクチャ (仮想と現実の両方) 用にコンパイルします。かなり単純な形式は次のとおりです。
-gencode arch=compute_XX,code=sm_XX
ここで、XX はターゲットにする GPU の 2 桁の計算能力です。複数の GPU をターゲットにする場合は、XX ターゲットごとにシーケンス全体を繰り返すだけです。これは、CUDA サンプル コード プロジェクトで採用されたアプローチとほぼ同じです。(実行可能ファイルに PTX を含めたい場合は、オプションと同じ PTX 仮想アーキテクチャを指定するオプションを追加-gencode
で含めます)。code
arch
単一の GPU のみを対象とする場合のもう 1 つの非常に単純な形式は、次のとおりです。
-arch=sm_XX
XX についても同じ説明を使用します。このフォームには、指定されたアーキテクチャの SASS と PTX の両方が含まれます。
これによれば、2 つのコンパイラ フラグとは別に、アーキテクチャを指定する 2 つの方法があります。フラグ -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
はい、それは次のことを意味します。
- ソース コードから一時的な PTX コードが生成され、cc3.0 PTX が使用されます。
- その PTX から、
ptxas
ツールは cc5.2 準拠の SASS コードを生成します。
- SASS コードが実行可能ファイルに埋め込まれます。
- 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)
このcuobjdump
ツールを使用して、特定のバイナリに含まれるコンポーネントを正確に特定できます。
(1)-gencode
スイッチが使用されておらず、-arch
スイッチも使用されていない場合は、コンパイル コマンドにnvcc
デフォルトが追加されていると見なされます (これは CUDA 7.5 の場合であり、デフォルト設定は CUDA のバージョンによって異なる場合があります)。 は実際のアーキテクチャであり、オプションも指定されている場合にオプションで実際のアーキテクチャを指定することは正しくありません。-arch=sm_20
-arch
sm_20
-arch
-code