DirectX 12 предоставляет очереди команд для графических задач (называемых «Direct»), для вычислений или копирования. С точки зрения предоставленной функциональности каждый из них является супер-набором следующего. Спецификация утверждает , что очереди команд могут быть выполнены одновременно с помощью устройства. Тем не менее, API никоим образом не ограничивает количество очередей команд (по крайней мере, я не знаю каких-либо ограничений).
По-видимому, разные поставщики обрабатывают это очень по-разному:
- В недавней презентации Intel (слайд 23) говорится, что в настоящее время их графические процессоры не способны параллельно обрабатывать графику и вычисления и что у механизма копирования низкая пропускная способность. Они не рекомендуют использовать несколько графических / вычислительных очередей.
- AMD давно начала рекламировать использование очередей / «асинхронных шейдеров», начиная с Mantle и консолей текущего поколения. Есть также некоторые разработчики ( пример ), которые подтверждают значительный выигрыш в производительности, выполняя параллельные вычислительные и графические задачи.
- В последнее время возникла некоторая суета по поводу того, что Nvidia не поддерживает асинхронный шейдер в аппаратном обеспечении: одновременное использование отдельной очереди графики и вычислений замедляет работу, что указывает на эмуляцию драйвера. С другой стороны, операции параллельного копирования поддерживаются CUDA в течение очень долгого времени, что дает понять, что механизм DMA может работать независимо.
Есть ли способ решить во время выполнения, имеет ли смысл фиксировать CommandLists для нескольких CommandQueues вместо одного? (учитывая, что предыдущий случай не требует больших технических затрат)
Несмотря на то, что я легко вижу, как полезно выполнять операции с памятью параллельно с вычислительными / графическими операциями, мне кажется излишне сложным запускать несколько вычислительных и графических процессов параллельно (если только нет существенного преимущества). Мне также не ясно, как это может привести к значительно лучшей производительности в любом случае; за исключением патологических случаев, когда многие небольшие последовательные задачи не способны генерировать достаточную загрузку графического процессора.
Ответы:
Отправьте ваше приложение с последовательностью тестирования, проверяющей реальную платформу. (Возможный ответ на многие вопросы, я думаю ...)
Я подозреваю, что производительность сильно зависит от того, как вы используете оборудование. Поскольку аппаратные средства вряд ли будут каким-то образом задвигать ваше приложение в обратном направлении, сообщая вам, что делать, я бы остановился на том, что хорошо выглядит в вашем дизайне.
Ключевое слово МОЖЕТ. Я не вижу причин, по которым какой-либо поставщик мог бы это испортить. В конце концов, именно провайдер платформы (Intel / AMD / Nvidia) отвечает за то, чтобы сделать вас достаточно хорошим драйвером, чтобы вы не рассматривали вопрос о смене поставщика. Если у них есть «известная проблема» с этой функциональностью (которая, кстати, не имеет никакого функционального значения, только производительность), то они должны также решить ее, используя то, что они знают. Я имею в виду, что они громко кричат, отступление - это то, что они уже реализовали; Синхронное исполнение.
Аппаратное обеспечение достаточно вуду, как и для нас, разработчиков.
источник