3

ここで質問するのは初めてですので、よろしくお願いします。無知をお許しください。また、CUDAプログラミングを始めたばかりです。

基本的に、私はたくさんのポイントを持っています、そして私はすべてのペアワイズ距離を計算したいと思います。現在、私のカーネル関数は1つのポイントを保持し、他のすべてのポイントを(グローバルメモリから)繰り返し読み取り、計算を実行します。これが私の混乱のいくつかです:

  • 448コアのTeslaM2050を使用しています。しかし、私の現在の並列バージョン(kernel <<< 128,16,16 >>>)は、はるかに高い並列処理を実現しています(kernel <<< 1,1,1 >>>よりも約600倍高速です)。マルチスレッドの問題またはパイプラインの問題が原因である可能性がありますか、それとも実際には同じことを示していますか?

  • さらにパフォーマンスを向上させたい。したがって、共有メモリを使用して、各マルチプロセッシングブロックのいくつかの入力ポイントを保持することを考えます。しかし、新しいコードは同じくらい高速です。考えられる原因は何ですか?設定したスレッドが多すぎるという事実に関連しているのでしょうか?

  • または、コードにifステートメントがあるためですか?問題は、私は短い距離だけを考慮して数えるので、(dist <200の場合)のようなステートメントがあります。これについてどれくらい心配する必要がありますか?

百万ありがとう!置き場

4

2 に答える 2

4

Mark Harrisは、CUDAの最適化について非常に優れたプレゼンテーションを行っています:CUDAでの並列削減の最適化

アルゴリズムの最適化アドレス指定の変更、 11.84倍の高速化を組み合わせた
アルゴリズムカスケード! コードの最適化 ループ展開 2.54倍の高速化、組み合わせ



サイズの仮定を実装する前にコードのレイアウトを知る必要があるという理由だけでなく、最適化する最後のことになるものの、余分な操作ステートメントがあると、実際に問題が発生します。

あなたが取り組んでいる問題は、有名な多体問題のように聞こえます。CUDAを使用した高速N体シミュレーションを参照してください。

ペアワイズ計算を回避できる場合、たとえば、要素が遠すぎて相互に影響を及ぼさない場合は、パフォーマンスをさらに向上させることができます。これは、ペアワイズコストであろうと、ばねを使用した物理シミュレーションであろうと、幾何学的に表現できるすべての関係に当てはまります。私のお気に入りの方法は、グリッドをボックスに分割し、各要素を分割してボックスに入れ、隣接するボックス間のペアワイズ関係のみを評価することです。これはO(n * m)と呼ぶことができます。

于 2012-10-25T03:31:53.323 に答える
3

(1)GPUは、コアよりもはるかに多くのスレッドを並列で実行します。これは、各コアがパイプライン化されているためです。コンピューティング機能2.0(Fermi)アーキテクチャでは、操作に約20サイクルかかります。したがって、クロックサイクルごとに、コアは新しい操作の作業を開始し、1つの操作の終了結果を返し、他のすべての(約18)操作をもう1ステップ完了に向けて移動します。したがって、GPUを飽和させるには、448*20スレッドのようなものが必要になる場合があります。

(2)値がL1およびL2キャッシュにキャッシュされていることが原因である可能性があります。

if(3)条件内で実行している作業の量によって異なります。GPUはif、条件がそれらのスレッドの1つだけに当てはまる場合でも、内部のすべてのコードを介してワープで32スレッドすべてを実行する必要があります。カーネルの他の部分と比較して条件付きに多くのコードがあり、比較的ビュースレッドがそのコードパスを通過する場合、計算スループットが低くなる可能性があります。

于 2012-10-25T03:19:57.000 に答える