1

私のプログラムのプロファイリング結果によると、理論的に達成された最大占有率は 50% であり、リミッターはレジスターです。CUDA コードでレジスタの数を最小限に抑えるための一般的な手順は何ですか? プロファイリングの結果を見ると、レジスタの数が、コード内の (スレッドごとに) 32 ビットおよび 16 ビットの変数の数よりもはるかに多いことが示されています。潜在的な理由は何ですか?

さらに、「maxregcount」を 32 (32 * 2048 (SMX あたりの最大スレッド数) = 65536 (SMX あたりの最大レジスタ数) に設定すると、占有制限の問題は解決しますが、速度はあまり向上しません。「maxregcount」は最適化を試みますか?より多くのコードを使用して、レジスターの使用に無駄がないようにしますか? それとも、レジスターのスピルのために L1 キャッシュまたはローカル メモリを選択するだけですか?

4

2 に答える 2

3

maxrregcount により、コンパイラはレジスタの使用を再編成しますが、常にレジスタ カウントを低く抑えようとします。課された制限を下回ることができない場合、L1、L2、および DRAM に単純に流出します。こぼれたローカル変数をフェッチするために DRAM に移動する必要がある場合、明示的なメモリ フェッチが締め出されたり、カーネルが「レイテンシ バウンド」になる可能性があります。戻ってくる。

無制限のレジスターと 32 の間の何かを選択する方が運が良いかもしれません。多くの場合、上記の理由により、占有率が 100% のスピルよりも多少のスピルと完全な占有率に満たないことがよくあります。

補足として、プログラミングガイドで読むことができるlaunch_boundsを使用して、特定のカーネル (ファイル全体ではなく) の regs を制限できます。

于 2013-11-13T15:49:00.273 に答える