ハイパフォーマンスなコア部分の開発手法〜プロファイル駆動開発のススメ〜
トライエース
による
CEDEC 2020
での
講演
.
http://research.tri-ace.com/
プロファイル駆動開発
似た用語に
ベンチマーク駆動開発
テスト駆動開発
の
リファクタリング
のフェーズを「
プロファイル
」「
最適化
」に分割する.
保守性
が高い.
CI
で
PDDサイクル
を回す.
プロファイル
用のコードの保守
リビジョン
で比較して劣化を
アラート
できる.
生産性
が高い.
ゲーム
の構成要素
クライアント
には
自動プロファイリング
サーバ
には継続的な
負荷試験
PDDサイクル
PDDサイクル
はDailyで回される.
サーバ
が
CI
で
自動プロファイリング
結果が
ダッシュボード
や
Slack
に通知される.
ダッシュボード
MySQL
と
Metabase
を利用.
Metabase
は
ドリルダウン
があまりよくない.
FilterBox
を利用する.
Android向けUnity製ゲーム最適化のためのCI/CDと連携した自動プロファイリングシステム
Slackアプリ
で
UX
にこだわって通知.
継続的な
負荷試験
PDDサイクル
は深夜帯に
CI
で行う.
システム
全体の
監視
.
コネクション
関連など.
継続的な
負荷試験
は
パフォーマンス
の測定が目的であり,限界を知ることではない.
リリース
前の
負荷試験
とは異なる目的.
QA
や
企画
のプレイから取得される
RPCログ
から自動で
シナリオ
を生成.
MUNIN
C++
でコア部分の実装を全て行い,共通化する.
開発環境
をシームレスに.
最適化
の恩恵が広く影響する.
ユニットプロファイリング
で
PDDサイクル
を回す.
ユニットプロファイリング
従来
実装コードの開始と終了に
関数
を仕込んで測定
実際の入力
データ
を利用
デメリット
実装コードが汚れる.
コストが大きい.
関数の呼び出しなどは
自動プロファイリング
でだいたいわかる.
Slow Function Ranking
ユニットプロファイリング
単体テスト
の
プロファイル
版.
単体テスト
の使用感で利用できる.
自動で実行される.
Google Benchmark
:
C++
BenchmarkDotNet
:
C#
JSON
で出力して
Slackアプリ
などで利用.
Metabase
の
Pulse
を利用しているが,まだ発展途上.
独自実装に変更予定.
コンソール
でも確認ができる.
高精度な
ベンチマーク
Intel
の
White Paper
が大変参考になる.
RDTSC
を利用する.
Linuxカーネル
で実装すれば
割込み
や
プリエンプション
を無効化できる.
OoO
の無効化
統計
的アプローチ
全体の何度も繰り返して
平滑化
する.
サーマルスロットリング
の問題
計測時間外に適度にスリープ
サーキュレータ
で冷却
その他できることいろいろ
無関係な
プロセス
の停止.
スレッドプライオリティ
実行する
CPU
を指定.
初期化後に少しだけスリープ
アプリ
開始時に
パフォーマンス
が安定するまで実行しない.
Google Benchmark
の
検証
結果の出力や精度に課題.
機能の多様性に強さ.
Mathライブラリ
当初は速かった
ライブラリ
も今は遅い.
HLSL
との
interface
の共通化など.
OSS
の調査
DirectXMath
速そうだけど
interface
が微妙.
GLM
interface
が良いが早いか微妙.
Mathライブラリ
開発
テスト
を書きながら
OSS
や
Mathライブラリ
を
プロファイル
新
Mathライブラリ
を実装.
PDDサイクル
で
パフォーマンス
改善.
コンパイラ
の気持ちを考えて
SIMD
で動くように書く.
逆アセンブル
で結果確認.
プロファイル
->
逆アセンブル
->
最適化
最適化
SIMD
で動く
Vector
クラス
を作成し,
Matrix
では
Vector
を利用.
C++17
以降を使いましょう
if constexpr
が強力
デバッグビルド
でも気を抜かずに
最適化
ユニットプロファイリング
の結果が良くても,
ゲーム
全体が速くなるとは限らない.
包括的に
PDD
を整えることが大切.
パフォーマンス監視
総合
監視
環境
ビルド
,
デプロイ
結果.
単体テスト
,
回帰テスト
,
画像回帰テスト
プロファイリング
系