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