2011-07-17 9 views
0

私はこのデータベース検索アプリケーションをCUDAで高速化しようとしています。私はCUDAと並行してコアアルゴリズムを実行しています。ブロック/グリッドとスレッド/ブロックを活用するには?

1つのテストでは、グリッドあたり500ブロックとブロックあたり100スレッドのサイズ5000のデジタルシーケンスにわたってアルゴリズムを並列に実行し、およそ500ミリ秒のランタイムで復帰しました。

次に、デジタルシーケンスのサイズを8192に増やしました.1ブロックあたり128ブロック、ブロックあたり64スレッドでした。アルゴリズムを実行するのに350 msという結果が返ってきました。

これは、使用されたブロックとスレッドの数と、その関連性がパフォーマンスに影響することを示します。

私の質問はブロック/グリッドとスレッド/ブロックの数を決定する方法ですか?

私は標準のデバイスクエリプログラムからの私のGPUのスペックを持っている以下: enter image description here

答えて

2

それはあなたの特定のカーネルに依存しているため、あなたはそれをテストする必要があります。 1つの目的は、ブロックあたりのスレッド数をワープ内のスレッド数の倍数にすることです。その後、各SMの高い占有を目指すことができますが、それは必ずしも高性能と同義ではありません。時には占有率が低いほどパフォーマンスが向上することが示されています。メモリバインドされたカーネルは通常、メモリ待ち時間を隠すために占有率が高いことからより多くの利益を得ます。あまり束縛されていないカーネルを計算する。さまざまな設定をテストするのが最善の策です。

+1

また、マルチプロセッサごとにバランスのとれた作業量を確保するようにしてください。スレッドのブロック数をおおよそマルチプロセッサ数の倍数にしてください。これは小さなグリッドにとってより重要です。非常に大きなグリッドの場合、マルチプロセッサあたり1ブロックの違いはそれほど重要ではありません。 – harrism

+1

@ seljuq70 fp32操作でのfermiアーキテクチャの適切な比率は、ECCオフの場合は4.5、ECCの場合は – fabrizioM

+0

です。誰かがそれをテストしたか、NVIDIAがどこかに言いました。いずれにしても分かります – jmsu

関連する問題