Skip to content
Go back

GPU実践メモ

· Updated:

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へコピーされる
      • 各シェーダステージに必要な分だけ
    • レジスタからあふれる分はローカルメモリに置かれる

汎用

  • [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を使うのは避ける

メッシュシェーダ

サンプラーフィードバック

NVIDIA