AMD
- GCNでは64個ずつ、RDNAでは32個ずつ処理すると丁度良い[Hodes and Dunn 2017Hodes, S. and Dunn, A. 2017. Deep Dive: Asynchronous Compute. Game Developers Conference. https://gpuopen.com/download/GDC2017-Asynchronous-Compute-Deep-Dive.pdf.]
- GCNはVega(PS4世代)、RNAはNavi(PS5世代)
- VGPRの使用率を下げる[Hodes et al. 2016Hodes, S., Baker, D. and Oldcorn, D. 2016. Right on Queue. Game Developers Conference. https://gpuopen.com/download/GDC_2016_D3D12_Right_On_Queue_final.pdf.]
- wavefrontはSIMDを共有しているので、VGPRを使いすぎると並列性に影響が出てくる
- Root Signatureは全体を小さくして、変更頻度の高いものを最初の方に置く[Hodes et al. 2016Hodes, S., Baker, D. and Oldcorn, D. 2016. Right on Queue. Game Developers Conference. https://gpuopen.com/download/GDC_2016_D3D12_Right_On_Queue_final.pdf.]
- データは起動時にSGPRへコピーされる
- 各シェーダステージに必要な分だけ
- レジスタからあふれる分はローカルメモリに置かれる
- データは起動時にSGPRへコピーされる
汎用
- [GPUOpen 20232023. RDNA Performance Guide. GPUOpen. https://gpuopen.com/learn/rdna-performance-guide/.]
- 逆三角関数(atanやacosなど)は100サイクル以上かかるので避けたほうが良い
- 超越関数(sin,cos,sqrt,log,rcp)は最小限にする
- これらは1/4レートで実行される
- RDNAだと1/4レートでco-executeされ得る
- tan関数は超越関数3つ分になるので注意
- FidelityFXに近似計算ライブラリがあるので、それを使うと良い
- AGSを介したWave間命令をサポートしている
- prefix sumとかdownsamplingとかfilteringとかのreduction problemsに有効
- VGPR pressureをへらすにはshader intrinsicsを使うと良い
- FP16を使うと割当数が減らせる
- readFirstLaneでスカラ化できる
- 単一チャンネルをサンプリングするなら、Gather4を使うとフェッチが早くなる
- 帯域をへらすことにはならないが、テクスチャユニットのトラフィック量が減るし、キャッシュヒット率が良くなる
- アドレッシングに必要なVGPR数が8から2に減る
コンピュートシェーダ
- [GPUOpen 20232023. RDNA Performance Guide. GPUOpen. https://gpuopen.com/learn/rdna-performance-guide/.]
- GCNでは64、RDNAでは32のシェーダスレッドを1グループとして実行する
- Wave内の未使用スレッドはシェーダ実行時にmasked outされる
- 全世代のGPUで最適なパフォーマンスを得るには、workgroupの大きさを64の倍数にする
- 帯域を最大化するには、Waveあたりcoalescedな256バイトのブロックに書き込む
- 8x8スレッドグループは8x8ブロックのピクセルに書き込むようにする
- スレッドグループの共有メモリはLDSに置かれる
- メモリはバンクされ、32バンクある
- 各バンクは32ビット
- バンクのコンフリクトは命令レイテンシの増加になる
- バンクのコンフリクトをへらすには、SoA形式にするかpaddingするかをおすすめ
- フルスクリーンパスにコンピュートシェーダを使う
- キャッシュヒット率が増加したり、本来不要なエッジの処理がなかったりするので、full screen quadを使うより早くなる
- 処理負荷が乱高下する場合にはピクセルシェーダより早くなる傾向がある
- ピクセルシェーダは他のwaveの出力でブロックされたりする
頂点シェーダ
- [GPUOpen 20232023. RDNA Performance Guide. GPUOpen. https://gpuopen.com/learn/rdna-performance-guide/.]
- ジオメトリシェーダでカリングしたり、距離によってカリングしたりするのはコストが高い
- 頂点シェーダでプリミティブをカリングするには、いずれかの頂点の位置をNaNにする
ピクセルシェーダ
- [GPUOpen 20232023. RDNA Performance Guide. GPUOpen. https://gpuopen.com/learn/rdna-performance-guide/.]
- 他のパスがあるときに、長く実行するシェーダではdiscardするのを避ける
- Z prepassでdiscardされたピクセルをスキップするには、深度テストのequalを使う
- レンダーターゲットの数は少なくする
- RGBA8を2つ使うより、RGBA16を1つ使う方が良い
- ただし、RGB32を使うのは避ける
- 他のパスがあるときに、長く実行するシェーダではdiscardするのを避ける
メッシュシェーダ
- [GPUOpen 20232023. RDNA Performance Guide. GPUOpen. https://gpuopen.com/learn/rdna-performance-guide/.]
サンプラーフィードバック
- [GPUOpen 20232023. RDNA Performance Guide. GPUOpen. https://gpuopen.com/learn/rdna-performance-guide/.]
NVIDIA
- TODO [Hodes and Dunn 2017Hodes, S. and Dunn, A. 2017. Deep Dive: Asynchronous Compute. Game Developers Conference. https://gpuopen.com/download/GDC2017-Asynchronous-Compute-Deep-Dive.pdf.]