Diese Präsentation wurde erfolgreich gemeldet.
Wir verwenden Ihre LinkedIn Profilangaben und Informationen zu Ihren Aktivitäten, um Anzeigen zu personalisieren und Ihnen relevantere Inhalte anzuzeigen. Sie können Ihre Anzeigeneinstellungen jederzeit ändern.
GPU最適化入門
株式会社ソニー・インタラクティブエンタテインメント
LSI開発部2課 小口貴弘
takahiro.koguchi@sony.com
http://cedec.cesa.or.jp/2016/session/ENG/6483.h...
質問:
2
グラフィックス性能の悩みは
ありませんか?
たとえば、、、
・敵が多くなるとフレーム落ち
・エフェクトを入れたら重すぎる
解決のヒントを!
概要
• 目的:GPU最適化入門の紹介
– グラフィックスプログラムがどんなものか、少し知っている方向け
– 現在発売中の“Computer Graphics Gems JP 2015,株式会社ボーンデジタル”に
詳細有
– →今日はわかりやす...
説明の流れ
1.概要・前置き
2.GPUの特性
3.GPU構成・進化
4.最適化と性能
5.まとめ
最適化の流れ
Step A) 最適化対象フレームの特定
Step B) CPU/GPU負荷測定
Step C) GPUボトルネック解析
Step...
前置き
用語定義
• GPU: グラフィックス処理を高速に行うハードウェア
(今回はHW T&L以前のGPUの呼び名が付くまえも含む)
• ほか、CG-ARTS協会の”コンピュータグラフィックス”に準拠
レンダリング手法の参考
• 和歌山大学 ...
始めに:リアルタイムレンダリング処理
映画、CMなど
フレーム描画時間が短い必要がなく、
質優先
ゲーム、シミュレータなど
フレーム描画時間が短い必要があり、
速度優先
→短い決まった時間でレンダリングした画像を連続して表示する処理。
たとえば...
動機:最近のグラフィックスで求められること
1) エンジンや高レベルのライブラリで、実際のGPU動作が見えにくくなった
→ GPUの振る舞いを知ると、抽象度の高い処理でも効率よくGPUを使える
2) DirectX12やMetal, Vulka...
GPUの基本
• GPU動作はシンプル
1. アセットデータと命令群を用意したうえで、
2. CPUから起動すると、
3. メモリにフレームバッファが生成される
– アセットデータはジオメトリ・テクスチャ・アニメーション・シェー
ダプログラムな...
GPUアーキテクチャの特性
1.レンダリング理論
2.長いパイプライン処理
3.並列性
GPUを知るうえで欠かせない3つの特徴
それぞれ説明します
9
1) レンダリング理論
[1986 Kajiya] レンダリング方程式
すべての位置と向きで使え、乗算と加算で構成可能なエネルギー保存式
引用元:Realistic Image Synthesis Using Photon Mapping
10
積分範囲は半球
入射光反射光
減衰
Ω
x
1) レンダリング理論
出射光 発光 反射光
BRDF:反射近似関数 入射光 減衰
概念的にGPUはこの式を近似して実装している
※近似は主に複数回反射光の省略によるもの
[1986 Kajiya] ...
2) 長いパイプライン処理
パイプライン実装は1回反射(直接光表現)が主だが、
近年は2回以降反射の間接光表現がシェーダプログラム・マルチパスで採用
・ジオメトリ
・テクスチャ
・アニメーション
などアセットデータは
MAYAなどのDCCツール...
2) 長いパイプライン処理(各部位特徴)
フォーマット変換付
メモリ書き出し
※別名:CBDB/Merger
各処理を加速するラスタライザ・テクスチャユニット・シェーダ・ROPはGPU特有の機能
ハードウェアで最適な精度で処理しつつ、高速処理を...
3)並列性
描画実行単位が独立性の高いデータ構成
→GPU描画パイプラインは各部位で並列化された実装
そのためCPUに比べて格段に高速な処理
※たとえば、シェーダパイプが1000本あれば、同時に1000頂点、または1000ピクセルを処理できるこ...
GPUアーキテクチャの特性 まとめ
1.レンダリング理論
2.長いパイプライン処理
3.並列性
以上がGPUの3つの特徴です。
レンダリング理論をもとにした長いパイプライン処理があるGPUは、
各所で並列化されて高速に処理されます。
このGPU...
GPU構成・進化の時系列表
2000.3.4 2006.11.11 2013.11.151994.12.3
構成の進化とともにプログラム自由度が上昇
同時期に半導体資源が増加し、計算能力も上昇
固定パイプライン 固定シェーダ ユニファイドシェー...
最適化と性能
GPU概要を抑えたところで、具体例を交えた最適化手法へ。
要約:GPUの最適化はGPUパイプラインを円滑に流すことに集約できる
ポイント1) GPUの基本構造は長大なパイプライン
各所の処理を滞りなく進め、無駄を省き、GPU全体の...
具体的な最適化の流れ
GPUの処理を停滞させないため、ここでは以下の要領で進めます。
最適化の流れ
Step A) 最適化対象フレームの特定
Step B) CPU/GPU負荷測定
Step C) GPUボトルネック解析
Step D) 最適化...
レンダリング処理の例
19
レンダリング処理の例
スキニング
アニメーション
物理衝突判定
テクスチャ
マッピング
法線マッピングインスタンシング
マルチサンプル
・
テンポラルフィルタ
SSAO
ポストエフェクト
グロウ
ポストエフェクト
フォンライティング
シーン描画...
レンダリング処理の例
21
Step A) 最適化対象フレームの特定
時間
描画
フレーム
番号1 2 3
状況により負荷が変わる
たとえば、
・大量計算のタイミング
・視野に多数オブジェクト
など
処理時間の総和が
1/60秒(≅16.7ms)であれば60fpsで動作
...
Step B) CPU/GPU負荷測定
問題のあるフレームを見つけたら、
ボトルネックがCPUかGPUか、を切り分ける。
というのも、計測した負荷には、CPU実行時間とGPU実行
時間が混在しているためで、これを切り分ける。
判定基準としては、...
Step C) GPUボトルネック解析(バッチ説明)
時間
基本的に各処理はバッチと呼ばれるGPU起動単位で逐次実行される。バッチ実行時間の総和がフレーム時間
ク
リ
ア
ア
ニ
メ
ー
シ
ョ
ン
G
バ
ッ
フ
ァ
作
成
ポ
ス
ト
エ
...
Step C) GPUボトルネック解析(バッチ計測)
main()
{
initialize(); //初期化処理関数
for(flag!=1){ //描画ループ
update(); //更新処理関数
//バッチ1:クリア処理
BeginEve...
Step D) 最適化:実測ベース最適化
・バッチの実測データをもとにボトルネック部位を解析します。
・GPUはパイプラインが長いため、どこかが詰まると、すべてが滞留してしまう。
再掲:GPU 処理フロー
26
どこがボトルネックか?
まずはつ...
Step D) 最適化:実測ベース最適化
・バッチの実測データをもとにボトルネック部位を解析します。
・GPUはパイプラインが長いため、どこかが詰まると、すべてが滞留してしまう。
再掲:GPU 処理フロー
27
どこがボトルネックか?
まずはつ...
ボトルネック解析フローチャート
解析の目安フローチャート。
プログラムの一部を変更して
負荷の部位を特定します。
赤はシェーダ変更、緑はテクスチ
ャ変更、青はそれ以外のブロック
の操作です。
この表での"テクスチャ"は"バッフ
ァ"形式の指定も...
ボトルネック解析フローチャート
A)シェーダを単純にして速くなる?
光学計算のシェーダを何もせずに定数
出力だけをするように書き換え
29
ボトルネック解析フローチャート
B)テクスチャ・バッファサイズを1x1に
して速くなる?
負荷が軽くなればテクスチャ読み込みの
ボトルネック。そうでなければ、使って
いるシェーダによって分岐を変化
※詳細を実例を交えて後程紹介
シェーダがボトル...
ボトルネック解析フローチャート
D)ROPのカラーマスクをして速くなる?
ピクセル出力を止めることによって、速くなら
なければ、ピクセルシェーダがボトルネック
シェーダがボトルネックであれば、
シェーダコードを軽減
31
ボトルネック解析フローチャート
E)メモリとROPどちらが高い負荷?
デプステストをやめてみて、速くなったら
ROPのボトルネック。
そうでなければメモリがボトルネック
メモリがボトルネックであれば、フォー
マット軽減やアクセスパタン改善でメモ...
ボトルネック解析フローチャート
C)ビューポートを小さくして速くなる?
1920x1080の解像度を、640x480に
33
ボトルネック解析フローチャート
頂点アトリビュートがボトルネックであれば
頂点アトリビュートを圧縮、フォーマット軽減等で軽量化
F)頂点アトリビュートを削減して速くなる?
頂点シェーダ入出力のテクスチャ座標などを切
って、位置だけの出力にしてみ...
ボトルネック解析フローチャート
テッセレータがボトルネックであれば
頂点分割数を減らす等の負荷軽減対策
他、ここでは述べられていな
いそれ以外のボトルネック。
同期関係や頂点数削減等の
対策など。G)テッセレーション分割数を下げて速くなる?
テ...
Step D) 理論ベース最適化 #1
• ここまででバッチ中のGPU負荷部を大まかに特定できた!
– 次に、問題部分の性能を改善しよう
• どのように問題部分の負荷を減らす改善をすればいいのか?
– 単純にはプログラムの無駄をなくしたり、リソ...
GPUの特殊な加速機能:頂点キャッシュ
有限数内で頂点シェーダ処理の結果を使いまわす加速機構
これがなければ頂点数分頂点シェーダが起動するところ、
共有している頂点でキャッシュ上にあるものはシェーダ処理を省略可能!
37
具体的に三角形単位で見...
GPUの特殊な加速機能:頂点キャッシュ
38
A B
C E F
D
A B
C D
triStripツールなどで、アセットの頂点順を調整可能
頂点インデックスに
GPUに都合のいい並び
1と2の三角形で6頂点
あるところ、2つ共有
した頂点処...
Step D) 最適化:理論ベース最適化 #2
加速機能のほか、効率的に負荷を減らすもう一つの戦略
→アクセスパタンの工夫等のGPU特性を活かす改善
局所性をなるべく保つ工夫をすることで並列動作・キャッシュ動作効率を改善する
39被写界深度(D...
問題:ぼかし画像処理でコンピュートシェーダが遅い
40
DOF
9x9texelのフィルターサイズの画像処理で10.0ms以上かかってしまう問題に遭遇
(60fpsのためには16.7ms内に納めなくてはならないのに!)
※DOFで焦点の合ってい...
どんな処理をしているのか?:ぼかし処理概要(1/2)
1)水平方向ぼかし処理:各スレッドが横長のサンプルをして平均色を計算
まずは水平方向9pixelでぼかし処理。横ににじんだ結果にする
各点で同じ処理。
1080
pixel
1920pixe...
スレッド0
スレッド1
スレッド2
スレッド1079
ブラー処理概要(2/2)
2)垂直方向ぼかし処理:各スレッドが縦長のサンプルをして平均色を計算
次に、水平方向ぼかし結果で処理。
これで本来9x9texelのサンプルを、縦一列9texelと...
この場合のボトルネック解析
ボトルネック解析を行うと、
テクスチャ読み込みのボトルネック
フレームバッファを参照した画像処理なので、
圧縮テクスチャにしたり、フォーマット変更は
なるべくしたくない。
→キャッシュアクセスを改善してみる
43
スレッド
0
スレッド
1
スレッド
2
スレッド
“改善”ブラー手法
2段階に分けず、9x9 texel を一度に読み込みするようにしてみる
各ピクセルで一気に9x9texelのサンプルを行うと0.9msに高速化。
論理的には、先ほどよりも8...
シェーダ実行単位に合わせたアクセスパタン
メモリからGPUのキャッシュにデータを乗せる際、矩形で参照。
たとえば、キャッシュラインサイズが64BでR8G8B8A8(4Byte/texel)のテクスチャを参照する場合には4x4の領域を参照する
→...
Step D) 理論ベース最適化 まとめ
#1 ) GPU負荷軽減加速機能の利用
• 頂点キャッシュなど
• 複雑だが、GPU最適化の妙がつまっていて面白い
#2 ) GPU特性を活かす工夫
– GPU実行単位をキャッシュに当てやすくし、局所性...
参考1:GPU仕様から最大性能の見積もり
※60fpsの場合の例
頂点処理ユニット(フロントエンド・セットアップ・ラスタライザ)
• 頂点処理ユニット4つでGPUクロックが1GHzなら、
頂点能力は4*1GHz = 4G 頂点生成毎秒
• フレ...
参考2:プログラムのリソースから演算量(負荷)見積もり
※60fpsの場合の例
レンダーターゲットメモリバンド幅
• 1920x1080 R8G8B8A8のカラーバッファ、法線バッファ、AOバッファ、拡散反射光バ
ッファ、鏡面反射光バッファ、ア...
Step E) 目標性能に達するまで繰り返す
最適化の流れ
Step A) 最適化対象フレームの特定
Step B) CPU/GPU負荷測定
Step C) GPUボトルネック解析
Step D) 最適化
Step E) 目標性能に達するまで繰...
参考:計測ツール
各バッチ処理のシェーダパイプの使用頻度、実行効率がわかる
他、バッチ中の詳細なブロックごとの負荷信号を表示可能
プログラムを変更せずとも、どこで処理が滞っているのかがわかる
このシーンをキャプチャ
DirectXならPIX
A...
まとめ
51
GPU最適化まとめ
【性能上昇のために積極的にする事】
大量の演算器で並列計算
• 頂点・ピクセル処理のデータ独立性
• 大規模な演算を高速にできる
専用演算機器・加速機能の利用と、特性に合
わせた最適化
• 重複する頂点処理を省略可能な頂点キ...
最後に
今後もGPUは進化と変化が予想される
しかし、最適化の基本の考え方は共通
・完全な解決ではなく、有限時間内で大きな問題から対処するトリアージ
・GPU最適化を行うことで、描画に余裕が生まれる
・結果、リアルタイムで表現できることの幅が広...
ご清聴ありがとうございました
54
Q&A
• ご質問ありますか?
• 補足
– プレイステーションは抽象化層が薄く、最適化がたくさんできますよ!
55
Nächste SlideShare
Wird geladen in …5
×

GPU最適化入門

10.299 Aufrufe

Veröffentlicht am

CEDEC2016で発表した内容です。
Cedilの資料ではPPTファイルできれいな画像でアニメーション効果などが確認できます。ここでは一部画像がにじんでしまっています。

Veröffentlicht in: Ingenieurwesen
  • Als Erste(r) kommentieren

GPU最適化入門

  1. 1. GPU最適化入門 株式会社ソニー・インタラクティブエンタテインメント LSI開発部2課 小口貴弘 takahiro.koguchi@sony.com http://cedec.cesa.or.jp/2016/session/ENG/6483.html 1時間:本編 50分、Q&A 5分、バッファ5分
  2. 2. 質問: 2 グラフィックス性能の悩みは ありませんか? たとえば、、、 ・敵が多くなるとフレーム落ち ・エフェクトを入れたら重すぎる 解決のヒントを!
  3. 3. 概要 • 目的:GPU最適化入門の紹介 – グラフィックスプログラムがどんなものか、少し知っている方向け – 現在発売中の“Computer Graphics Gems JP 2015,株式会社ボーンデジタル”に 詳細有 – →今日はわかりやすく紹介します!Cedilにこの資料をすぐ登録します。 • 説明者自己紹介 – 2002年SIE(旧SCE)入社以来、プレイステーションを中心にGPU周りの業務 を担当 • GPU、SDK、サンプル、ドキュメント、量産テスト、デモなど • 複数種のGPUを扱ってきました – 理解を深めていく中で気が付いたことをまとめました 3
  4. 4. 説明の流れ 1.概要・前置き 2.GPUの特性 3.GPU構成・進化 4.最適化と性能 5.まとめ 最適化の流れ Step A) 最適化対象フレームの特定 Step B) CPU/GPU負荷測定 Step C) GPUボトルネック解析 Step D) 最適化 Step E )目標性能に達するまで繰り返す 4
  5. 5. 前置き 用語定義 • GPU: グラフィックス処理を高速に行うハードウェア (今回はHW T&L以前のGPUの呼び名が付くまえも含む) • ほか、CG-ARTS協会の”コンピュータグラフィックス”に準拠 レンダリング手法の参考 • 和歌山大学 床井研究室ウェブページ • ”ゲームエンジンアーキテクチャ、SBクリエイティブ” ジェイソングレゴリー (和訳監修:今給黎 隆) 5
  6. 6. 始めに:リアルタイムレンダリング処理 映画、CMなど フレーム描画時間が短い必要がなく、 質優先 ゲーム、シミュレータなど フレーム描画時間が短い必要があり、 速度優先 →短い決まった時間でレンダリングした画像を連続して表示する処理。 たとえば、30、60、120フレーム毎秒( fps, frame per second )など 描画処理1 描画処理2 描画処理3 1/60秒 1/60秒 1/60秒 大別して2種のグラフィックス アルゴリズムがある 時間 グラフィックス アルゴリズム リアルタイム グラフィックス 非リアルタイム グラフィックス 60fps 6
  7. 7. 動機:最近のグラフィックスで求められること 1) エンジンや高レベルのライブラリで、実際のGPU動作が見えにくくなった → GPUの振る舞いを知ると、抽象度の高い処理でも効率よくGPUを使える 2) DirectX12やMetal, Vulkan など低レベル制御ができる手段が増えた → 詳しいGPU制御が求められることになる ということは、いずれにしても効率の良い処理をするため、 GPU内部を知っておくといいことがある! さっそく、最適化手法を知るために、まずはGPUの中を覗いてみましょう 7
  8. 8. GPUの基本 • GPU動作はシンプル 1. アセットデータと命令群を用意したうえで、 2. CPUから起動すると、 3. メモリにフレームバッファが生成される – アセットデータはジオメトリ・テクスチャ・アニメーション・シェー ダプログラムなど。命令群はコマンドバッファとしてまとめてGPUを 制御 • GPUは進化を続けている – パイプライン構成、機能、性能の改善が継続している – 半導体は1.5年で倍性能というムーアの法則は徐々に陰りが 心配されるが、GPUはどんどん進化 ・・・と、いうことは特定のGPUだけ理解しても、 すぐに役にたたなくなる!? →そうならないように、今後もなるべく共通して 使える、基本的な振る舞いを理解しましょう 8
  9. 9. GPUアーキテクチャの特性 1.レンダリング理論 2.長いパイプライン処理 3.並列性 GPUを知るうえで欠かせない3つの特徴 それぞれ説明します 9
  10. 10. 1) レンダリング理論 [1986 Kajiya] レンダリング方程式 すべての位置と向きで使え、乗算と加算で構成可能なエネルギー保存式 引用元:Realistic Image Synthesis Using Photon Mapping 10
  11. 11. 積分範囲は半球 入射光反射光 減衰 Ω x 1) レンダリング理論 出射光 発光 反射光 BRDF:反射近似関数 入射光 減衰 概念的にGPUはこの式を近似して実装している ※近似は主に複数回反射光の省略によるもの [1986 Kajiya] レンダリング方程式 11
  12. 12. 2) 長いパイプライン処理 パイプライン実装は1回反射(直接光表現)が主だが、 近年は2回以降反射の間接光表現がシェーダプログラム・マルチパスで採用 ・ジオメトリ ・テクスチャ ・アニメーション などアセットデータは MAYAなどのDCCツール やアルゴリズム等で生成 され、入力される 前頁理論の実装 GPUの基本処理 12
  13. 13. 2) 長いパイプライン処理(各部位特徴) フォーマット変換付 メモリ書き出し ※別名:CBDB/Merger 各処理を加速するラスタライザ・テクスチャユニット・シェーダ・ROPはGPU特有の機能 ハードウェアで最適な精度で処理しつつ、高速処理をしている 頂点をピクセル化 フォーマット変換付 メモリ読み書き・ 演算 GPU特有の機構 13
  14. 14. 3)並列性 描画実行単位が独立性の高いデータ構成 →GPU描画パイプラインは各部位で並列化された実装 そのためCPUに比べて格段に高速な処理 ※たとえば、シェーダパイプが1000本あれば、同時に1000頂点、または1000ピクセルを処理できること になる。並列実行単位は各種GPUの設計に依存 並列処理を行うと、実行時間を短縮できる その分ハードウェア資源が必要 width height 頂点単位 並列処理 ピクセル単位 並列処理 GPUは各所で並列処理を行う 14
  15. 15. GPUアーキテクチャの特性 まとめ 1.レンダリング理論 2.長いパイプライン処理 3.並列性 以上がGPUの3つの特徴です。 レンダリング理論をもとにした長いパイプライン処理があるGPUは、 各所で並列化されて高速に処理されます。 このGPU特性を踏まえ、GPUの構造を見てみましょう 15
  16. 16. GPU構成・進化の時系列表 2000.3.4 2006.11.11 2013.11.151994.12.3 構成の進化とともにプログラム自由度が上昇 同時期に半導体資源が増加し、計算能力も上昇 固定パイプライン 固定シェーダ ユニファイドシェーダ 半導体資源 構造 参考:PS 時間 プログラム自由度 16
  17. 17. 最適化と性能 GPU概要を抑えたところで、具体例を交えた最適化手法へ。 要約:GPUの最適化はGPUパイプラインを円滑に流すことに集約できる ポイント1) GPUの基本構造は長大なパイプライン 各所の処理を滞りなく進め、無駄を省き、GPU全体のスループットを良くする ポイント2) グラフィックス特別機能と、並列動作箇所を活かす PS4ではラスタライザ2並列、シェーダ1152並列 など、ユニットが複数 ポイント3) キャッシュ・バスなどの資源を無駄なく使う 容量が限られているが、高速に動作する ※GPUは構造、ファームウェア・ライブラリ・プログラムとさまざまな要因が性能に影響します。環境 により制御可能な範囲が異なることがあります。ここでは、なるべく広範囲で適用可能な基本的な部分 を見ていますが、環境によって隠ぺいされている場合があります。 17
  18. 18. 具体的な最適化の流れ GPUの処理を停滞させないため、ここでは以下の要領で進めます。 最適化の流れ Step A) 最適化対象フレームの特定 Step B) CPU/GPU負荷測定 Step C) GPUボトルネック解析 Step D) 最適化 Step E) 目標性能に達するまで繰り返す ここで、時折フレーム落ちが発生しているシーンを例に最適化を考えます 。 18
  19. 19. レンダリング処理の例 19
  20. 20. レンダリング処理の例 スキニング アニメーション 物理衝突判定 テクスチャ マッピング 法線マッピングインスタンシング マルチサンプル ・ テンポラルフィルタ SSAO ポストエフェクト グロウ ポストエフェクト フォンライティング シーン描画は、 さまざまな処理の集合 この処理で一部動作がフレーム落ちしている場合を考えます 20
  21. 21. レンダリング処理の例 21
  22. 22. Step A) 最適化対象フレームの特定 時間 描画 フレーム 番号1 2 3 状況により負荷が変わる たとえば、 ・大量計算のタイミング ・視野に多数オブジェクト など 処理時間の総和が 1/60秒(≅16.7ms)であれば60fpsで動作 1/60秒 状況により1/60秒を超えるとフレーム落ち このフレームは画面更新されず、次のフレーム切り替えタイミングへ まずはフレーム時間を測ることで最適化する対象フレームを特定 4 5 6 7 8 22
  23. 23. Step B) CPU/GPU負荷測定 問題のあるフレームを見つけたら、 ボトルネックがCPUかGPUか、を切り分ける。 というのも、計測した負荷には、CPU実行時間とGPU実行 時間が混在しているためで、これを切り分ける。 判定基準としては、GPU処理をすべて切ってみて、それで も処理時間が縮まなければ、CPUボトルネック。 そうでなければ、GPUボトルネック。 C P U G P U 1)CPUネックのケース マルチスレッド等、 CPUを最適化する。 この資料では解説しない C P U G P U 2)GPUネックのケース この時は GPUバッチの解析に進む 負荷 負荷 次はバッチの解析へ G P U 23
  24. 24. Step C) GPUボトルネック解析(バッチ説明) 時間 基本的に各処理はバッチと呼ばれるGPU起動単位で逐次実行される。バッチ実行時間の総和がフレーム時間 ク リ ア ア ニ メ ー シ ョ ン G バ ッ フ ァ 作 成 ポ ス ト エ フ ェ ク ト GUI 後 処 理 ポ ス ト エ フ ェ ク ト G バ ッ フ ァ 合 成 フレームの処理で最も問題のあるバッチを見つける 24
  25. 25. Step C) GPUボトルネック解析(バッチ計測) main() { initialize(); //初期化処理関数 for(flag!=1){ //描画ループ update(); //更新処理関数 //バッチ1:クリア処理 BeginEvent(“clear”); clear(); EndEvent(); //バッチ2:アニメ処理 BeginEvent(“animation”); animation(); EndEvent(); //バッチ3:描画処理 BeginEvent(“draw”); draw(); EndEvent(); //バッチ4:ポストエフェクト処理 BeginEvent(“post effect”); postEffect(); EndEvent(); } finalize(); //終了処理関数 }; 各処理の前後に タイマ計測を入れる 計測後、一番重いバッチを最適化対象にする 前述のとおり、目的の時間に達するまで 遅い処理を速くしていく 次はいよいよ 当該バッチの最適化へ ポイント 1. この時できればGPUタイマを使う。CPUタイマでは 、呼び出しと終了の同期の時間にずれ 2. 固定の条件で計測することが難しい場合、複数回計 測を繰り返すことで負荷計測の揺らぎの影響を緩和 25
  26. 26. Step D) 最適化:実測ベース最適化 ・バッチの実測データをもとにボトルネック部位を解析します。 ・GPUはパイプラインが長いため、どこかが詰まると、すべてが滞留してしまう。 再掲:GPU 処理フロー 26 どこがボトルネックか? まずはつまっている箇所 を調べる
  27. 27. Step D) 最適化:実測ベース最適化 ・バッチの実測データをもとにボトルネック部位を解析します。 ・GPUはパイプラインが長いため、どこかが詰まると、すべてが滞留してしまう。 再掲:GPU 処理フロー 27 どこがボトルネックか? まずはつまっている箇所 を調べる 問題なくうまく流れている箇所の 負荷を軽減しても何の意味もない! では、次にどうやってバッチ中の負荷の大きな 部位を切り分けるか? →次ページ
  28. 28. ボトルネック解析フローチャート 解析の目安フローチャート。 プログラムの一部を変更して 負荷の部位を特定します。 赤はシェーダ変更、緑はテクスチ ャ変更、青はそれ以外のブロック の操作です。 この表での"テクスチャ"は"バッフ ァ"形式の指定も含みます。 また、すべての組み合わせが網羅 されているわけではありません。 GPU 処理フロー 28 PS/CS以外のシェーダ
  29. 29. ボトルネック解析フローチャート A)シェーダを単純にして速くなる? 光学計算のシェーダを何もせずに定数 出力だけをするように書き換え 29
  30. 30. ボトルネック解析フローチャート B)テクスチャ・バッファサイズを1x1に して速くなる? 負荷が軽くなればテクスチャ読み込みの ボトルネック。そうでなければ、使って いるシェーダによって分岐を変化 ※詳細を実例を交えて後程紹介 シェーダがボトルネックであればシェーダ コード効率を改善。または計算量を軽減 テクスチャがボトルネックであれば、 フォーマットを軽量化したり、圧縮した りして負荷軽減。キャッシュアクセス効 率を改善。 30
  31. 31. ボトルネック解析フローチャート D)ROPのカラーマスクをして速くなる? ピクセル出力を止めることによって、速くなら なければ、ピクセルシェーダがボトルネック シェーダがボトルネックであれば、 シェーダコードを軽減 31
  32. 32. ボトルネック解析フローチャート E)メモリとROPどちらが高い負荷? デプステストをやめてみて、速くなったら ROPのボトルネック。 そうでなければメモリがボトルネック メモリがボトルネックであれば、フォー マット軽減やアクセスパタン改善でメモ リアクセスを軽減(多いボトルネック) ROPがボトルネックであればROP使用量を 軽減(あまりボトルネックにならない) 32
  33. 33. ボトルネック解析フローチャート C)ビューポートを小さくして速くなる? 1920x1080の解像度を、640x480に 33
  34. 34. ボトルネック解析フローチャート 頂点アトリビュートがボトルネックであれば 頂点アトリビュートを圧縮、フォーマット軽減等で軽量化 F)頂点アトリビュートを削減して速くなる? 頂点シェーダ入出力のテクスチャ座標などを切 って、位置だけの出力にしてみる 34
  35. 35. ボトルネック解析フローチャート テッセレータがボトルネックであれば 頂点分割数を減らす等の負荷軽減対策 他、ここでは述べられていな いそれ以外のボトルネック。 同期関係や頂点数削減等の 対策など。G)テッセレーション分割数を下げて速くなる? テッセレータが分割上限を1に設定して分割数を抑 えて評価 35
  36. 36. Step D) 理論ベース最適化 #1 • ここまででバッチ中のGPU負荷部を大まかに特定できた! – 次に、問題部分の性能を改善しよう • どのように問題部分の負荷を減らす改善をすればいいのか? – 単純にはプログラムの無駄をなくしたり、リソースを軽くする →GPUには効率的に負荷を減らす加速機能がある! これを活用する ※すべては述べきれず、また詳細になるほど各GPU実装に依存してきますので、 ここではよくある機能・手法の紹介にとどめます。 36
  37. 37. GPUの特殊な加速機能:頂点キャッシュ 有限数内で頂点シェーダ処理の結果を使いまわす加速機構 これがなければ頂点数分頂点シェーダが起動するところ、 共有している頂点でキャッシュ上にあるものはシェーダ処理を省略可能! 37 具体的に三角形単位で見てみると、、、 頂点処理
  38. 38. GPUの特殊な加速機能:頂点キャッシュ 38 A B C E F D A B C D triStripツールなどで、アセットの頂点順を調整可能 頂点インデックスに GPUに都合のいい並び 1と2の三角形で6頂点 あるところ、2つ共有 した頂点処理を一度に でき、本来6回のとこ ろ、4回の頂点演算で 済む
  39. 39. Step D) 最適化:理論ベース最適化 #2 加速機能のほか、効率的に負荷を減らすもう一つの戦略 →アクセスパタンの工夫等のGPU特性を活かす改善 局所性をなるべく保つ工夫をすることで並列動作・キャッシュ動作効率を改善する 39被写界深度(DOF)処理をする具体例でみてみましょう→ シェーダは実行単位が決まっている。これに合わせてアクセスパタンを設計 →データ要求がキャッシュにあてやすくなり、高速化につながる 8x8がさらにZ字のように、階層的に 並んでいる。(スィウズル構造) 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 マスごとが8x8等の 実行単位の集まり 実装依存で単位は 異なる
  40. 40. 問題:ぼかし画像処理でコンピュートシェーダが遅い 40 DOF 9x9texelのフィルターサイズの画像処理で10.0ms以上かかってしまう問題に遭遇 (60fpsのためには16.7ms内に納めなくてはならないのに!) ※DOFで焦点の合っていない箇所のボケ表現に使う ぼかし画像処理 この魚だけぼけていない 他の部分はぼけている
  41. 41. どんな処理をしているのか?:ぼかし処理概要(1/2) 1)水平方向ぼかし処理:各スレッドが横長のサンプルをして平均色を計算 まずは水平方向9pixelでぼかし処理。横ににじんだ結果にする 各点で同じ処理。 1080 pixel 1920pixel ス レ ッ ド 0 ス レ ッ ド 1 ス レ ッ ド 2 ス レ ッ ド 1 9 1 9 41 1080 pixel 1920pixel
  42. 42. スレッド0 スレッド1 スレッド2 スレッド1079 ブラー処理概要(2/2) 2)垂直方向ぼかし処理:各スレッドが縦長のサンプルをして平均色を計算 次に、水平方向ぼかし結果で処理。 これで本来9x9texelのサンプルを、縦一列9texelと横一列9texelに削減できる効率的 そうなぼかしアルゴリズム。しかし、実際には14.3msと遅い。 さっそくボトルネックを見てみる 1080 pixel 1920pixel 42 1080 pixel 1920pixel 水平方向ブラー結果
  43. 43. この場合のボトルネック解析 ボトルネック解析を行うと、 テクスチャ読み込みのボトルネック フレームバッファを参照した画像処理なので、 圧縮テクスチャにしたり、フォーマット変更は なるべくしたくない。 →キャッシュアクセスを改善してみる 43
  44. 44. スレッド 0 スレッド 1 スレッド 2 スレッド “改善”ブラー手法 2段階に分けず、9x9 texel を一度に読み込みするようにしてみる 各ピクセルで一気に9x9texelのサンプルを行うと0.9msに高速化。 論理的には、先ほどよりも81/(9*2-1)=4.8倍サンプル数が多いアルゴリズム。 しかし、実際は改善前の14.3msと比べて、こちらのほうが0.9msと15.9倍も速い。 どうしてだろうか? 1080 pixel 1920pixel 44 1080 pixel 1920pixel
  45. 45. シェーダ実行単位に合わせたアクセスパタン メモリからGPUのキャッシュにデータを乗せる際、矩形で参照。 たとえば、キャッシュラインサイズが64BでR8G8B8A8(4Byte/texel)のテクスチャを参照する場合には4x4の領域を参照する →読み込み領域の多くが、メモリよりもはるかに高速なキャッシュに乗っているため、 参照テクセルが多くても、後者の局所性を活かしたアルゴリズムが有利 キャッシュミス多発で低速 各ピクセルで読み込み範囲が縦横入れ替わる ため、キャッシュが入れ替わり効率が悪くな っていた キャッシュヒット率が高く高速 テクスチャアクセスをまとめてキャッシュヒ ット率が高い 45
  46. 46. Step D) 理論ベース最適化 まとめ #1 ) GPU負荷軽減加速機能の利用 • 頂点キャッシュなど • 複雑だが、GPU最適化の妙がつまっていて面白い #2 ) GPU特性を活かす工夫 – GPU実行単位をキャッシュに当てやすくし、局所性が活かせるアクセスパタン – レジスタ・共有メモリ・キャッシュ・メモリと、使用頻度により配置を設計 46 参考 ・(対象GPUがある程度絞れる場合)各メーカが公開しているGPU情報を入手 シェーダパイプ数、L2キャッシュ容量、メモリバンド幅、特殊なGPU負荷軽減策など ・高度な最適化事例 Optimizing the Graphics Pipeline with Compute / GDC 2016, Graham Wihlidal, frostbite
  47. 47. 参考1:GPU仕様から最大性能の見積もり ※60fpsの場合の例 頂点処理ユニット(フロントエンド・セットアップ・ラスタライザ) • 頂点処理ユニット4つでGPUクロックが1GHzなら、 頂点能力は4*1GHz = 4G 頂点生成毎秒 • フレームあたり、4G / 60 = 67M頂点まで使える。 シェーダ演算器 • 1GHz動作でshader pipeが512本で1シェーダパイプで実行可能な演算が2muladdだと→ 2 * 512 pipe * 10^9 Hz = 1024 G Flops(浮動小数点演算毎秒) • フレームあたり1024/60 = 17 G 回の浮動小数点の演算が可能 というように, 各所のハードウェア性能上限が仕様表から計算で求められる。メモリバンド 幅なども記載してある。 この性能上限が最適化しても到達できる最大値であり、最適化はここまで。 リソースとアルゴリズムの見積もりに使える。 47
  48. 48. 参考2:プログラムのリソースから演算量(負荷)見積もり ※60fpsの場合の例 レンダーターゲットメモリバンド幅 • 1920x1080 R8G8B8A8のカラーバッファ、法線バッファ、AOバッファ、拡散反射光バ ッファ、鏡面反射光バッファ、アルベドバッファ、 1920x1080 Float32のデプスバッフ ァを読み込みかつ書き込みしていれば、 1920x1080x4bytePerTexel * 7renderTarget*2readAndWrite = 110.7MiB を1フレームあたり消費 • 秒間では、110.7MiB * 60フレーム =毎秒6644.5MiB使っている。つまりメモリバンド幅 を6.5GiB/s使っている。 テクスチャメモリバンド幅も同様にリソースから算出可能 このように, プログラムで使っているリソースを把握しておけば、どれだけの性能を使うこと になるか、計算で求められる。 この見積もり総和が、前頁で出した性能上限に達する場合、 理論上最適化してもリアルタイム処理にすることはできない。 48
  49. 49. Step E) 目標性能に達するまで繰り返す 最適化の流れ Step A) 最適化対象フレームの特定 Step B) CPU/GPU負荷測定 Step C) GPUボトルネック解析 Step D) 最適化 Step E) 目標性能に達するまで繰り返す 目標に達成するまでStep A~ Step Dを繰り返します。 アルゴリズムの変更、アセット削減 このときも今回の手順でボトルネックがGPUのどこにあるかを把握すれば、 影響を局所的にとどめることができ、最小限の変更にとどめられます。 これらのステップを経て、 どうしても目標速度の達成が難しければ、 49
  50. 50. 参考:計測ツール 各バッチ処理のシェーダパイプの使用頻度、実行効率がわかる 他、バッチ中の詳細なブロックごとの負荷信号を表示可能 プログラムを変更せずとも、どこで処理が滞っているのかがわかる このシーンをキャプチャ DirectXならPIX AMD Perfstudioなど さまざまなツールがある ツールによっては手順を自動化 参考:PlayStation®4でRazorツールを使って波形を計測した例 ツールがあれば計測を補佐してくれます。各環境に応じたツールを探してみましょう 50
  51. 51. まとめ 51
  52. 52. GPU最適化まとめ 【性能上昇のために積極的にする事】 大量の演算器で並列計算 • 頂点・ピクセル処理のデータ独立性 • 大規模な演算を高速にできる 専用演算機器・加速機能の利用と、特性に合 わせた最適化 • 重複する頂点処理を省略可能な頂点キャッ シュなどの特殊機能 • 局所性を保ちキャッシュヒット率を上げる • 他にも多種機能有 【性能低下しない為に気を付ける事】 特定ボトルネック箇所で止まることを避ける • パイプラインが長く、ボトルネック箇所で 全体が止まる • 個々の対策の前に、ボトルネック解析で時 間の削減 • GPU構造を知り、ボトルネックを緩和・解 消する ボトルネックは演算よりバンド幅になりがち • キャッシュになるべく当てる • 同期の無駄を無くす • データ読み込みのレイテンシを演算で隠す 52
  53. 53. 最後に 今後もGPUは進化と変化が予想される しかし、最適化の基本の考え方は共通 ・完全な解決ではなく、有限時間内で大きな問題から対処するトリアージ ・GPU最適化を行うことで、描画に余裕が生まれる ・結果、リアルタイムで表現できることの幅が広がる 53 GPU最適化でグラフィックス性能が改善して 面白いゲーム・アプリの一助となることを 願っています!
  54. 54. ご清聴ありがとうございました 54
  55. 55. Q&A • ご質問ありますか? • 補足 – プレイステーションは抽象化層が薄く、最適化がたくさんできますよ! 55

×