В моем понимании VkPhysicalDevice представляет собой реализацию Vulkan, которую можно было бы представить в виде графического процессора и его драйверов. Мы должны записывать команды с помощью VkCommandBuffers и отправлять их через очереди, чтобы, возможно, выполнить многопоточную работу, которую мы отправляем на GPU. Вот почему я понимаю, что очередей может быть несколько. Я также понимаю, что QueueFamilies группирует очереди в зависимости от функций, которые они могут выполнять (доступные для них расширения, например презентация, а также графические вычисления, передача и т. д.).
Однако, если GPU может работать с графикой, почему очереди не могут этого сделать? Я слышал, что использование очередей с меньшим количеством функций может быть быстрее, но почему? Что такое очередь конкретно? Это связано только с реализацией vulkan? Или это связано с конкретными аппаратными вещами?
Я просто не понимаю, почему существуют очереди с разными функциями, и даже после поиска в документации Vulkan, StackOverflow, vulkan-tutorial и vkguide единственное, что я нашел, это «Очереди в Vulkan — это «порт выполнения» для графических процессоров». , который я не очень понимаю и по которому ничего не могу найти в гугле.
Заранее спасибо за вашу помощь!
Это не совсем хорошее объяснение физических устройств, поскольку вы можете создать одно логическое устройство из физических устройств несколько (для SLI и т.п.).
Я только что изучил это, вот почему здесь «обычно», спасибо! Похоже, вы много знаете о графическом программировании, есть идеи о том, почему существуют очереди с разными функциями?
Очередь — это вещь, которая потребляет и выполняет команды, так что каждая очередь (теоретически) выполняется отдельно от любой другой очереди. Вы можете представить себе очередь как рот, а команды — как пищу.
Очереди в семействе очередей обычно выполняют команды, используя для их обработки одно и то же базовое оборудование. Это было бы похоже на существо с несколькими ртами, но все они соединены с одним и тем же пищеварительным трактом. Сколько еды они могут съесть, не зависит от того, сколько еды они могут съесть переваривать. Пищу, съеденную одним ртом, возможно, придется ждать, пока пища, ранее съеденная другим, пройдет через пищеварительный тракт.
Очереди из разных семейств могут иметь (а могут и не иметь) различное базовое аппаратное обеспечение для выполнения. Это было бы похоже на существо с несколькими ртами и несколькими пищеварительными трактами. Если рот ест, этой пище не нужно ждать, пока пища из другого рта переварится.
Конечно, отдельное базовое исполнительное оборудование обычно отличается по какой-то причине. Некоторые графические процессоры имеют специализированное оборудование прямого доступа к памяти для копирования в/из локальной памяти устройства. Такое оборудование обычно предоставляет семейство очередей, которое разрешает только операции передачи, и эти операции передачи могут быть ограничены в их выравнивании байтов по сравнению с передачами, выполняемыми в очередях с поддержкой графики.
Обратите внимание, что это общие правила. Иногда очереди внутри семейства выполняются на различном оборудовании, а иногда очереди между семействами используют в основном одно и то же оборудование. API и реализации не всегда делают это очевидным, поэтому вам, возможно, придется сравнивать различные обстоятельства.
Спасибо за быстрый ответ! Объяснение об очередях приятное, а насчет специализированного оборудования DMA звучит как ответ на мой вопрос :) Однако в случае с очередью, поддерживающей графические операции, а не вычисления, или наоборот, с чем это связано? Опять специализированное оборудование прямого доступа к памяти? Или это только теоретически и не служит никакой практической цели?
@Progz: "в случае очереди, поддерживающей графические операции и не вычисляющей" Ну, это не разрешено. Если очередь поддерживает графику, вы также можете отправлять в нее вычислительные операции. Что касается того, есть ли какая-либо конкретная цель для очередей только для вычислений, это зависит от конкретного оборудования. Vulkan просто предоставляет способ показать то, что хочет показать реализация. Вы должны выбрать очередь, наиболее специализированную для текущей задачи, если только вы не хотите упростить синхронизацию между различными операциями.
"VkPhysicalDevice представляет собой реализацию Vulkan." Нет, это физическое устройство, реальная аппаратная часть.
VkDevice
представляет собой реализацию Vulkan, связанную с одним (или несколькими) физическими устройствами.