私は最近、NVCC がさまざまなコンピューティング アーキテクチャ用に CUDA デバイス コードをコンパイルする方法に頭を悩ませています。
私の理解では、NVCC の -gencode オプションを使用する場合、"arch" はプログラマーのアプリケーションに必要な最小の計算アーキテクチャであり、NVCC の JIT コンパイラが PTX コードをコンパイルする最小のデバイス計算アーキテクチャでもあります。
また、-gencode の「コード」パラメータは、NVCC がアプリケーションを完全にコンパイルする計算アーキテクチャであるため、JIT コンパイルは不要であることも理解しています。
さまざまな CUDA プロジェクトの Makefile を調べたところ、次のことが定期的に発生していることに気付きました。
-gencode arch=compute_20,code=sm_20
-gencode arch=compute_20,code=sm_21
-gencode arch=compute_21,code=sm_21
いくつか読んだ後、1 つのバイナリ ファイル (この場合は sm_20、sm_21) で複数のデバイス アーキテクチャをコンパイルできることがわかりました。
私の質問は、なぜそんなに多くのアーキテクチャ/コードのペアが必要なのですか? 「arch」のすべての値が上記で使用されていますか?
それと言うの違いは何ですか:
-arch compute_20
-code sm_20
-code sm_21
「アーチ」フィールドで最も初期の仮想アーキテクチャが自動的に選択されていますか、それとも他のあいまいな動作がありますか?
他に注意すべきコンパイルおよび実行時の動作はありますか?
http://docs.nvidia.com/cuda/cuda-compiler-driver-nvcc/index.html#gpu-compilationのマニュアルを読みましたが、コンパイルまたは実行時に何が起こるかについてはまだ明確ではありません。