1

私が実装しているアルゴリズムには、並行して実行する必要がある多くのことがあります。私の質問は、共有メモリを使用しない場合、スレッド/ブロックの少ないブロックを増やすか、パフォーマンスのためにブロックの少ないスレッド/ブロックを増やすかを選択して、スレッドの合計が必要な並列処理の数になるようにすることです。する?

4

1 に答える 1

2

「セット数」が小さい数であるか、この質問をしないと思います。より多くの並列処理を公開しようとすると、時間を費やす価値があるかもしれません。

CUDA GPU は実行アクティビティをグループ化し、結果のメモリ アクセスを 32 スレッドのワープにします。したがって、少なくとも、スレッドブロックごとに少なくとも 1 つのワープを作成することから始めます。

次に、少なくとも GPU にある SM と同じ数のスレッドブロックを作成する必要があります。SM が 4 つある場合、32 を超える次のスケーリング増分は、それぞれ 32 スレッドの 4 つのスレッドブロックを作成することになります。

この架空の例で 128 を超える「数」がある場合は、スレッドブロックごとのワープとスレッドブロックの両方を増やしたいと思うでしょう。仮想の 4-SM GPU よりも大きな GPU でコードをスケールアップできるようになる数 (おそらく 16 程度) に達するまで、スレッドブロックから始めることができます。しかし、1 つの SM で開くことができるスレッドブロックの数には制限があるため、スレッドブロックが 16 個程度になるとすぐに、スレッドブロックあたりのワープ数を 1 を超えて (つまり、32 スレッドを超えて) 増やしたいと思うでしょう。

小さな問題に対するこれらの戦略により、問題が大きくなったときに GPU 上のすべてのハードウェアを可能な限り迅速に利用できるようになりますが、問題が十分に大きい場合 (例: スレッドブロックごとに複数のワープ) には、レイテンシを隠す機会が依然としてあります。 、または SM ごとに複数のスレッドブロック常駐)。

于 2013-11-14T20:22:08.970 に答える