Slide 1

Slide 1 text

スマートフォンGPUの特性を解析! 社内で 実施予定のGPUパフォーマンスチューニング 研修を紹介します! 株式会社サイバーエージェント 2024.05.28 清原 隆行

Slide 2

Slide 2 text

はじめに Chapter : 00

Slide 3

Slide 3 text

自己紹介 SGEコア技術本部(通称コアテク)という横断組織でグラ フィックチームの責任者として働いています。 著 書に「HLSLシェーダーの魔 導 書」という本がありま す。 現在は、主にグラフィックス系の基盤の開発や、開発中 のタイトルの不 具 合 修 正やパフォーマンスチューニング などを行っています。 今 回 は 各 タイトルのパフォーマンスチューニングから 得 た知 見を社 内に共 有するために、グラフィックスチーム で準備を進めている社内研修の内容についてご紹介しま す。 清原 隆行

Slide 4

Slide 4 text

なぜ社内研修を計画したのか? ● if文のオーバーヘッドによるパフォーマンスの悪化 ● シェーダーバリアントの肥大化によるメモリの圧迫 ● ヘビーなメモリアクセスが発生していて、メモリの速度によるパフォーマンスの悪化 ● GPUの処理負荷の計測方法が分からない 各プロジェクトで色んな事例があった 同様の事例が各子会社であった 知識を共有して属人化を防ぎたい

Slide 5

Slide 5 text

条件分岐 Chapter : 01

Slide 6

Slide 6 text

そもそも条件分岐って使っていいの? ● 静的分岐 ○ シェーダーバリアントやUniform定数などを使った分岐 ● 動的分岐 ○ マテリアルパラメータによる分岐 ○ 実行時の計算による分岐 適切に使用すれば問題ない

Slide 7

Slide 7 text

静的分岐 シェーダーバリアントやUniform定数などを使った分岐 half4 frag( Varings In ){ #ifdef _HOGE return half4( 0, 0, 1, 1); #else return half4( 1, 0, 0, 1); #endif } half4 fragCore( uniform half hoge ){ if(hoge > 0.5){ return half4( 0, 0, 1, 1); } return half4( 1, 0, 0, 1); } half4 frag( Varings In ) { return flagCore( 1 ); } シェーダーバリアント Uniform定数

Slide 8

Slide 8 text

静的分岐 シェーダーバリアントやUniform定数などを使った分岐 分岐のないコードが生成されるので実行速度の面では問題ない だが、作られるシェーダーのバリエー ションが増えるので、メモリ使用量には 注意が必要

Slide 9

Slide 9 text

動的分岐 マテリアルパラメータによる分岐 ● 同一のドローコールで全て同じ分岐パスを通るため大きな問題は起きない ○ オーバーヘッドは分岐コストのみ

Slide 10

Slide 10 text

動的分岐 マテリアルパラメータによる分岐 if( data.x > 0.5 ){    ・    ・       ・ }else{    ・    ・    ・ } スレッドグループ すべてのスレッドが同 じ分岐パスを実行して いる場合は、無駄な処 理は走らない

Slide 11

Slide 11 text

動的分岐 実行時の計算による分岐 ● 同一のドローコールで異なる分岐パスを通る可能性がある場合は全ての分岐パスを通る のと同じコストがかかるため、大きな処理負荷となる

Slide 12

Slide 12 text

動的分岐 実行時の計算による分岐 if( data.x > 0.5 ){    ・    ・       ・ }else{    ・    ・    ・ } スレッドグループ このスレッドは条件が成 立していないため、何も しないが時間はかかる このスレッドはdata.x > 0.5が 成立している

Slide 13

Slide 13 text

縮小バッファの利用 Chapter : 02

Slide 14

Slide 14 text

縮小バッファの利用 アセットの調整というのが、一番 妥当なのだが、開発終盤でクォリ ティ的にOKが出ていて変えにくい という状態だった pixel 5aはこのエフェクトの描画 だけで15ミリ秒ほどかかってい た。 FPSも10程度しか出ない状態 事例~その1~(リリース中のゲームのエフェクト)

Slide 15

Slide 15 text

縮小バッファの利用 事例~その1~(リリース中のゲームのエフェクト) 1/4の解像度の縮小バッファへのエフェクト描画で解決。 品質もほとんど落とすことなく、エフェクトの処理時間を1~2ミリ秒程度まで削減できて、 FPSも25~27と目標達成。 昔から行われてきている手法だけど、解 決策のカードとして使える人はそんなに 標いない印象だった。 属人化を解消したい!

Slide 16

Slide 16 text

縮小バッファの利用 事例~その2~(ぼかしアルゴリズムの変更) ぼかしアルゴリズムに縮小バッファへのダウンサンプルを行うという一手間加えて高速化。 (これも有名な手法で川瀬式bloomなどが代表例) 品 質を上げるという側 面もあるが、ダウンサンプリングという1パス追 加しているのに、パ フォーマンスが上がる場合もある。

Slide 17

Slide 17 text

縮小バッファの利用 ダウンサンプルせずにぼかす(Pixel 4a) 3パスでぼかしている 5.5ミリ秒かかっている

Slide 18

Slide 18 text

縮小バッファの利用 1/4にダウンサンプルしてぼかす(Pixel 4a) 4パスでぼかしている (1パス増えている) 4.4ミリ秒 1パス増えているのに1ミリ速 くなっている!

Slide 19

Slide 19 text

縮小バッファの利用 なぜパスを追加しているのにパフォーマンスがあがる? キャッシュヒット効率が上がるから。特にメモリ帯域が狭いスマートフォンアプリでは重要に なってくる。

Slide 20

Slide 20 text

キャッシュヒット効率 Chapter : 03

Slide 21

Slide 21 text

キャッシュヒット効率 キャッシュヒット率を見ることができるツールの調査 解像度の低いテクスチャの利用や圧縮テクスチャの利用でキャッシュヒット率が改善している ことを確認できるツールが欲しい Android GPU Inspector (AGI) Render Doc XCode Perfdog どれも求めている情報は得られ なかった

Slide 22

Slide 22 text

キャッシュヒット効率 NSight Graphics WindowsPCでしか使えない が、L1キャッシュのヒット 率 やL2キャッシュのヒット 率 など 求 めていた 情 報 が しっかりと取れていた。

Slide 23

Slide 23 text

圧縮テクスチャ テクスチャ形式 フレーム時間(ms) L1TEX Throughput(%) L2 Hit Rate(%) L2 Hit Rate from L1(%) 64bit フォーマット 133.5 34.7 19.7 18.9 32bit フォーマット 24.1 97.2 49.3 38.2 ※ L1 Hit Rate はほぼ同様の値を記録したので省略 ※ フレーム時間計測は Galaxy S20 5G - Qualcomm Adreno (TM) 650 - Valkan で行っています

Slide 24

Slide 24 text

解像度 テクスチャ解像度 フレーム時間(ms) L1TEX Throughput(%) L2 Hit Rate(%) L2 Hit Rate from L1(%) 2048 x 2048 28.9 90.7 70.9 68.2 32 x 32 22.1 93.9 100.0 100.0 ※ L1 Hit Rate はほぼ同様の値を記録したので省略 ※ フレーム時間計測は Galaxy S20 5G - Qualcomm Adreno (TM) 650 - Valkan で行っています

Slide 25

Slide 25 text

サンプリング サンプリング形状 フレーム時間(ms) L1TEX Throughput(%) L2 Hit Rate(%) L2 Hit Rate from L1(%) 縦方向 9 サンプリング 37.7 47.8 75.8 75.0 Box状 9 サンプリング 27.6 91.4 70.8 68.4 ※ L1 Hit Rate はほぼ同様の値を記録したので省略 ※ フレーム時間計測は Galaxy S20 5G - Qualcomm Adreno (TM) 650 - Valkan で行っています

Slide 26

Slide 26 text

最後に Chapter : 04

Slide 27

Slide 27 text

最後に 今後の予定 ● コアテクブログに連載記事の掲載(5月末~) ○ 第一回目は公開済み ● 社内研修の実施(9月ごろ) ● 外部に公開(12月ごろ)