2013-02-08 12 views
7

キューの仮想アーキテクチャと実際のアーキテクチャの違い、およびさまざまな構成がプログラムのパフォーマンスにどのように影響するかを理解しようとしています。キューの仮想アーキテクチャと実際のアーキテクチャの違い

-gencode arch=compute_20,code=sm_20 
-gencode arch=compute_20,code=sm_21 
-gencode arch=compute_21,code=sm_21 
... 

以下の説明は、NVCCマニュアルに与えられた、

GPUのコンパイルは、中間表現を介して行われるPTX ([...])、 ためのアセンブリとして考えることができます仮想GPUアーキテクチャ実際のグラフィックス プロセッサとは対照的に、そのような仮想GPUは、それがアプリケーションに提供する能力のセットまたは機能によって完全に定義される。特に、 PTXプログラムは常にテキスト形式で表現されるため、仮想GPUアーキテクチャは (主に)汎用命令セットを提供し、バイナリ命令エンコーディングは問題になりません。 したがって、nvccコンパイルコマンドは常に、仮想中間アーキテクチャを指定するための計算 アーキテクチャと、実際に実行するプロセッサを指定する実際のGPUアーキテクチャ の2つのアーキテクチャを使用します。そのようなnvccコマンドが有効であるためには、 実際のアーキテクチャは、仮想 アーキテクチャの実装(いくらかか別のもの)でなければなりません。これについては後でさらに説明する。 選択した仮想アーキテクチャーは、アプリケーションに必要なGPU機能の詳細です。最小の仮想アーキテクチャーを使用すると、2番目のnvccステージの実際のアーキテクチャーの範囲が最も広くなります。逆に、アプリケーションによって使用されない機能を提供する仮想 アーキテクチャを指定すると、2番目のnvccステージで指定できる可能性のあるGPUセット が不必要に制限されます。

しかし、パフォーマンスがさまざまな設定によってどのように影響を受けるか(物理的なGPUデバイスの選択にのみ影響するかもしれません)特に、この文は私にとって最も混乱して:

特に

、仮想GPUアーキテクチャは (主に)一般的な命令セット、およびバイナリ命令エンコーディングを提供 PTXプログラムが常に表現されているため、非問題ですテキスト形式。

答えて

6

NVIDIA CUDA Compiler Driver NVCCユーザガイドセクションGPU Compilationでは、仮想アーキテクチャと物理アーキテクチャ、およびビルドプロセスでのコンセプトの使用方法を非常に詳しく説明しています。

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

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で提供されていない場合、ドライバは実行時に最良のPTX実装をJITできます。

1

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

具体的な例がないとは思いません。カードが持つコア数を指定する仮想GPUかもしれないので、その数のコアを対象としたコードが生成されますが、実際のカードは冗長性のためにはさらに少数しかありません(または製造のためにエラー)、および実際に使用されているコアにマッピングするいくつかの方法があります。これらは、最初の手順で生成されたより汎用的なコードの上に置くことができます。

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

0

通常、nvidiaがドキュメントとして書き込むものは、人々(自分自身を含む)がもっと混乱する原因になります。 (私だけかもしれない!)

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

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

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

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

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

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

私は、あなたが今ポイントを持っていることを願っています。これは比較的新しい科学であり、GPUは本当に洗練されたハードウェアアーキテクチャであり、誰もがそれを最大限に活用しようとしています。 CUDAの背後にある実際のアーキテクチャに関する知識はほとんどありません。私は、GPUアーキテクチャの検索と、仮想スレッドとスレッドブロックが実際にどのように実装されているかを確認することをお勧めします。

3

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

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

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

関連する問題