cudaの仮想アーキテクチャと実際のアーキテクチャの違い、および異なる構成がプログラムのパフォーマンスにどのように影響するかを理解しようとしています。
-gencode arch=compute_20,code=sm_20
-gencode arch=compute_20,code=sm_21
-gencode arch=compute_21,code=sm_21
...
NVCCのマニュアルに以下の説明がありましたが、
GPU コンパイルは、仮想 GPU アーキテクチャのアセンブリと見なすことができる中間表現 PTX ([...]) を介して実行されます。実際のグラフィックス プロセッサとは対照的に、このような仮想 GPU は、アプリケーションに提供する機能のセットによって完全に定義されます。特に、仮想 GPU アーキテクチャは (大部分) 汎用命令セットを提供し、PTX プログラムは常にテキスト形式で表現されるため、バイナリ命令エンコーディングは問題になりません。したがって、nvcc コンパイル コマンドは常に 2 つのアーキテクチャを使用します。仮想中間アーキテクチャを指定する計算アーキテクチャと、実行するプロセッサを指定する実際の GPU アーキテクチャです。そのような nvcc コマンドが有効であるためには、実際のアーキテクチャは、(何らかの形で) 仮想アーキテクチャの実装である必要があります。これについては、以下でさらに説明します。選択された仮想アーキテクチャは、アプリケーションが必要とする GPU 機能に関する声明のようなものです。最小の仮想アーキテクチャを使用しても、2 番目の nvcc ステージで実際のアーキテクチャの範囲を最大限に広げることができます。逆に、アプリケーションで使用されていない機能を提供する仮想アーキテクチャを指定すると、2 番目の nvcc ステージで指定できる GPU のセットが不必要に制限されます。最小の仮想アーキテクチャを使用しても、nvcc の 2 番目の段階で最も幅広い実際のアーキテクチャを使用できます。逆に、アプリケーションで使用されていない機能を提供する仮想アーキテクチャを指定すると、2 番目の nvcc ステージで指定できる GPU のセットが不必要に制限されます。最小の仮想アーキテクチャを使用しても、nvcc の 2 番目の段階で最も幅広い実際のアーキテクチャを使用できます。逆に、アプリケーションで使用されていない機能を提供する仮想アーキテクチャを指定すると、2 番目の nvcc ステージで指定できる GPU のセットが不必要に制限されます。
しかし、さまざまな構成によってパフォーマンスがどのように影響を受けるかはまだよくわかりません (または、物理 GPU デバイスの選択のみに影響するのでしょうか?)。特に、次のステートメントは私にとって最も混乱を招きます。
特に、仮想 GPU アーキテクチャは (大部分) 汎用命令セットを提供し、PTX プログラムは常にテキスト形式で表現されるため、バイナリ命令エンコーディングは問題になりません。