通常、スレッドごとのレジスタ プレッシャーを下げてワープの占有率を高め、ワープ レベル マルチスレッド (TLP) によってレイテンシを隠す機会を増やすことをお勧めします。レジスタ プレッシャーを減らすには、スレッドごとのローカル メモリまたはスレッド ブロックごとの共有メモリの使用量を増やします。CUDA nvcc コンパイラは、スレッドごとに使用するレジスタを少なくすることも強制できます。このアプローチは、算術レイテンシーが良好なワークロード、つまりメモリーの r/w アクセス要求に対する ALU 操作の比率が高いワークロードに役立ちます。ただし、計算がほとんど行われず、メモリ アクセスがより頻繁に行われるレイテンシ クリティカルなアプリケーションの場合、このアプローチは実際にはパフォーマンスを低下させる傾向があります。
このようなレイテンシが重要なアプリケーションの場合、オンチップ レジスタまたは共有メモリにできるだけ多くのデータを取り込み、グローバル メモリからの次のデータ チャンクで置き換える前に、できるだけ多くのデータを使用する方が理にかなっています。もちろん、レジスタの圧力を高めることで、ワープの占有率は低下しますが、高速なオンチップ レジスタを使用してオフチップ メモリのレイテンシを隠しています。スレッドごとのレジスタ使用量を増やす方法は、ループをアンロールするか、スレッドごとにより多くの出力データを計算して ILP を増やすことです (これは、基本的に、より多くの入力に対して同じ作業を行うことで ILP を増やします)。このアプローチは、基本的に Volkov (Better Performance at Lower Occupancy) によって提案されました。
現在、nvcc コンパイラ ドライバには maxrregcount と呼ばれるコマンド ライン オプションがあり、スレッドごとのレジスタの使用法を変更できます。このオプションを使用すると、コンパイラーはスレッドごとのレジスター使用量を強制的に減らすことができますが、強制的に増やすことはできません。スレッドごとのレジスタ使用量を増やしたい場合がありますが、ループ境界はデータに依存し、動的であるため、カーネル内でループを展開できません。これまでのところ、いくつかのトリックを試してきましたが、スレッドごとのレジスタの使用量を増やす方法についてのアイデアが不足しています。単一の CUDA スレッドのレジスタ使用量を増やす方法を提案できる人はいますか?