Страница 1: Тесты производительности Ashes of the Singularity – DirectX 12 и Asynchronous Shaders

Ashes of the SingularityС игрой Ashes of the Singularity интерфейс DirectX 12 превратился из теоретического преимущества в практическое. Игра Ashes of the Singularity, первая игра на рынке с полной поддержкой DirectX 12, выйдет в релизе 22 марта. Hitman – второй кандидат на данную роль, но здесь следует дождаться дальнейших известий в середине марта на GDC. Сегодня мы рассмотрим последнюю бета-версию Ashes of Singularity и сравним уровень поддержки технологий на видеокартах AMD и NVIDIA. Мы оценим и такие специальные функции, как Asynchronous Shaders и поддержку multi-GPU на видеокартах разных производителей.

За последние два года мы опубликовали немало статей и тестов, касающихся DirectX 12. Поначалу Microsoft и другие вовлеченные компании были не слишком разговорчивы, первые подробности появились только в сентябре 2014, на мероприятии Microsoft и NVIDIA, посвященному представлению архитектуры Maxwell в виде видеокарт GeForce GTX 980 и 970. Затем информация стала обновляться, не стала неожиданностью и новость о том, что AMD отдает преимущество DirectX 12 перед собственным API Mantle. Но AMD к тому времени могла гордиться тем, что смогла привлечь внимание к проблемам API, от чего выиграли все.

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

Asynchronous Shaders

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

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

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

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

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

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

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