11

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 つのアーキテクチャを使用します。仮想中間アーキテクチャを指定する計算アーキテクチャと、実行するプロセッサを指定する実際の G​​PU アーキテクチャです。そのような nvcc コマンドが有効であるためには、実際のアーキテクチャは、(何らかの形で) 仮想アーキテクチャの実装である必要があります。これについては、以下でさらに説明します。選択された仮想アーキテクチャは、アプリケーションが必要とする GPU 機能に関する声明のようなものです。最小の仮想アーキテクチャを使用しても、2 番目の nvcc ステージで実際のアーキテクチャの範囲を最大限に広げることができます。逆に、アプリケーションで使用されていない機能を提供する仮想アーキテクチャを指定すると、2 番目の nvcc ステージで指定できる GPU のセットが不必要に制限されます。最小の仮想アーキテクチャを使用しても、nvcc の 2 番目の段階で最も幅広い実際のアーキテクチャを使用できます。逆に、アプリケーションで使用されていない機能を提供する仮想アーキテクチャを指定すると、2 番目の nvcc ステージで指定できる GPU のセットが不必要に制限されます。最小の仮想アーキテクチャを使用しても、nvcc の 2 番目の段階で最も幅広い実際のアーキテクチャを使用できます。逆に、アプリケーションで使用されていない機能を提供する仮想アーキテクチャを指定すると、2 番目の nvcc ステージで指定できる GPU のセットが不必要に制限されます。

しかし、さまざまな構成によってパフォーマンスがどのように影響を受けるかはまだよくわかりません (または、物理 GPU デバイスの選択のみに影響するのでしょうか?)。特に、次のステートメントは私にとって最も混乱を招きます。

特に、仮想 GPU アーキテクチャは (大部分) 汎用命令セットを提供し、PTX プログラムは常にテキスト形式で表現されるため、バイナリ命令エンコーディングは問題になりません。

4

4 に答える 4

7

GPU コンパイルに関するNVIDIA CUDA コンパイラ ドライバ NVCCユーザー ガイド セクションでは、仮想アーキテクチャと物理アーキテクチャ、およびビルド プロセスでの概念の使用方法について詳しく説明しています。

仮想アーキテクチャは、コードが対象とする機能セットを指定します。次の表に、仮想アーキテクチャの進化の一部を示します。コンパイル時には、最も広範囲の物理アーキテクチャーでプログラムを実行できるようにするのに十分な機能セットを持つ、最も低い仮想アーキテクチャーを指定する必要があります。

仮想アーキテクチャ機能リスト (ユーザー ガイドより)

compute_10   Basic features
compute_11   + atomic memory operations on global memory
compute_12   + atomic memory operations on shared memory
             + vote instructions
compute_13   + double precision floating point support
compute_20   + Fermi support
compute_30   + Kepler support

物理アーキテクチャは、GPU の実装を指定します。これにより、コンパイラが仮想アーキテクチャを最適にバイナリ コードに変換できるように、命令セット、命令レイテンシ、命令スループット、リソース サイズなどがコンパイラに提供されます。

複数の仮想アーキテクチャと物理アーキテクチャのペアをコンパイラに指定して、コンパイラに最終的な PTX とバイナリを 1 つのバイナリに戻すことができます。実行時に、CUDA ドライバーは、インストールされている物理デバイスに最適な表現を選択します。バイナリ コードがfatbinaryファイルで提供されていない場合、ドライバーは JIT ランタイムを使用して最適な PTX 実装を実現できます。

于 2013-02-09T02:40:17.253 に答える
3

「仮想アーキテクチャ」コードは、デバイスにロードされる前にジャストインタイム コンパイラによってコンパイルされます。私の知る限り、これは「物理アーキテクチャ」コードをオフラインでビルドするときに NVCC が呼び出すコンパイラと同じコンパイラであるため、アプリケーションのパフォーマンスに違いがあるかどうかはわかりません。

基本的に、CUDA ハードウェアのすべての世代は、前の世代とバイナリ互換性がありません。ARM 命令セットを搭載した次世代の Intel プロセッサを想像してみてください。このように、仮想アーキテクチャは、互換性のあるハードウェア用にコンパイルできる CUDA アプリケーションの中間表現を提供します。ハードウェアの世代ごとに、新しい命令を必要とする新しい機能 (アトミック、CUDA 動的並列処理など) が導入されます。そのため、新しい仮想アーキテクチャが必要です。

基本的に、CDP を使用する場合は、SM 3.5 用にコンパイルする必要があります。特定の CUDA デバイス世代のアセンブリ コードを含むデバイス バイナリにコンパイルするか、これらの機能を提供する任意のデバイス世代のデバイス アセンブリにコンパイルできる PTX コードにコンパイルできます。

于 2013-02-08T21:24:01.510 に答える
1

仮想アーキテクチャは GPU が持つ機能を指定し、実際のアーキテクチャはそれをどのように行うかを指定します。

手元にある具体的な例は思い浮かびません。(おそらく正しくない) 例として、カードのコア数を指定する仮想 GPU が考えられます。したがって、そのコア数をターゲットとするコードが生成されますが、実際のカードでは、冗長性のためにさらに数個 (または製造上の理由で数個少なく) ある場合があります。エラー) と、実際に使用されているコアへのマッピングのいくつかの方法は、最初のステップで生成されたより一般的なコードの上に配置できます。

PTX コードは、特定のアーキテクチャを対象とするアセンブリ コードのようなものと考えることができ、特定のプロセッサ用のマシン コードにコンパイルできます。一般に、適切な種類のプロセッサのアセンブリ コードをターゲットにすると、より優れたマシン コードが生成されます。

于 2013-02-08T19:14:07.390 に答える
-1

通常、nvidia がドキュメントとして記述するものは、人々 (私を含む) をより混乱させます。(私だけかも!)

あなたはパフォーマンスに関心があります。基本的にこれが言っているのは(おそらく)そうではないということですが、そうすべきです.基本的に、GPUアーキテクチャは自然のようなものです. 彼らはその上で何かを実行し、何かが起こります。それから彼らはそれを説明しようとします。そして彼らはそれをあなたに食べさせます。

最後に、おそらくいくつかのテストを実行し、どの構成が最良の結果をもたらすかを確認する必要があります。

仮想アーキテクチャは、自由に考えられるように設計されたものです。必要なだけスレッドを使用し、事実上すべてをスレッドとブロックの数として割り当てることができます。問題ではなく、PTX に変換され、デバイスがそれを実行します。

唯一の問題は、単一のブロックごとに 1024 を超えるスレッドを割り当てると、デバイス (実際のアーキテクチャ) がサポートしていないため、結果として 0 が得られることです。

または、たとえば、デバイスがCUDA 1.2をサポートしている場合、コードでダブルポインティング変数を定義できますが、デバイスが実行できないため、結果として0が返されます。

パフォーマンスに関しては、32 スレッド (ワープなど) ごとにメモリ内の 1 つの位置にアクセスする必要があることを知っておく必要があります。そうしないと、アクセスがシリアル化されます。

要点が理解できたと思います。それは比較的新しい科学であり、GPU は非常に洗練されたハードウェア アーキテクチャです。誰もがそれを最大限に活用しようとしていますが、これはテストのゲームであり、実際のCUDA の背後にあるアーキテクチャ。GPU アーキテクチャを検索して、仮想スレッドとスレッド ブロックが実際にどのように実装されているかを確認することをお勧めします。

于 2013-02-08T19:24:02.123 に答える