5

CUDA カーネルを自分でプログラムしました。CPU コードと比較すると、私のカーネル コードは CPU よりも 10 倍高速です。

しかし、私の実験には疑問があります。

私のプログラムは、すべての GPU コア、適切な共有メモリの使用、適切なレジスタ数、十分な占有率を使用して完全に最適化されていますか?

カーネル コードのパフォーマンスを評価するにはどうすればよいですか?

CUDA の最大スループットを理論的に計算するにはどうすればよいですか?

CPU の GFLOPS と GPU の GFLOPS と GFLOPS レートを比較することは、それらの透明な理論上のパフォーマンスであるというのは正しいですか?

前もって感謝します。

4

2 に答える 2

5

私のプログラムは、すべての GPU コア、適切な共有メモリの使用、適切なレジスタ数、十分な占有率を使用して完全に最適化されていますか?

これを見つけるには、CUDA プロファイラーの 1 つを使用します。CUDA カーネルのプロファイリングと最適化の方法を参照してください。

CUDA の最大スループットを理論的に計算するにはどうすればよいですか?

この計算は少し複雑で、アーキテクチャごとに異なり、間違えやすいです。チップの仕様で数字を調べることをお勧めします。ウィキペディアには、このような GTX500 カードの表があります。たとえば、表から、GTX580 の理論上のピーク帯域幅は 192.4GB/秒であり、計算スループットは 1581.1GFLOP であることがわかります。

CPU の GFLOPS と GPU の GFLOPS と GFLOPS レートを比較することは、それらの透明な理論上のパフォーマンスであるというのは正しいですか?

私の理解が正しければ、GPU の理論上のピーク GFLOP の数を CPU の対応する数と直接比較できるかどうかを尋ねています。これらの数値を比較する際に考慮すべき点がいくつかあります。

  • 古い GPU は倍精度 (DP) 浮動小数点をサポートせず、単精度 (SP) のみをサポートしていました。

  • DP をサポートする GPU は、SP と比較してパフォーマンスが大幅に低下します。上で引用した GFLOPs の数値は SP の数値です。一方、CPU について引用されている数値は DP のものであることが多く、CPU 上の SP と DP のパフォーマンスの差はほとんどありません。

  • CPU の見積もりは、SIMD (単一の命令、複数のデータ) のベクトル化された命令を使用する場合にのみ達成可能なレートである可能性があり、通常、理論上の最大値に近づく可能性のあるアルゴリズムを作成するのは非常に困難です (アセンブリで作成する必要がある場合もあります)。場合によっては、CPU の見積もりは、さまざまな種類の命令によって利用可能なすべてのコンピューティング リソースの組み合わせに対するものであり、多くの場合、それらすべてを同時に利用できるプログラムを作成することは事実上不可能です。

  • GPU の見積レートは、GPU を飽和させるのに十分な並列作業があり、アルゴリズムが帯域幅に制限されていないことを前提としています。

于 2012-08-12T00:22:59.193 に答える
3

パフォーマンスの好ましい尺度は経過時間です。GFLOP は比較方法として使用できますが、命令セット、コンパイラ コード生成、および FLOP のカウント方法の違いにより、コンパイラとアーキテクチャ間の比較が困難な場合がよくあります。

最善の方法は、アプリケーションのパフォーマンスを計測することです。CUDA コードの場合、起動ごとに発生するすべてのコードの時間を計る必要があります。これには、メモリのコピーと同期が含まれます。

Nsight Visual Studio Edition と Visual Profiler は、各操作の最も正確な測定を提供します。Nsight Visual Studio Edition は、各デバイスの理論上の帯域幅と FLOP 値を提供します。さらに、達成された FLOPs 実験を使用して、単精度と倍精度の両方で FLOP カウントを取得できます。

于 2012-08-15T03:34:00.137 に答える