Страница 1: Асинхронные шейдеры ускоряют видеокарты AMD

amd radeon 2013Представление многочисленных графических API в последние месяцы наглядно показало, что у программного интерфейса между аппаратным и программным обеспечением существует определённый потенциал улучшения. AMD со своим API Mantle заложила начало этого процесса, летом планируется DirectX 12 вместе с Windows 10, OpenGL превращается в Vulkan, Apple для мобильного сегмента разрабатывает Metal. Как правило, оптимизации связаны с вызовами Draw calls, чтобы уменьшить вычислительную нагрузку на процессор. В пакет Futuremark 3DMark как раз недавно добавился тест API Overhead, где можно видеть заметные улучшения в данном направлении.

Чтобы выжать больше графической производительности, не всегда требуется покупать новое "железо", можно улучшить и работу существующих видеокарт – именно такого подхода геймеры ожидают от DirectX 12. Но AMD впервые заговорила о функции, которая имеется в современных GPU ещё с объявления архитектуры "Graphics Core Next". Она называется асинхронные шейдеры (Asynchronous Shader), функция улучшает взаимодействие между игровым движком, драйвером и аппаратным обеспечением, а также оптимизирует распределение задач. Во время представления первых видеокарт на GPU "Hawaii" AMD говорила об улучшениях GPU Computing из-за асинхронных вычислительных движков. Но подобные аппаратные блоки имеются у всех GPU на архитектуре GCN. И ранее рассматривавшая как чисто вычислительная функция получит вместе с DirectX 12 дальнейшее развитие, уже напрямую касающееся игр.

Asynchronous Shader от AMD
Asynchronous Shader от AMD

При изучении архитектуры GPU хорошо видны отдельные функциональные блоки, в наших обзорах мы поясняем их назначение и функции. Многие функциональные блоки могут работать независимо, но из-за специфики процесса рендеринга так не происходит, поскольку он опирается на так называемую линейную очередь. Конечно, как и во всех архитектурах, диспетчер пытается максимально оптимально распределить задачи, но здесь возможности не безграничны.

Asynchronous Shader от AMD
Asynchronous Shader от AMD

С выходом DirectX 12 изменился способ работы программиста с API. Теперь обеспечивается больше контроля над работой графической подсистемы, что позволяет лучше организовать определенные рабочие процессы. Обеспечивается лучшее масштабируемость в зависимости от числа потоков, поддерживаются технологии состояний процесса (Pipeline States) и добавления работы (Work Submissions) – три ключевых инструмента для оптимизации процесса рендеринга. Мы уже упоминали их в новости, посвященной ранней презентации DirectX 12 от Microsoft.

Представленные иллюстрации показывают разные процессы рендеринга под DirectX 12, а выше показан рендеринг под DirectX 11. Конечно, уменьшение времени рендеринга приводит к более высокой частоте кадров в секунду и снижает задержки, что даёт положительный эффект в той же сфере очков виртуальной реальности.

Asynchronous Shader от AMD
Asynchronous Shader от AMD

Сегодня разработчики не могут произвольно распределять задачи, им приходится придерживаться определенных требований API. Современные игровые движки поддерживают разделение на несколько предварительно оговоренных очередей, которые могут обрабатываться отдельно. На примере выше можно видеть очереди графики, вычислений и копирования. API DirectX 12 затем распределяет очереди по ресурсам, доступным на GPU.

Asynchronous Shader от AMD
Asynchronous Shader от AMD

Подход кажется простым, но на практике он более сложен, поскольку данные отдельные очереди необходимо распределять по свободным ресурсам GPU. AMD описывает данный процесс рендеринга на примере автомобильного трафика, используя перекресток и светофор. Как раз светофор – это диспетчер, который должен распределить процессы по движку рендеринга. Здесь все участники движения имеют равный приоритет. Им приходится ждать, пока освободится ресурс, такая диспетчеризация не самая оптимальная.

Asynchronous Shader от AMD
Asynchronous Shader от AMD

Один из способов улучшить процесс заключается в приоритезации. В таком случае можно задать приоритет некоторым задачам. Например, в случае автомобильного трафика можно остановить синюю очередь, чтобы обработать фиолетовую очередь с более высоким приоритетом – она будет отправлена на рендеринг. Но и здесь приходится переключаться между разными очередями, эффективность не всегда заметно повышается.

Asynchronous Shader от AMD
Asynchronous Shader от AMD

И здесь AMD представляет асинхронные вычислительные движки (ACE, Asynchronous Compute Engines). Они позволяют одновременно обрабатывать несколько очередей команд, которые получается более эффективно встраивать в конвейер рендеринга. На примере с автомобильным трафиком использование ACE можно представить как управление каждым транспортным средством в определенном порядке и с нужным интервалом. Если все очереди команд будут поступать хаотично, то мы получим столкновения. Их и предотвращают ACE, помещая команды в очередь. Такой способ позволяет избавиться от пустых мест в очереди на конвейер, более оптимально используя потенциал производительности. Также можно выставлять приоритеты определенным процессам.