Асинхронные шейдеры ускоряют видеокарты 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, помещая команды в очередь. Такой способ позволяет избавиться от пустых мест в очереди на конвейер, более оптимально используя потенциал производительности. Также можно выставлять приоритеты определенным процессам.


Асинхронные шейдеры уже входят в архитектуру GCN, так что AMD разрабатывала архитектуру с прицелом на будущее. Разработчикам CPU и GPU всегда приходится буквально предсказывать будущее, ориентируясь на программные решения, которые появятся только через несколько лет.

Asynchronous Shader от AMD
Asynchronous Shader от AMD

Блоки ACE входят в состав архитектуры "Graphics Core Next". В случае GPU "Hawaii" используется восемь блоков ACE, которые могут обрабатывать восемь очередей команд. Все видеокарты AMD с архитектурой GCN должны оснащаться блоками ACE, но их число зависит от конкретной реализации архитектуры.

Asynchronous Shader от AMD
Asynchronous Shader от AMD

В GPU "Hawaii" используется восемь блоков ACE (Asynchronous Compute Engines), все они работают независимо. Каждый блок ACE может, в свою очередь, обрабатывать восемь независимых очередей команд. Для быстрого доступа ко всем данным ACE напрямую работают с кэшем L2. А черед два движка DMA возможно обращение к памяти. Здесь используется полная пропускная способность PCI Express 3.0 16 Гбайт/с.

Asynchronous Shader от AMD
Asynchronous Shader от AMD

Асинхронные шейдеры позволяют не только улучшить базовую производительность современных архитектур и работу движков рендеринга, но и обеспечивают выигрыш в некоторых областях. Популяризация технологий виртуальной реальности поставила перед всеми производителями новые задачи, которые приходится решать, во многом, идентично – и AMD, и NVIDIA. Чтобы обеспечить полное погружение в виртуальную реальность, то есть виртуальный мир не отличался бы от реального, необходимо выполнить ряд критериев.

Самые высокие разрешения дисплеев с самой высокой частотой кадров требуют высокой вычислительной производительности. Оптимальным пока считается разрешение UltraHD на каждый глаз и частота 90 кадров в секунду. Необходимую производительность как раз могут обеспечить асинхронные шейдеры. Кроме того, должна уменьшиться задержка между вводом пользователя и выводом на дисплей, что критично для полного погружения в виртуальную реальность.

Асинхронные шейдеры открывают путь и другим технологиям. Здесь можно отметить технологии преобразования изображения (Image Warping) и (Asynchronous) Timewarp, которые мы детально поясняли в других статьях. Здесь появляющиеся проблемы и их решения у AMD и NVIDIA довольно близки.

Asynchronous Shader от AMD
Asynchronous Shader от AMD

Возникает вопрос: получат ли геймеры ощутимые преимущества от асинхронных шейдеров? Практических примеров мы пока привести не можем, и пока что тесты DirectX 12 не дают общей картины, тестируя определенные части конвейера рендеринга. Например, вернёмся к тем же операциям Draw Calls, число которых у Mantle / DirectX 12 выросло очень значительно по сравнению с DirectX 11, но степень их влияния на весь конвейер рендеринга пока не совсем понятна.

Вероятно, нам предстоит дождаться появления первых игр с "родной" поддержкой DirectX 12, чтобы оценить эффект. Конечно, AMD постаралась провести внутренние тесты, чтобы показать влияние асинхронных шейдеров на производительность. Например, без асинхронных шейдеров включение эффектов пост-обработки приводит к падению производительности примера SDK LiquidVR с 245 до 158 fps. Включение асинхронных шейдеров позволяет вернуться к уровню производительности, который наблюдался без эффектов пост-обработки.

Asynchronous Shader от AMD
Asynchronous Shader от AMD

AMD объяснила в теории, почему мы можем ждать прироста производительности под DirectX 12 на существующих видеокартах. Но пока что мы не можем подтвердить теорию конкретными практическими примерами. Синтетические тесты – это одно, здесь мы получаем прирост на несколько сотен процентов. Но они тестируют какие-либо определенные характеристики платформы, а не её общую производительность в целом. Впрочем, сегодня таким путём идёт не только AMD, но и все предполагаемые поставщики видеокарт DirectX 12. С Windows 10 Technical Preview и соответствующими драйверами появилась базовая техническая платформа, теперь осталось дождаться игр и программного обеспечения.

Хотя по поводу аппаратной поддержки остаются вопросы. Скорее всего, мы вновь получим несколько уровней поддержки DirectX 12. В случае DirectX 11 нам уже приходилось бороться с разными уровнями реализации поддержки, и не хотелось бы вновь столкнуться с этой проблемой уже под DirectX 12. Но AMD и NVIDIA указывают, что, по крайней мере, два последних поколения GPU совместимы с DirectX 12. Но в какой степени обеспечивается совместимость – пока неизвестно.

С асинхронными шейдерами AMD позволяет оценить потенциал улучшения производительности под DirectX 12. Конечно, у нынешних видеокарт имеется приличный потенциал улучшения, но его необходимо реализовать. Так что будем ждать выхода Windows 10 этим летом, а также обновления игр под DirectX 12 (и "родных" движков DirectX 12) в результате усилий AMD и NVIDIA.

Обновление:

Нам удалось узнать, какие GPU поддерживают асинхронные шейдеры и в каком виде.

Поддержка асинхронных шейдеров
Архитектура Смешанный режим Вычисления на GPU
AMD GCN 1.2 (R9 285) 1x Grafik + 7x Compute 8x Compute
AMD GCN 1.1 (R9-290-Series) 1x Grafik + 7x Compute 8x Compute
AMD GCN 1.1 (R7-260-Series) 1x Grafik + 1x Compute 2x Compute
AMD GCN 1.0 (HD-7000 и остальная линейка 200) 1x Grafik + 1x Compute 2x Compute
NVIDIA Maxwell 2. Generation (GTX-900-Series) 1x Grafik + 31x Compute 32x Compute
NVIDIA Maxwell 1. Generation (GTX-750-Series) 1x Grafik 32x Compute
NVIDIA Kepler (GK110) 1x Grafik 32x Compute
NVIDIA Kepler (GK10x) 1x Grafik 1x Compute

Конечно, NVIDIA работает над схожей технологией, представив в 2012 году HyperQ для профессионального сегмента. По сравнению с "Fermi" в архитектуре "Kepler" была реализована не просто рабочая очередь. Технология позволяет создать до 32 виртуальных ядер GPU, которые будут обрабатывать данные. Реализация у AMD и NVIDIA отличается, поэтому мы бы не стали сравнивать числа напрямую.

AMD описывает работу асинхронных шейдеров и проводит демонстрацию на следующих двух видеороликах: