11

最近、コアの数が3倍になり、CUDAコードのパフォーマンスが大幅に向上することを期待して、GTX480からGTX680にアップグレードしました。恐ろしいことに、GTX680ではメモリを大量に消費するCUDAカーネルの実行速度が30%〜50%遅くなることがわかりました。

これは厳密にはプログラミングの問題ではありませんが、さまざまなデバイスでのCUDAカーネルのパフォーマンスに直接影響することを理解しています。誰かがCUDAデバイスの仕様と、それらを使用してCUDA Cカーネルでのパフォーマンスを推測する方法についての洞察を提供できますか?

4

4 に答える 4

9

あなたの質問に対する正確な答えではありませんが、GK104 (Kepler、GTX680) と GF110 (Fermi、GTX580) のパフォーマンスを理解するのに役立つかもしれないいくつかの情報:

Fermi では、コアは残りのロジックの 2 倍の周波数で実行されます。Kepler では、同じ周波数で実行されます。フェルミと比較してリンゴ同士の比較をより多く行いたい場合、ケプラーのコア数は事実上半分になります。したがって、GK104 (ケプラー) は 1536 / 2 = 768 の「フェルミ等価コア」になります。これは、GF110 (フェルミ) の 512 コアよりわずか 50% 多いだけです。

トランジスタ数を見ると、GF110が30億個、GK104が35億個。つまり、ケプラーのコア数は 3 倍ですが、トランジスタ数はわずかに多いだけです。つまり、ケプラーの「フェルミ等価コア」はフェルミよりも 50% だけ多いだけでなく、これらのコアのそれぞれはフェルミのものよりもはるかに単純でなければなりません。

したがって、これら 2 つの問題は、Kepler への移植時に多くのプロジェクトがスローダウンする理由をおそらく説明しています。

さらに、グラフィックス カード用に作成された Kepler のバージョンである GK104 は、スレッド間の連携が Fermi よりも遅くなるように調整されています (そのような連携はグラフィックスにとってそれほど重要ではないため)。上記の事実を考慮した後の潜在的な潜在的なパフォーマンスの向上は、これによって無効になる可能性があります。

倍精度浮動小数点のパフォーマンスの問題もあります。Tesla カードで使用される GF110 のバージョンは、単精度の 1/2 のパフォーマンスで倍精度浮動小数点を実行できます。チップがグラフィックス カードで使用される場合、倍精度のパフォーマンスは人為的に単精度のパフォーマンスの 1/8 に制限されますが、これは GK104 の 1/24 の倍精度のパフォーマンスよりもはるかに優れています。

于 2012-05-28T05:09:29.667 に答える
2

新しいKeplerアーキテクチャの進歩の1つは、8つの192コアSMXにグループ化された1536コアですが、同時にこのコア数は大きな問題です。共有メモリはまだ48kbに制限されているためです。したがって、アプリケーションで多くのSMXリソースが必要な場合、単一のSMXで4つのワープを並行して実行することはできません。コードをプロファイリングして、GPUの実際の占有率を見つけることができます。アプリケーションを改善するための可能な方法:

  1. 共有メモリ通信の代わりにワープ投票機能を使用します。
  2. トレッドブロックの数を増やし、1つのブロックのスレッドの数を減らします。
  3. グローバルロード/ストアを最適化します。Keplerには、SMXごとに32のロード/ストアモジュールがあります(Keplerの2倍)。
于 2012-05-26T12:26:11.857 に答える
2

nvieww をインストールしています。coolbits 2.0 を使用して、シェーダー コアをデフォルトから最大パフォーマンスまでロック解除しています。また、デバイスの両方のコネクタを 1 つのディスプレイに接続する必要があります。これは、nVidia コントロール パネルの画面 1/2 と画面 2/2 で有効にすることができます。次に、この画面を別の画面に複製し、Windows の解像度構成で画面モードを拡張デスクトップに設定する必要があります。

nVidia inspector 1.9 (BIOS レベルのドライバー) では、アプリケーションのプロファイルを設定することでこのモードを有効にすることができます (アプリケーションの exe ファイルをプロファイルに追加する必要があります)。これで、ほぼ 2 倍のパフォーマンスが得られます (温度に注意してください)。

DX11 はテッセレーションも備えているため、それをオーバーライドしてネイティブ解像度をスケーリングします。ネイティブ解像度は、960-540P などの低解像度でレンダリングすることで実現でき、残りは 3D パイプラインに任せてフル HD にスケールアップします (nv コントロール パネル デスクトップのサイズと位置で)。低解像度をディスプレイでフルスクリーンにスケーリングすると、オンザフライでレンダリングされるテクスチャ サイズが 2 倍のフル HD になり、極度の LOD バイアス (詳細レベル) で 3D テクスチャをレンダリングするのにすべてがうまくいくはずです。ディスプレイが自動ズームになっている必要があります。

また、sli 構成コンピューターを打ち負かすことができます。この方法だと、tessmark の 3-way sli よりも高いスコアが得られます。32X 混合サンプルのような高い AA 設定により、すべてが AAA 品質の HD のように見えます (tessmark および heavon ベンチで)。エンドスコアには解像度設定がないため、ネイティブ解像度でレンダリングすることは重要ではないことがわかります。

これにより、実際の結果が得られるはずです。文学的ではなく、よく考えて読んでください。

于 2012-10-24T00:58:26.677 に答える
1

問題はストリーミング マルチプロセッサの数にあると思います。GTX 480 には 15 個の SM があり、GTX 680 には 8 個しかありません。

最大で 8/16 ブロックまたは 1536/2048 スレッド (計算能力 2.0/3.0) を 1 つの SM に配置できるため、SM の数は重要です。それらが共有するリソース (共有メモリやレジスタなど) によって、SM ごとのブロック数がさらに制限される場合があります。また、GTX 680 の SM あたりのより多くのコア数は、命令レベルの並列処理を使用して、つまりいくつかの独立した操作をパイプライン化することによってのみ合理的に利用できます。

SM ごとに同時に実行できるブロックの数を調べるには、nVidia のCUDA Occupancy Calculatorスプレッドシートを使用できます。カーネルが必要とする共有メモリとレジスタの量を確認するには、コンパイル時にコマンド ラインに追加-Xptxas –vします。nvcc

于 2012-05-26T11:42:24.200 に答える