Как я вижу узкое место графического процессора в сложном алгоритме? - PullRequest
3 голосов
/ 26 апреля 2019

Я использую фрагментные шейдеры GLSL для вычислений GPGPU (у меня есть свои причины).

В nSight я вижу, что я делаю 1600 вызовов на кадр.

Может быть 3 узких места:

  • Fillrate
  • Просто слишком много вызовов
  • GPU зависает из-за загрузки моего GPU-> CPU и загрузки CPU-> GPU

Как мне найти, какой это?

Если бы мой алгоритм был простым (например, размытие по Гауссу или что-то в этом роде), я мог бы сделать так, чтобы область просмотра каждого вызова была 1x1, и в зависимости от изменения скорости я мог бы исключить проблему с заполнением.

В моем случае, однако, это потребовало бы изменения всего алгоритма.

Ответы [ 2 ]

1 голос
/ 10 мая 2019

Поскольку вы упоминаете инструмент Nvidia NSight, вы можете попытаться выполнить процедуры, описанные в следующем сообщении в блоге Nvidia.

В нем объясняется, как считывать и понимать счетчики производительности оборудования для интерпретации узких мест производительности.

Метод анализа пиковой производительности в процентах для оптимизации любой рабочей нагрузки графического процессора:

https://devblogs.nvidia.com/the-peak-performance-analysis-method-for-optimizing-any-gpu-workload/

0 голосов
/ 26 апреля 2019

Вместо того, чтобы найти один, измените способы расчета.

I'm using GLSL fragment shaders for GPGPU calculations (I have my reasons). 

Я не уверен, какая у вас версия OpenGL, но использование компьютерного шейдера поверх FS решит проблему

In nSight I see that I'm doing 1600 drawcalls per frame.

Вы имеете в виду фактические колл-колы OpenGL? это может быть одной из причин наверняка. Вы можете нарисовать что-то на FBO, чтобы рассчитать их с помощью GPU. В этом большая разница между компьютерным шейдером и фрагментным шейдером. Рисование звонков всегда тормозит программу, но компьютерный шейдер.

Архитектурным преимуществом вычислительных шейдеров для обработки изображений является что они пропускают шаг ROP (Render output unit). Очень вероятно, что пишет из пикселя шейдеры проходят через все обычные аппаратные средства смешивания, даже если вы этого не сделаете используйте это.

Если вам нужно как-то использовать FS, тогда

  1. попытайтесь найти уменьшение количества вызовов.
  2. найти способ хранения рассчитываемых данных. Это было бы похоже на использование текстур рендеринга в качестве памяти, если вам нужно менять вершины с помощью RTT, вам нужно будет загружать текстуры как положение, скорость или все, что вам нужно, чтобы изменить вершины или их атрибуты, такие как normal / color.

Чтобы найти истинную причину, лучше использовать GPU и профилировщики GPU в зависимости от вашего чипсета и ОС.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...