ライブラリでは、いくつかの CUDA カーネルへの呼び出しを使用します。もちろん最高のパフォーマンスを発揮したい。ユーザーがライブラリを使用する方法は少し異なります。
ブロック/スレッドの数がこれに大きく影響します。
最高のパフォーマンスを得るためにブロック/スレッドを選択する方法に関するルールはありますか?
たとえば(単なる質問です)、ブロックを高く、スレッドを低く選択するのが最善ですか? それとも逆?または、GetDeviceProperties() の値を使用するのが最善ですか?
ライブラリでは、いくつかの CUDA カーネルへの呼び出しを使用します。もちろん最高のパフォーマンスを発揮したい。ユーザーがライブラリを使用する方法は少し異なります。
ブロック/スレッドの数がこれに大きく影響します。
最高のパフォーマンスを得るためにブロック/スレッドを選択する方法に関するルールはありますか?
たとえば(単なる質問です)、ブロックを高く、スレッドを低く選択するのが最善ですか? それとも逆?または、GetDeviceProperties() の値を使用するのが最善ですか?
NVIDIA が提供する依存関係計算機.xls を使用して、[xls のスレッドとブロックの値を変更してみる必要があります] 最適な構成を選択できます。これにより、最高の占有率を達成でき、最高のパフォーマンスが得られます。
できれば、1 つのブロックに少なくとも 1 つの完全なスレッド ワープが必要です。そうしないと、利用可能な処理能力を十分に活用できません。また、通常、ブロック内のスレッドのワープサイズ数で割り切れる数が必要です。
ブロックで使用するスレッドの総数は、リソースの使用状況によって異なります。原則として大人数での入居を目指します。制限は、使用可能な共有メモリとレジスタによって設定されます。多くの共有メモリやレジスタを使用すると、達成可能な最大占有率が低下します。次に、達成された占有率と理論上の占有率の比率が最大になり、もちろん総占有率自体も可能な限り 100% に近づくスイート スポットが見つかるまで、ブロックごとのスレッド数をプロファイリングして微調整することは理にかなっています。
経験則として、適切な占有率を維持しながら、ブロックあたりのスレッド数を最大化する必要があります。プロファイリング ステップで、可能なブロック/スレッド番号の組み合わせのセットを自動的に反復処理して極値の組み合わせを見つけることは、まったく理にかなっています。