NVIDIA CUDA C ++コンパイラNVCC各コアに基づいて、双方がPTXを生成することができる前に、互換性のあるバージョンにCUBINアーキテクチャ特有のファイルを生成するために使用することができます。
各ファイルCUBIN、及びだけコンピューティングパワーの前方互換GPUアーキテクチャ固有のバージョンの同じメジャーバージョン番号を持ちます。
たとえば、3.0をサポートCUBINコンピューティングパワーのためのファイルには、すべてのコンピューティングパワー3.xのデバイスが、コンピューティングパワー5.xまたは6.xのデバイスをサポートしていません。
このため、GPUのアーキテクチャは、アプリケーションの互換性の前方のリリース後に導入されたことを確実にするためには、すべてのアプリケーションがそのカーネルのPTXバージョンが含まれていることをお勧めします。
注:上位互換性を達成するためのCUDAランタイムアプリケーションが特定のアーキテクチャのためCUBINとPTXコードが含まれ、デフォルトで自動的にCUBIN、厳密に予約PTXパス。
仕事のためには、ボルタGPUに基づいてアプリケーションの中核PTXバージョンが含まれている必要がありますよう。アプリケーションの場合のみCUBINファイルによってサポート特定のGPUアーキテクチャということは、ボルタ互換PTXまたはcubinsを提供するために更新する必要があります。
1. SMアーキテクチャ(CUDAアーチとCUDAのgencode)に対応する異なるNVIDIAグラフィック
NVIDIAがでやっているNVCCのSMのロゴ1.1
NVCCを使用する場合、コンパイラコンパイルソースを作製名NVIDIA GPU CUDAアーキテクチャ結果コンパイルされたファイルは、PTXは、複数のファイルを生成することができ、および建築異なる-gencode符号化を生成するために、依存示しCUDAアーキテクチャ-archフラグファイルそれは何回も繰り返すことができます。
CUDAコードをコンパイルするときに最も使用されるGPUグラフィックスと一致するアーキテクチャに従ってコンパイルすることができます。
コード生成は、常に-archを無視して、あなただけの-gencodeを指摘した場合、GPUのコード生成は、JITコンパイラにCUDAドライバによって生成され、コンパイル時に発生するので、これは、最短運転時間になります。
無関係な-gencode記号の数を減らし、CUDAコンパイラを加速し、時には我々は希望CUDA良く、下位互換性を行うには、あなただけのより多くの-gencodeを追加することができます。
1.2まず、あなたが使用しているあなたのGPUとCUDAのバージョンを確認します
以下は、SM変数と対応する典型的なグラフィックスモデルをサポートしています
CUDA 7+
- フェルミ(CUDA 8までCUDA 3.2)(CUDA 9から非推奨)。
SM20またはSM_20、compute_30 - 古いグラフィックカードのGeForce 400、500、600、GT-630
- ケプラー(CUDA 5以上)。
SM30またはSM_30、compute_30 - ケプラーアーキテクチャ(ジェネリック - テスラK40 / K80、のGeForce 700、GT-730)
ユニファイドメモリプログラミングのための追加サポート
SM35またはSM_35、compute_35 - より具体的なテスラK40
ダイナミック並列処理のためのサポートを追加します。私の経験でSM30を超える本当の利益を示しません。
SM37またはSM_37、compute_37 - より具体的なテスラK80
さらにいくつかのレジスタを追加します。ショー私の経験ではSM30を超える無本当の利点
- マクスウェル(CUDA 6以上)。
SM50またはSM_50、compute_50 - テスラ/ QuadroのMシリーズ
SM52またはSM_52、compute_52 - QuadroのM6000、
GeForce 900、
GTX-970, GTX-980, GTX Titan X
SM53またはSM_53、compute_53 - Tegraは(JETSON)TX1 / TegraはのX1
- パスカル(CUDA 8以上)
SM60またはSM_60、compute_60 - QuadroのGP100、
テスラP100、
DGX-1(一般パスカル)
SM61またはSM_61、compute_61 - GTX 1080、GTX 1070 GTX 1060 GTX 1050 GTX 1030、
タイタンXP、
テスラP40、テスラP4、
NVIDIAドライブPX2上の離散GPU
SM62またはSM_62、compute_62 - 統合されたGPU NVIDIAドライブPX2上、Tegraは(JETSON)TX2
- ボルタ(CUDA 9以上)
SM70またはSM_70、compute_70 - DGX-1ボルタと、
テスラV100、
GTX 1180(GV104)、
タイタンV、QuadroはGV100
SM72またはSM_72、compute_72 - JETSON AGXザビエル
- チューリング(CUDA 10以上)
SM75またはSM_75、compute_75 - GTXチューリング - GTX 1660はTi、
RTX 2060、RTX 2070、RTX 2080、
タイタンRTX、
RTXのQuadro 4000、Quadroは5000 RTX、RTXのQuadro 6000、Quadroは8000 RTX
1.3 NVIDIAの公式説明によると、
-gencode = =フロントエンドコンパイラのターゲットを指定するには、コマンドラインオプション、および必須常にPTXバージョンのアーチNVCC。
コード=ターゲットバックエンドコンパイラを指定するか、PTXはCUBINまたは両方であってもよいです。
唯一のバックエンド・コードによって=指定されたターゲットバージョンは、結果として得られるバイナリファイル内に保持されるボルタに互換性を提供するために、少なくとも1つのPTXを含有します。
1.4パラメータ例
最大の互換性CUDA 7の兆候を達成
-arch = sm_30 -gencode =アーチ= compute_20、コード= sm_20 -gencode =アーチ= compute_30、コード= sm_30 -gencode =アーチ= compute_50、コード= sm_50 -gencode =アーチ= compute_52、コード= sm_52 -gencode =アーチ= compute_52 、コード= compute_52
8 CUDA
-arch = sm_30 -gencode =アーチ= compute_20、コード= sm_20 -gencode =アーチ= compute_30、コード= sm_30 -gencode =アーチ= compute_50、コード= sm_50 \ -gencode =アーチ= compute_52、コード= sm_52 -gencode =アーチ= compute_60、コード= sm_60 \ -gencode =アーチ= compute_61、コード= sm_61 -gencode =アーチ= compute_61、コード= compute_61
CUDA 9ボルタグラフィックカード
-arch = sm_50 -gencode =アーチ= compute_50、コード= sm_50 -gencode =アーチ= compute_52、コード= sm_52 -gencode =アーチ= compute_60、コード= sm_60 \ -gencode =アーチ= compute_61、コード= sm_61 -gencode =アーチ= compute_70、コード= sm_70 \ -gencode =アーチ= compute_70、コード= compute_70
CUDA 10チューリンググラフィックスカード
-arch = sm_50 -gencode =アーチ= compute_50、コード= sm_50 -gencode =アーチ= compute_52、コード= sm_52 -gencode =アーチ= compute_60、コード= sm_60 \ -gencode =アーチ= compute_61、コード= sm_61 -gencode =アーチ= compute_70、コード= sm_70 \ -gencode =アーチ= compute_75、コード= sm_75 -gencode =アーチ= compute_75、コード= compute_75
2. GPUのビルドアプリケーションにNVIDIAボルタCUDAアーキテクチャに基づいて、
ステップ1:ボルタ互換性のあるデバイスコードをチェックしにアプリケーションにコンパイルされます
CUDAツールキット8.0およびアプリケーションの以前のバージョンを使用して2.1.1
構築するたびに互換性のあるボルタを構築するために8.0にCUDA CUDA Toolkitのバージョン2.1を使用するアプリケーションは、そのカーネルのPTXバージョンが含まれています。これは、次の手順によって検出することができます。
- ドライバの最新バージョンをダウンロードしてインストールhttp://www.nvidia.com/driversを
- = 1環境変数を設定しCUDA_FORCE_PTX_JIT
- ログインアプリケーション
あなたはCUDAアプリケーションを初めてログインするには、CUDAドライバは、コードCUBINローカルで使用される各CUDAコアのPTX JITコンパイラになります。
上記の手順が適切に環境変数のログイン機能を設定した後ならば、それは成功しVlotaの互換性を検証していたと説明しました。(注:リセット後CUDA_FORCE_PTX_JITを確認してください!)
CUDAツールキット9.0を使用して2.1.2アプリケーション
CUDAアプリケーションがあれば、両方の構築物がカーネルまたはPTXフォーマットまたはフォーマットCUBINボルタネイティブを含有していたように、コアは、CUDAツールキット9.0互換ボルタを構築し使用して。
ステップ2:ビルドアプリケーションは、ボルタをサポート
CUDAアプリケーションのログインカーネルは、CUDAランタイムシステムは、各GPUコンピューティングの能力を決定し、この情報を使用する場合は、自動的にベストマッチまたはPTXカーネルバージョンCUBINを見つけます。
GPU CUBINターゲットアーキテクチャがサポートするファイルは、現在入手可能な場合は、CUBINファイルを使用することで、そうでない場合はCUDAランタイムは、PTXをロードし、GET GPU CUBIN CUBINローカルファイル形式にこのPTX JITコンパイラのログインの前にします。
要件が満たされていない場合は、カーネルのログインは失敗します。
PTXフォーマットCUBINネイティブアプリケーションを構築する方法、または少なくともサポートボルタは、CUDAツールキットのバージョンによって異なります。
主な利点は次のとおりですCUBINローカルファイルを提供します。
これは、JITコンパイラがサポートする端末のみPTXカーネルのための時間を節約できます。カーネルの全ては、ときに、ローカル負荷アプリケーションのバイナリファイルにコンパイルされなければならない、またはすぐに、アプリケーションにリンクされているこれらのライブラリのすべてのカーネル・ライブラリー・ファイルを含む、PTXの建物からコンパイルされた後、
アプリケーションは、これらのコアは、サインインすることはありません場合でも。特に、大規模なライブラリ、JITコンパイルプロセスはかなりの時間を消費します。
これらのPTX JITの結果CUBIN CUDAドライバキャッシュはほとんどの場合、唯一のユーザーのために時間のかかる後、生成されたが、可能であれば我々は避けたいです。
PTX JITは、通常、GPUアーキテクチャの新しい機能を十分に活用しないカーネルコンパイル、コンパイラが速いか、より正確に実行可能と言うことですネイティブコードを生成します。
CUDAツールキット8.0およびアプリケーションの以前のバージョンを使用して2.2.1
コンパイラに含まCUDAツールキット8.0またはそれ以前には、NVIDIAマクスウェルとPascalのローカルCUBINファイル早期アーキテクチャなどを生成しますが、CUBINファイルボルタ・アーキテクチャを生成することはできません。
ボルタと建築の未来をサポートするために、あなたはCUDAツールキット8.0またはそれ以前のバージョンを使用するコンパイラは、各カーネルバージョンPTXを生成する必要があります。
以下は構築するために使用することができますmykernel.cu提供コンパイラを、mykernel.cuはマクスウェルPascalやボルタPTX JIT操作によるデバイスのデバイス上でローカルに実行することができます。
ご注意ください
- compute_XXはPTXバージョンを指し、
- sm_XXはCUBINバージョンを指し、
- -gencode = =フロントエンドコンパイラのターゲットを指定するには、コマンドラインオプション、および必須常にPTXバージョンのアーチNVCC。
- コード=ターゲットバックエンドコンパイラを指定するか、PTXはCUBINまたは両方であってもよいです。
- 唯一のターゲットバージョンで指定されたバックエンド・コードは=互換性ボルタを提供する少なくとも一つのPTXを含有する得られたバイナリファイルに残ります。
マック/ Linuxの
/ usr / local / CUDA / binに/ NVCC -gencode =アーチ= compute_50、コード= sm_50 -gencode =アーチ= compute_52、コード= sm_52 -gencode =アーチ= compute_60、コード= sm_60 \ -gencode =アーチ= compute_61、コード= sm_61 -gencode =アーチ= compute_61、コード= compute_61 \ -O2 -o mykernel.o -c mykernel.cu
また、あなたは、コマンドラインオプションNVCC -arch = sm_XX、その速記同等明確上で使用-gencode =コマンドラインオプションに精通してあります。
-arch = sm_XX以下の形式に展開
-gencode =アーチ= compute_XX、コード= sm_XX -gencode =アーチ= compute_XX、コード= compute_XX
-arch = sm_XXコマンドラインオプションは、バックエンドをデフォルトにリードはPTXの目標が含まれていないながら、しかし、それは唯一のアーキテクチャCUBINターゲットを指定することができ、かつ複数の-arch = NVCC同じコマンドラインオプションを使用することはできません、これはあります上記の例-gencode =理由の明示的な使用。
CUDAツールキット9.0を使用して2.2.2アプリケーション
使用CUDAツールキット9.0リリース、NVCCは、ローカルファイルCUBINボルタアーキテクチャ(演算能力7.0)を生成することができます。
次の例では、将来のGPUアーキテクチャでNVCCコマンドラインで適切な-gencode前方互換性として指定することができるようNVCC CUBINファイルを確実にするために、CUDAツールキット9.0を使用する場合は、のために、すべての最新GPUアーキテクチャとPTXバージョンを生成します。 =パラメータ。
マック/ Linuxの
/ usr / local / CUDA / binに/ NVCC -gencode =アーチ= compute_50、コード= sm_50 -gencode =アーチ= compute_52、コード= sm_52 -gencode =アーチ= compute_60、コード= sm_60 \ -gencode =アーチ= compute_61、コード= sm_61 -gencode =アーチ= compute_70、コード= sm_70 \ -gencode =アーチ= compute_70、コード= compute_70 -O2 -o mykernel.o -c mykernel.cu
- compute_XXはPTXバージョンを指し、
- sm_XXバージョンはCUBINを指し、
- -gencode = =フロントエンドコンパイラのターゲットを指定するには、コマンドラインオプション、および必須常にPTXバージョンのアーチNVCC。
- コード=ターゲットバックエンドコンパイラを指定するか、PTXはCUBINまたは両方であってもよいです。
- 唯一のターゲットバージョンで指定されたバックエンド・コードは、=将来のアーキテクチャとの互換性を提供するために、少なくとも一つのPTXを含有する得られたバイナリファイルに残ります。
- CUDA 9.0のコンピューティングパワー2.xのデバイス、およびコンパイラオプションから削除する任意のcompute_2x sm_2xの必要性のためのサポートを削除すると同時に、注意を払います。
2.2.3独立したスレッドのスケジューリングとの互換性
ボルタアーキテクチャは、別のスレッドのスケジューリングスレッドバンドルで導入しました。
歪ま同期に開発者が仮定を行う場合には、以前のアーキテクチャと比較して、この機能は、コードの実行に関与したスレッドのセットを変更することができます。
詳細と正しい操作を参照してくださいCUDA C ++プログラミングガイドの コンピューティングパワーのセクション7.0。
移行を支援するために、ボルタの開発者は、以下のオプションを組み合わせてパスカルコンパイラのスケジューリングモデルに参加することを選択することができます。
ncvv -arch = compute_60 -code = sm_70
参照