2

レジスタの使用に上限 (私の例では 51) を設定すると、制限を無制限にした場合よりも高いレジスタ カーネルを生成できるのはなぜでしょうか。

また、高音域はより高速に見えます (700 を超えると 10us)。

最適化段階のどのフェーズが変更されますか?

4

1 に答える 1

2

実際の CUDA コンパイラとそのステージについてはあまり詳しく説明できませんが、CUDA の実行アーキテクチャに基づく常識的な推論をいくつか紹介します。

最大レジスター番号を設定しない場合、コンパイラーはターゲット・レジスター番号が何であるかを認識せず、使用するレジスターをできるだけ少なくするか、他のヒューリスティックを使用する必要があると想定する必要があります。一般に、スレッドごとのレジスターの使用を最小限に抑えるということは、単一のコア上でより多くのスレッドに対して十分なレジスターがあることを意味し、単一のコア上により多くのスレッド ブロックを常駐させることができるため、使用率を最大化します。これは良いことです。

しかし、最大レジスター使用量を指定すると、コンパイラーはこれが最大値であることを認識し、その最大値までは可能な限り多くのレジスターを使用できると想定します。この理由は、レジスタ占有率が高すぎて、さらに別のスレッド ブロックに十分なレジスタがないポイントが、実際にはハード リミットであるためです。1 つのスレッドが 65 個のレジスタを使用すると、さらに別のブロックに十分なレジスタがない場合、65 個を使用しない限り、63 個または 64 個のレジスタを使用するかどうかは問題ではありません。したがって、コンパイラは as を使用しようとします。可能な限り多くのレジスタ (もちろん最大まで) を使用することをお勧めします。これは望ましいことです。なぜなら、レジスタは取得できる最速のメモリ タイプだからです。しかし、この推論は、コンパイラがこのハード リミットを認識している場合 (つまり、コンパイラにそのことを伝えた場合) にのみ適用できます。

そして、48 個のレジスターを持つバージョンが 47 個のレジスターを持つバージョンよりも高速である理由は、おそらくより多くのレジスターを使用するためです。使用可能なレジスタが十分にない場合、データをローカル メモリにスワップ アウトするか、他のレジスタから一時レジスタに繰り返しコピーする必要があります。

最終的に、これはすべて完全に理にかなっています。なぜなら、(最適なレジスターの最大値を設定することによって) コンパイラーに提供する情報が多いほど、コンパイラーはより適切に最適化でき、結果のコードがより効率的になるはずだからです。特に GPU コンピューティングでは、通常、カーネルを実際のハードウェアとそのリソースにできる限り最適に調整することが望ましいです。

于 2013-07-02T11:06:39.097 に答える