RenderDoc Perf Timeline

RenderDoc Perf Timeline

@shiko_q

Дисклеймер: это инструмент для поиска причины GPU bottleneck, преимущественно для PC, преимущественно для вендора Nvidia. Может работать и с другими вендорами (с оговорками), может помочь и с другими платформами (с оговорками).

Timeline preview

Итак, цель - увеличить ФПС, в ситуации, когда основной тормоз - видеокарта.

Такую ситуацию мы называем "GPU Bound" и выглядит она в профайлере примерно так:

Unity Profler, typical gpu bottleneck (*.Present on RenderThread)

Если у вас сейчас в основном проблема в CPU, то этот инструмент вам сейчас не пригодится.


Как запустить:

  1. Делаем [снапшот рендердоком].
  2. Переходим в [Window -> Performance Counter Viewer].
  3. (Если ещё не) Качаем - устанавливаем Nvidia Perf SDK с офф. сайта по инструкции.
  4. Кнопка [Capture Counters]
  5. (Для теста можно взять уже готовые counters.csv и events.txt)
    (Опционально) Я рекомендую пройти по шагам дальше, но если вы опытный и/или у вас не Nvidia GPU или другая платформа или нет нужных метрик - то выбирайте их и сразу переходите к шагу 6.

Жмём кнопку Load и выбираем вот [этот файл]. Либо же задаём следующие метрики. Эти метрики необходимы только для нормальной работы плагинов, они не обязательны в общем смысле.

Generic → D3D11 Built-in:

GPU Duration (ms)
Rasterized Primitives
Samples Passed
VS Invocations
PS Invocations
CS Invocations

NVIDIA → nanoseconds

gpu__time_duration.sum
gpu__time_active.sum

NVIDIA → bytes (DRAM traffic)

dram__bytes_op_read.sum
dram__bytes_op_write.sum
dram__bytes_op_read.avg
dram__bytes_op_write.avg

NVIDIA → instructions

sm__inst_executed.sum
sm__inst_executed.avg

NVIDIA → percent

tpc__average_registers_per_thread_shader_3d.avg.pct
tpc__average_registers_per_thread_shader_cs.avg.pct
tpc__average_registers_per_thread_shader_ps.avg.pct
tpc__average_registers_per_thread_shader_vtg.avg.pct
l1tex__t_sector_hit_rate.avg.pct
lts__average_t_sector_hit_rate_realtime.avg.pct
lts__t_sector_hit_rate.avg.pct

smsp__warp_issue_stalled_barrier_per_warp_active.avg.pct
smsp__warp_issue_stalled_branch_resolving_per_warp_active.avg.pct
smsp__warp_issue_stalled_dispatch_stall_per_warp_active.avg.pct
smsp__warp_issue_stalled_drain_per_warp_active.avg.pct
smsp__warp_issue_stalled_lg_throttle_per_warp_active.avg.pct
smsp__warp_issue_stalled_long_scoreboard_per_warp_active.avg.pct
smsp__warp_issue_stalled_long_scoreboard_pipe_l1tex_per_warp_active.avg.pct
smsp__warp_issue_stalled_math_pipe_throttle_per_warp_active.avg.pct

NVIDIA → registers / thread

tpc__average_registers_per_thread_shader_3d.avg.ratio

6. Кнопка [Sample Counters], жмём.

7. Экспортируем результаты нажав кнопку 💾 - справа от кнопки [Capture Counters], что мы нажимали в шаге 4 -> counters.csv

8. В окне [Event Browser] нажимаем тоже кнопку 💾 и сохраняем -> events.txt

9. Качаем основной файл [timeline.html] и, если выполняли шаг 5 - два плагина к нему: [BoundsDetector.js] и [ShaderXray.js].

10. Запускаем [timeline.html], перетаскиваем (Drag & Drop) или жмём соответствующие кнопки и выбираем наши events.txt и counters.csv соответственно

11. Если выполняли шаг 5 - жмём кнопку [ + ] справа по центру или опять Drag & Drop для скачанных плагинов (по одному) - BoundsDetector и ShaderXRay.


Как читать:

  1. Выбираем наверху слева основной каунтер. Обычно это GPU Durations или gpu_active_durations.sum
  2. Выбираем дроуколл который дольше всех выполняется, жмём на него
  3. Смотрим и читаем, что там в [BoundsDetector] написано.
  4. Если проблема в шейдере (не в ROP, не в смежных вещах, типа овердроу, а именно в самом шейдере) - переходим в [ShaderXRay] и смотрим-читаем рекомендации что именно жрёт в шейдере.
  5. Кнопка "Ask AI" копирует в буфер обмена системный промпт и необходимый для ответа контекст (преформат каунтеров и ивент информации) - можно отправить в любой чатбот

Report Page