2012-02-19 9 views
9

を呼び出すとき:パフォーマンスペナルティ私は次のような++ CUDAカーネル呼び出しを実行するオーバーヘッドは、C/Cであるものを思ったんだけど、CUDAカーネル

somekernel1<<<blocks,threads>>>(args); 
somekernel2<<<blocks,threads>>>(args); 
somekernel3<<<blocks,threads>>>(args); 

ので、私はこれを求めていた理由があります私がビルドしているアプリケーションは現在、いくつかのカーネルに繰り返し呼び出しを行います(メモリ間の再読み込みや呼び出しの間にデバイスに書き込まれることはありません)、これらのカーネル呼び出しを単一のカーネル呼び出し(somekernel1-3がデバイス機能になる)パフォーマンスに意味のある違いがあります。

答えて

13

ランタイムAPIを使用したカーネル起動のホスト側オーバーヘッドは、WDDM以外のWindowsプラットフォームでは約15-30マイクロ秒です。私が使用していないWDDMプラットフォームでは、これははるかに高くなる可能性があることを理解しています。さらに、ドライバの一括操作で複数の操作を行うことでコストを償却しようとするバッチ処理メカニズムがあります。

一般的に、別々のカーネルでアルゴリズムが許す単一のカーネルで行われる複数のデータ操作を「融合」するとパフォーマンスが向上します。 GPUはピークメモリ帯域幅よりもはるかに高い算術ピーク性能を持つため、メモリトランザクション(およびカーネルの「セットアップコード」)ごとに実行できるFLOPが多いほど、カーネルのパフォーマンスは向上します。一方、完全に異種の操作を単一のコードに詰め込もうとする「スイス軍ナイフ」スタイルのカーネルを作成しようとすると、レジスタの圧力が上がり、L1、定数メモリとテクスチャキャッシュ。

どちらの方法を選択するかは、コード/アルゴリズムの性質によって実際に導かれるべきです。私は、すべての状況に適用できるこの質問に対する単一の「正しい」答えがあるとは思わない。

+0

スイス軍ナイフのアプローチは、これらのカーネルをプロジェクト間で共有することを避けようとしています。応答してくれてありがとう、私はちょうど私が複数のcuda呼び出しを行うときに気づいていなかったいくつかの狂気のパフォーマンスの問題はなかったことを確認したいと思った。 – NothingMore

+1

メモ:WDDMでは、Tesla GPUを使用している場合は、Tesla Compute Cluster(TCC)ドライバを使用して、XPやLinuxなどのWDDM以外のプラットフォームでパフォーマンスを向上させることができます。元の質問には、カーネルを組み合わせることで必要なPCIエクスプレスの転送を減らすことができれば、それが価値があるかもしれないことを強調したいと思います。そうでない場合は、Kernel1の計算とKernel2などのデータのGPUへの転送が重複していることを確認してください。 – harrism

+0

talonmies Windows以外のプラットフォームについて教えてください。 winXP?私はWDDMのペナルティが大変なので非常に興味があり、私はLinuxには参加できません。 Win7 x64を酷く使用し、x64プラットフォームが必要(RAMの問題) – Dredok

1

Windows上でVisual Studio Proを使用している場合は、NVidiaのParallel NSightを使用してテストアプリケーションを実行することをお勧めします。メソッド呼び出しから実際の実行までのタイムスタンプを教えてくれると思います。しかし、カーネルが長く続く場合は無視されます。

+0

Windows(RHEL 6.0、Tesla C2075)では実行していません。 – NothingMore

関連する問題