Очередь - это вещь, которая принимает командные буферы, содержащие операции определенного типа (заданные флагами семейства).Команды, переданные в очередь, имеют порядок отправки, поэтому они подлежат синхронизации с помощью конвейерных барьеров, зависимостей подпрохода и событий (в то время как между очередями следует использовать семафор или луч).
Есть одна хитрость: COMPUTE
и GRAPHICS
всегда могут неявно принять TRANSFER
рабочую нагрузку (даже если QueueFamilyProperties
не перечислять ее).
Передача для команд копирования и Blit.Разреженный это что-то вроде пейджинга;он позволяет привязывать несколько дескрипторов памяти к одному изображению, а также позволяет позже повторно привязывать другую память.
В спецификации, приведенной ниже данной команде vkCmd*
, всегда указывается, какие из них являются «поддерживаемыми типами очереди».".
Семейство очередей - это группа очередей, которые имеют особое отношение к себе.Некоторые вещи ограничены одним семейством очередей, например, изображения (они должны быть переданы между семействами очередей) или пул команд (создает буферы команд только для использования данным семейством очередей и никаким другим).Теоретически на каком-то экзотическом устройстве может быть больше семей с одинаковыми флагами.
Это почти все, что гарантирует спецификация Vulkan.См. Проблему с этим в KhronosGroup / Vulkan-Docs # 569
Приведены некоторые специфичные для поставщика материалы, например:
Графические процессоры имеют асинхронный графический процессор (ы), вычисленияEngine (s), и Copy \ DMA Engine (s).Графика и вычисления, разумеется, будут оспаривать одни и те же вычислительные единицы графического процессора.
У них обычно есть только один графический интерфейс.Это является узким местом для графических операций, поэтому нет смысла использовать более одной графической очереди.
Существует два режима работы для вычислений: синхронное вычисление (отображается как семейство GRAPHICS|COMPUTE
) и асинхронное вычисление(выставлено как COMPUTE
-только семья).Первый - это безопасный выбор.Второй может дать вам около 10% производительности, но он более сложный и требует больше усилий.В статье AMD предлагается всегда делать первое в качестве базового уровня.
Теоретически может быть столько вычислительных очередей, сколько вычислительных блоков на GPU.Но AMD утверждает, что нет никакой выгоды для более чем двух Async Compute Queues и выставляет такое количество.NVIDIA, кажется, идет с полным номером.
Двигатели Copy \ DMA (представленные только как семейство TRANSFER
) в основном предназначены для передачи CPU-GPU.Обычно они не достигают полной пропускной способности для копии внутри GPU.Таким образом, если нет какой-то магии драйвера, семейство Async Transfer следует использовать для передачи CPU⇄GPU (чтобы пожинать свойство Async, чтобы иметь возможность делать графику рядом с ним беспрепятственно).Для копий внутри GPU в большинстве случаев лучше использовать семейство GRAPHICS|TRANSFER
.