графическим процессорам в наши дни приходится сталкиваться с многопроцессорным миром. Разные программы могут получать доступ к одному и тому же оборудованию, и графические процессоры должны иметь возможность справляться с этим. Таким образом, параллельные входные потоки для одного компонента реального оборудования ничем не отличаются от возможности создавать больше потоков ЦП, чем у вас реальных ядер ЦП.
То есть очередь из семейства, вероятно, не "мьютексирование »доступа к реальному оборудованию. По крайней мере, не процессорным способом. Если несколько очередей из семейства являются разными путями для выполнения вещи на одном и том же оборудовании, то способ, которым оборудование заполняется из этих множественных очередей, вероятно, происходит на уровне GPU. То есть, это фактическая аппаратная функция.
И вы никогда не сможете получить производительность, эквивалентную этой аппаратной функции, "мьютексируя ее самостоятельно". Например:
У меня есть 2 очереди только для передачи вместо одной, но я уверен, что параллельное использование их для потоковой передачи данных не принесет никакой пользы по сравнению с использованием однойиз них
Предположим, что в действительности существует только один аппаратный канал DMA с фиксированной полосой пропускания за этой очередью передачи. Это означает, что в любой момент времени DMA может быть только из памяти процессора в память GPU одновременно.
Теперь, допустим, у вас есть работа с DMA. Вы хотите загрузить кучу вещей. Но время от времени вам нужно скачать какой-нибудь продукт для рендеринга. И эта загрузка должна быть завершена как можно скорее, поскольку вам нужно повторно использовать образ, в котором хранятся эти байты.
С очередями с приоритетом вы можете назначить очереди передачи загрузки гораздо более высокий приоритет, чем очереди загрузки. Если оборудование разрешает это, то оно может прервать загрузку, чтобы выполнить загрузку, а затем вернуться к загрузке.
С вашей точки зрения, вам придется загружать каждый элемент по одному через равные промежутки времени. Процесс, который должен быть прерван возможной загрузкой. Чтобы сделать это, вам в основном нужно иметь повторяющиеся задачи, которые появляются для выполнения, и отправлять одну загрузку в очередь передачи.
Было бы гораздо эффективнее простобрось работу на GPU и пусть его приоритетная система позаботится об этом. Даже если нет системы приоритетов, она, вероятно, будет выполнять операции циклического перебора, переходя назад и вперед между операциями очереди входной передачи, а не ожидая, пока одна очередь не иссякнет, прежде чем пробовать другую.
НоКонечно, это все гипотетически. Вам нужно выполнить работу по профилированию , чтобы убедиться, что все это работает.
Основная проблема с очередями в семействах заключается в том, что они иногда представляют отдельное оборудование со своими собственными выделенными ресурсами, а иногдаони неНапример, аппаратное обеспечение AMD предлагает две очереди передачи, но фактически они используют отдельные каналы DMA. Разумеется, они, вероятно, все еще используют одну и ту же общую пропускную способность, но это не простой случай, когда одной очереди приходится ждать выполнения работы, пока другая очередь не выполнит команду передачи.