Металлические шейдеры с несколькими вычислениями против одиночных - PullRequest
0 голосов
/ 20 мая 2018

Я использую несколько (4 или 5) вычислительных шейдеров, которые обрабатывают одни и те же данные и выдают разные выходные данные.Однако пользователь может включить один, несколько или все из них.У меня есть два варианта из соображений производительности:

  1. Объединить все эти вычислительные шейдеры в один и вычислить все за один проход.Затем на основе пользовательского ввода выборочно отображать данные.Для этого требуется один проход, но число параметров для вычисления шейдера может увеличиться (до 8 MTLBuffers),

  2. Разделить их на несколько шейдеров и использовать несколько проходов для вычисления каждого фрагмента данных.,Каждый проход использует свой кодировщик вычислительных команд.

Являются ли многократные проходы, когда данные уже находятся в графическом процессоре, плохими с точки зрения производительности?Какой вариант рекомендуется из соображений производительности?

1 Ответ

0 голосов
/ 25 мая 2018

Я бы ожидал, что вариант 2 будет работать так же хорошо, если только нет существенного совпадения в вычислениях, выполняемых каждым шейдером (т. Е. Совместно используемыми временными файлами). Затраты командных буферов довольно незначительны.

Выможно профилировать это с помощью инструментов и шаблона "Metal System Trace".Он скажет вам, сколько времени каждое ядро ​​тратит на выполнение, и промежутки между ними (где происходит копирование памяти, очереди в буфере команд и т. Д.).Если профиль для варианта 2 показывает кучу пробелов, где графический процессор не используется, то я ошибаюсь, и, возможно, вам нужно делать меньше проходов:)

...