2011-08-11 16 views
6

いくつかの最適化問題については、CUDAでローカル検索アルゴリズムを並列化します。問題は非常に難しいので、実際に解決できる問題のサイズは非常に小さいです。 私の懸念は、1つのカーネルで実行する予定のスレッドの数がGPUのスピードアップを得るには不十分だということです(すべてのスレッドが合体し、バンク競合、非分岐などがないと仮定しても)。 カーネルが100スレッドで起動されたとします。 GPUを使用して利益を期待するのは妥当ですか?スレッド数が1000の場合はどうなりますか?ケースを分析するためにはどのような追加情報が必要ですか?有効なGPUスレッドの最小数

+0

おそらく100スレッドを持つことで多くの利点はありません - あなたは何千ものスレッドを持っていると、通常はCUDAプログラミングは実用的になります。 –

+0

正確に言えば、同じワープのスレッドが同じことをするということですね。 – AdelNick

+0

あなたが必要とするものを実行するプロトタイプを作成し、それを高速化することについて心配してください。あなたが必要とするものに類似したものがあれば、突っ込んだものを見てください。 – fabrizioM

答えて

7

スレッド100個で十分ではありません。理想的には、少なくともGPU上のマルチプロセッサ(SM)と同じ数のスレッドブロックに分割できるサイズが必要です。そうしないと、プロセッサがアイドル状態のままになります。同じ理由で、各スレッドブロックのスレッド数は32以上でなければなりません。理想的には、ブロックあたり32スレッド(96-512スレッド)の小さな倍数を、可能であればSMあたり複数のブロックを持つべきです。

少なくとも、SMの算術待ち時間をカバーするのに十分なスレッドを用意する必要があります。つまり、Compute Capability 2.0 GPUではSMごとに約10-16ワープ(32スレッドのグループ)が必要です。しかし、それらはすべて同じスレッドブロックから来る必要はありません。たとえば、14台のSMを搭載したTesla M2050 GPUの場合、少なくとも4480スレッドに分割し、少なくとも14ブロックに分割する必要があります。つまり、これより少ないスレッドでもスピードアップが可能です。これは多くの要因によって異なります。たとえば、計算が帯域幅に制限されていて、デバイスのメモリにデータを保持できる場合は、GPUデバイスのメモリ帯域幅がCPUのメモリ帯域幅よりも大きいため、スピードアップが発生する可能性があります。あるいは、もしそれが束縛されており、命令レベルの並列処理(同じスレッドからの独立した命令)が多ければ、待ち時間を隠すために多くのスレッドを必要としません。この後者の点は、GTC 2010のVladimir Volkovの"Better performance at lower occupancy" talkでよく説明されています。

重要なのは、すべてのSMを使用することです:GPUの計算性能や帯域幅をすべて使用していないためです。提供することができます。

+0

詳細な回答と役に立つリンクをありがとうございます。 – AdelNick

+0

@harrism:プログラミングガイドには、タスクを有効にするために使用するスレッドの数についての説明があります – Programmer