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

Меня смущает использование первичных командных буферов и вторичных командных буферов.

введите описание изображения здесь

Из этого примера NVIDIA я понимаю, что «re-use cmd» - это первичный командный буфер, а «re-use obj-level cmd» - это вторичный командный буфер (относительно объекта). Это так?

введите описание изображения здесь

Эта производительность показывает, что «повторное использование cmd» лучше (быстрее), чем «re-use obj-level cmd». Таким образом, я пришел к выводу, что использование только первичного буфера лучше, чем использование вторичного буфера, но все сэмплы, похоже, используют вторичный буфер при многопоточном рендеринге.

Должен ли я использовать вторичные буферы команд при многопоточном рендеринге?

Если мне нужно поддерживать несколько очередей, нужно ли мне использовать все несколько очередей? (многопоточность -> создание буфера команд -> отправка нескольких очередей) или использование одной очереди - это нормально?


person Moku    schedule 29.07.2016    source источник


Ответы (2)


Должен ли я использовать вторичные буферы команд при многопоточном рендеринге?

Нет. Строго говоря, я не понимаю, зачем вам это нужно. Конечно, второстепенные занятия могут облегчить вам жизнь в более сложной программе. Вы можете столкнуться с некоторыми архитектурными проблемами, используя только большой первичный элемент в каком-либо усовершенствованном механизме рендеринга.

Первый метод более быстрый, потому что это наиболее упрощенный / тривиальный подход. Вы создаете большой первичный объект один раз (драйвер должен любить это, имея всю информацию в одном месте, намного раньше, чем это было необходимо) для каждой сцены, а затем только отправляете (например, 0 загрузка процессора на кадр). Но просто попробуйте, например, нарисовать (общую) динамическую сцену этим методом - вам будет нелегко.

Если мне нужно поддерживать несколько очередей, нужно ли мне использовать все несколько очередей? (многопоточность -> создание буфера команд -> отправка нескольких очередей) или использование одной очереди - это нормально?

В: Следует ли мне пытаться использовать как можно больше очередей? ?

TL; DR - если нужно спросить, возможно, подойдет одна очередь. Если у вас есть работа, которая является в высшей степени независимой (то есть без чрезмерной синхронизации), используйте несколько очередей. (То, что он пишет в разные изображения, - хороший знак независимости)

Конечно, применима старая мудрость: не делайте предположений о производительности. Вы должны измерить.

person krOoze    schedule 29.07.2016

Во-первых, вы не должны рассматривать любой исходящий документ как единственный вариант использования Vulkan. Есть много способов использовать Vulkan, и это лишь некоторые из них, которые NVIDIA рассматривала в любой презентации.

Таким образом, я пришел к выводу, что использование только первичного буфера лучше, чем использование вторичного буфера, но все сэмплы, похоже, используют вторичный буфер при многопоточном рендеринге.

Показательный пример: эти образцы не делают то же самое, что делает NVIDIA.

Два метода NVIDIA:

  1. Создайте единый полностью статический и неизменный буфер команд. Предположительно, он содержит все, что можно когда-либо отрендерить. Предположительно, вы используете память (косвенный рендеринг, данные UBO и т. Д.), Чтобы контролировать, где они появляются, как рисовать более одного, или чтобы предотвратить их отрисовку вообще.

  2. Создайте единственный полностью статический и неизменный командный буфер для каждого объекта. Предположительно, вы используете память, чтобы контролировать, где они появляются. Затем вы визуализируете эти объекты в первичном командном буфере.

Ни то, ни другое вообще не имеет нити.

Когда люди говорят о многопоточном рендеринге, они имеют в виду потоковое создание командных буферов в цикле рендеринга. # 2 не создает вторичных буферов команд во время цикла рендеринга; они статичны для каждого объекта.

Типичная многопоточная система рендеринга создает вторичные командные буферы, содержащие несколько объектов, которые будут отправлены в первичный командный буфер позже в этом кадре. Каждый поток обрабатывает некоторое количество объектов в свой командный буфер. Вот что делают эти образцы потоковой передачи.

Итак, вы здесь сравниваете яблоки с апельсинами.

Если мне нужно поддерживать несколько очередей, нужно ли мне использовать все несколько очередей? (многопоточность -> создание буфера команд -> отправка нескольких очередей) или использование одной очереди - это нормально?

Используйте все, что вам нужно. Параллельные операции с очередями обычно используются для таких вещей, как передача памяти или сложные вычислительные операции, которые будут работать в следующем кадре. Рендеринг, как правило, должен происходить в определенном порядке. А зависимостями между очередями для отдельных операций рендеринга может быть очень сложно управлять.

Также помните, что Vulkan работает на большом количестве оборудования. В частности, для этого требуется, чтобы оборудование обеспечивало единую очередь. Таким образом, даже если вы занимаетесь программированием с несколькими очередями, вам все равно нужен путь для поддержки систем с одной очередью.

person Nicol Bolas    schedule 29.07.2016