Базовое аппаратное отображение очередей Vulkan - PullRequest
2 голосов
/ 08 ноября 2019

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

После одного из обновлений драйверов у меня есть две очереди только для передачи вместо одной, но я уверен, что параллельное использование их для потоковой передачи данных не принесет никакой пользы по сравнению с использованием одной из них. (будем рады, если вас опровергнут)

Так почему бы просто не сказать "у нас есть N отдельных аппаратных очередей, и если вы хотите использовать некоторые из них параллельно, просто смените их самостоятельно"? Теперь, похоже, нет никакой возможности узнать, насколько независимы очереди в семье.

1 Ответ

4 голосов
/ 08 ноября 2019

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

То есть очередь из семейства, вероятно, не "мьютексирование »доступа к реальному оборудованию. По крайней мере, не процессорным способом. Если несколько очередей из семейства являются разными путями для выполнения вещи на одном и том же оборудовании, то способ, которым оборудование заполняется из этих множественных очередей, вероятно, происходит на уровне GPU. То есть, это фактическая аппаратная функция.

И вы никогда не сможете получить производительность, эквивалентную этой аппаратной функции, "мьютексируя ее самостоятельно". Например:

У меня есть 2 очереди только для передачи вместо одной, но я уверен, что параллельное использование их для потоковой передачи данных не принесет никакой пользы по сравнению с использованием однойиз них

Предположим, что в действительности существует только один аппаратный канал DMA с фиксированной полосой пропускания за этой очередью передачи. Это означает, что в любой момент времени DMA может быть только из памяти процессора в память GPU одновременно.

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

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

С вашей точки зрения, вам придется загружать каждый элемент по одному через равные промежутки времени. Процесс, который должен быть прерван возможной загрузкой. Чтобы сделать это, вам в основном нужно иметь повторяющиеся задачи, которые появляются для выполнения, и отправлять одну загрузку в очередь передачи.

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

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

Основная проблема с очередями в семействах заключается в том, что они иногда представляют отдельное оборудование со своими собственными выделенными ресурсами, а иногдаони неНапример, аппаратное обеспечение AMD предлагает две очереди передачи, но фактически они используют отдельные каналы DMA. Разумеется, они, вероятно, все еще используют одну и ту же общую пропускную способность, но это не простой случай, когда одной очереди приходится ждать выполнения работы, пока другая очередь не выполнит команду передачи.

...