С тех пор, как Advanced Micro Devices и ATi превратились в одну компанию, у ценителей процессоров AMD и графических карт Radeon ни разу не было возможности собрать компьютер из комплектующих любимого производителя, не поступившись быстродействием в одном из ключевых аспектов — CPU или GPU. Два года тому назад AMD, вооруженная архитектурой Zen, совершила триумфальное возвращение на рынок центральных процессоров, но печальная примета вновь сбылась. Марка Radeon с тех пор и вплоть до настоящего момента переживает свои худшие времена. И началось это гораздо раньше — после Radeon R9 Fury X на чипе Fiji графическое подразделение AMD не смогло породить устройство, способное наравне соревноваться с решениями NVIDIA за мантию самого производительного игрового GPU, да и в нижних ценовых эшелонах позиции «красных» слабеют год от года.
Но теперь, решив вопрос с центральными процессорами, AMD набралась сил для атаки на рынок дискретных графических карт. Сегодня мы представляем обзор ускорителей Radeon RX 5700 и Radeon RX 5700 XT, с помощью которых AMD намеревается потеснить NVIDIA из рыночной ниши, которую оккупировали младшие модели серии GeForce RTX — 2060 и 2070. Причем на этот раз главная ставка AMD сделана не на передовой техпроцесс 7 нм, по которому выпускают чип Navi, а на абсолютно новую логику RDNA, которая пришла на смену GCN — архитектуре с без малого восьмилетним стажем. RDNA призвана решить проблемы, которые помешали чипам Polaris и Vega в полную силу выступить против конкурирующего кремния Pascal и Turing, а затем — если первый опыт будет удачным — она откроет дорогу ускорителям AMD к борьбе за титул абсолютного чемпиона.
Трудно удержаться от аналогий с архитектурой Zen, которой удалось за пару лет перевернуть рынок центральных процессоров, да и в истории ATi есть примеры революционных преобразований. И все-таки, какие обстоятельства побудили разработчиков Radeon 5000-й серии отказаться от проверенной архитектуры GCN в пользу совершенно иного решения и что такого в RDNA, чтобы на рынке дискретных GPU опять возникла интенсивная конкуренция? Попробуем разобраться в этих вопросах, а затем приступим к долгожданным тестам Radeon RX 5700 и Radeon RX 5700 XT.
⇡#Новая архитектура RDNA
В первые годы GCN, которая дебютировала вместе с ускорителями Radeon HD 7970 еще в конце 2011 года, графические процессоры AMD, по большому счету, совершенно не уступали продуктам NVIDIA на чипах Kepler по энергоэффективности и быстродействию. Однако переход к архитектуре Maxwell, а затем Pascal, позволил конкурентам AMD радикально нарастить производительность в 3D-рендеринге, оставаясь в границах прежнего резерва мощности. GCN, тем не менее, всегда держала паритет с чипами NVIDIA по массиву вычислительных блоков, однако колоссальный резерв теоретического быстродействия, которым отличаются продукты AMD, целиком раскрывается только в расчетах общего назначения — не удивительно, ведь GCN и была задумана как решение для задач GP-GPU в противовес предшествующей архитектуре TeraScale, ориентированной преимущественно на игры.
Для рынка дискретных видеокарт определяющее значение имеет показатель быстродействия на рубль, а на не на ватт мощности, поэтому экономный кошелек нередко голосует именно за «красных». Тем не менее, коль скоро чипы GCN с определенного момента утратили возможность настолько эффективно транслировать терафлопсы расчетной производительности в быстродействие 3D-приложений, для того, чтобы поддерживать накал борьбы, видеокартам Radeon требуются более крупные чипы, чем те, которыми довольствуется NVIDIA. А в погоне за локальными победами в той или иной ценовой нише AMD раз за разом принуждала GPU работать на грани оптимальной зоны тактовых частот и питающего напряжения. В результате AMD уже давно не претендует на корону абсолютного быстродействия, да и в нижних категориях производительности NVIDIA было легче придать видеокарте такие характеристики, чтобы оправдать, как правило, более высокую розничную цену.
Благодаря архитектуре Turing NVIDIA совершила очередной скачок в энергоэффективности, и теперь стало совершенно ясно, что дальше AMD уже не может ехать по накатанным рельсам. Кроме того, архитектура GCN, несмотря на постоянные оптимизации и попытки консервативной переработки, которые происходили в каждом новом поколении кремния, не располагает такими новаторскими функциями, как аппаратное ускорение трассировки лучей и обработки данных методом машинного обучения. Однако AMD было не так-то просто отказаться от наследия GCN в пользу совершенно новой микроархитектуры. Свою роль сыграл и вероятный дефицит бюджета R&D в те годы, когда комапния работала едва ли не в убыток из-за плачевного положения дел на рынке центральных процессоров, и неудачное партнерство с полупроводниковым контрактором GlobalFoundries, который сперва аннулировал все планы по запуску линии 10 нм, а затем и вовсе прекратил работу над любыми новыми узлами после 14 нм FinFET.
Пространство для маневра наверняка ограничено и союзом с производителями консолей, для которых AMD разработала целую серию SoC с графическим ядром архитектуры GCN. NVIDIA по всем этими причинам чувствует себя более свободно и не стесняется проводить резкие изменения в архитектуре GPU. Неспроста ее то и дело обвиняют в том, что современные игры, рассчитанные на Direct3D 12 и Vulkan, из рук вон плохо работают на старых GPU архитектуры Kepler и Maxwell — все дело в том, как сильно Pascal и Turing отличаются от прошлых итераций «зеленого» кремния.
Однако для ускорителей Radeon все-таки настал судьбоносный момент. Как утверждает AMD, над принципами архитектуры RDNA компания работала в течение восьми лет, и последняя, в отличие от GCN, глубоко уходящей корнями в задачи GP-GPU, всецело сфокусирована на быстродействии 3D-приложений. Это еще совсем не значит, что RDNA не подходит для вычислений общего назначения, но место в этой нише по-прежнему будет занято существующими и, наверняка, грядущими продуктами на основе GCN. AMD последовала успешному примеру NVIDIA и отныне собирается поддерживать два отдельных направления архитектуры GPU — RDNA для игровых ускорителей и GCN для серверов и рабочих станций.
⇡#Легче и быстрее: Compute Unit графического процессора в GCN и RDNA
Для того, чтобы понять фундаментальные различия между RDNA и GCN, сперва придется освежить в памяти основные принципы массивно-параллельных вычислительных процессоров, которыми являются GPU, и конкретику их реализации в чипах AMD начиная с Tahiti — самого первого кристалла на основе GCN.
Львиную долю каждого современного GPU занимает массив шейдерных ALU. AMD называет их потоковыми процессорами, NVIDIA — ядрами CUDA, но в сущности и тот, и другой блок выполняет одну функцию — арифметические операции над целочисленными или вещественными (с плавающей точкой) данными. Но сила GPU заключается в том, каким образом организована совместная работа шейдерных ALU. 3D-рендеринг и масса вычислительных задач иного рода подразумевает выполнение однотипных действий над массивом разных операндов, поэтому вычислительные блоки внутри чипа группируются так, чтобы одна инструкция могла занять в одно и то же время несколько ALU, а данные поступают на обработку в виде нескольких потоков (threads). Группа из 32 потоков в терминологии NVIDIA называется warp, GCN оперирует группами по 64 потока под названием wavefront. Соответственно, каждая инструкция warp’a или wavefront’а позволяет выполнить необходимую операцию над 32 или 64 операндами (последние мы будем далее называть рабочими единицами — work items).
Основным строительным блоком архитектуры GCN является Compute Unit (CU) — именно его, а вовсе не отдельные ALU, можно считать аналогом ядра центральных процессоров, поскольку только CU целиком обладает способностью декодировать и отправлять инструкции на исполнение.
Compute Unit содержит 64 т. н. векторных ALU, разделенных на четыре блока SIMD (Single Instruction Multiple Data). И хотя wavefront’ы в архитектуре GCN состоят как раз из 64 потоков, каждый SIMD обрабатывает собственный wavefront параллельно с другими SIMD’ами, а поскольку в каждом SIMD’е есть всего лишь 16 ALU, для выполнения одной инструкции ему необходимо четыре такта — это ключевая черта архитектуры GCN, определяющая немало сильных и слабых сторон данной архитектуры. Другая важная особенность состоит в том, что векторный планировщик в CU всего один, и для того, чтобы загрузить все четыре SIMD работой, они получают собственные инструкции поочередно.
Для того, чтобы запустить CU с нуля, требуется потратить четыре такта, а в течение трех первых часть ALU будет простаивать. Но у подобной логики есть и другой изъян. Все дело в том, что далеко не каждая инструкция требует полной загрузки 16-ти векторых ALU в течение четырех тактов. Wavefront’ам свойственно ветвиться, и в этот момент получается так, что часть рабочих единиц включает одну операцию, а часть — другую. SIMD должен проходить «ветки» в два приема, независимо от того, сколько векторных ALU при этом будет бездействовать. Кроме того, CU всегда требует не меньше четырех wavefront’ов для максимальной загрузки ALU — условие, которое по тем или иным причинам может кратковременно нарушаться.
Чтобы снизить влияние этих факторов и адаптировать GPU к операциям с меньшим количеством потоков, создатели архитектуры RDNA совершили переход от 64-поточных к 32-поточным wavefront’ам. CU теперь содержит два SIMD’a по 32 векторных ALU, и каждый SIMD снабжен отдельным планировщиком. CU архитектуры RDNA рассчитан на исполнение двух инструкций в течение одного такта, в то время как CU чипов GCN исполняет четыре инструкции в течение четырех тактов.
Заметим, что поскольку wavefront’а в то же время стал в два раза уже, старая и новая архитектуры являются эквивалентными по терафлопсам на один CU — ни о каком удвоении пропускной способности тут речи не идет. Тем не менее, RDNA действительно обязана проявить высокую эффективность в задачах с «легкопоточной» нагрузкой, и на этом все плюсы реорганизации CU далеко не заканчиваются. Так, благодаря отдельным планировщикам, обслуживающим собственные SIMD’ы, и одновременной отдаче двух инструкций каждый такт, RDNA характеризуется пониженной латентностью исполнения индивидуальных инструкций. И наконец, у RDNA есть еще одно, не столь очевидное, достоинство. Как и в GCN, SIMD здесь не привязан к единственному wavefront’у — каждый раз, когда планировщик дает инструкцию на исполнение, она может быть выбрана из нескольких wavefront’ов (вплоть до 10 на каждый SIMD в GCN и 20 в RDNA). Но количество потоков, находящихся в рабочем пуле отдельно взятого CU, в результате уменьшилось с 2560 до 1280 — это значит, что в кешах теперь находятся менее разнородные данные и их объем используется более экономно.
Тем не менее, темп исполнения одной инструкции в четыре такта, свойственный GCN, был изначально установлен не без веских оснований. Пока инструкция «бегает» на SIMD в течение четырех тактов, CU может дождаться получения данных, необходимых для следующей инструкции — например, из оперативной памяти, обращение к которой происходит целую вечность по меркам внутренней логики GPU. Архитектура RDNA, напротив, пролетит через инструкции wavefront’а, пока не столкнется с необходимостью ожидания данных. Конечно, SIMD в этот момент может переключиться на один из 19 других wavefront’ов, но возможно и альтернативное решение проблемы. RDNA допускает работу со старым, 64-поточным форматом wavefront’а. В таком режиме инструкция широкого wavefront’а отдается на исполнение в два приема, и в период отработки за два такта латентность в ожидании отсутствующих данных эффективно маскируются.
Широкие и узкие wavefront’ы могут сосуществовать в пределах рабочего пула одного SIMD без необходимости в смене контекста, однако специфику выбора между тем или иным форматом — существуют ли в ISA архитектуры RDNA инструменты, определяющие ширину wavefront’а или это является решением драйвера — AMD не раскрывает. Как бы то ни было, устоявшиеся приложения GP-GPU, тщательно оптимизированные с расчетом на особенности GCN, равно как и игровые шейдеры, скомпилированные в машинном коде (Shader Intrinsics), наверняка нуждаются в ревизии, чтобы извлечь из RDNA максимально высокую эффективность.
⇡#Скалярные ALU в GCN и RDNA
Помимо векторных SIMD, которые обслуживает собственный планировщик, в каждом Compute Unit’е графических процессоров AMD — как GCN, так и RDNA — существует скалярный блок с отдельным целочисленным ALU и логикой, выполняющей декодирование и отдачу инструкций. Этот компонент открывает инструкции wavefront’а альтернативный путь исполнения — на тот случай, когда все из 32-х или 64-х рабочих единиц содержат однородные данные, и можно смело заменить их единственной операций вместо того, чтобы делать одну и ту же работу несколько десятков раз подряд. В коде шейдерных kernel'ов скалярный блок, по большей части, обслуживает операции условного ветвления или перехода.
В GCN скалярный блок может быть использован в течение каждого такта, но только одновременно с тем из четырех SIMD, к которому подошла очередь единого векторного планировщика. В RDNA скалярных блоков два, а поскольку четырехтактная ротация SIMD’ов ушла в прошлое, они способны принимать инструкцию на исполнение каждый такт. Тем не менее, из документации AMD не вполне понятно, может ли скалярный блок GCN и RDNA получать инструкцию параллельно векторной инструкции соответствующего SIMD’а. Разумеется, тогда SIMD и скалярный блок должны взять инструкции из разных wavefront’ов, ведь ни GCN, ни RDNA не допускают суперскалярное исполнение, при котором можно одновременно выполнить две последовательные инструкции из одного потока. Или все наоборот, SIMD вынужден уступить свой такт приема инструкции в пользу скалярного блока. Как бы то ни было, косвенные признаки указывают на то, что одновременная отдача и исполнение скалярных и векторных инструкций в рамках GCN и RDNA все-таки возможна, что дополнительно усиливает параллелизм в чипах AMD.
⇡#Блоки специального назначения (SFU)
Третий тип исполнительных блоков, который присутствует в Compute Unit’е GCN и RDNA, предназначен для т.н. операций специального назначения. Под этим термином скрываются тригонометрические функции, которые нередко используются при 3D-рендеринге. В рамках GCN блок SFU представляет собой отдельный SIMD, состоящий из четырех ALU, привязанный к каждому из основных векторных SIMD’ов, и служит в качестве резервного пути исполнения инструкции wavefront’а — для этого требуется 16 тактов, в течение которых векторный SIMD вынужден бездействовать.
В RDNA используется похожая организация SFU: с каждым из двух векторных SIMD ассоциирован SFU, в который входят 8 ALU. Таким образом, тригонометрические операции чип RDNA тоже исполняет в темпе 1/4 от стандартных векторных инструкций. Но есть одно ключевое отличие: из общих ресурсов векторый SIMD и SFU имеют только порт планировщика, а в остальном оперируют независимо друг от друга. Чтобы CU мог загрузить SFU, векторный SIMD должен пропустить лишь один такт, а в течение трех следующих, пока SFU отрабатывает свою инструкцию, SIMD готов принимать и исполнять инструкции в стандартном режиме. Вот еще один источник параллелизма и, в конечном счете, более высокой фактической производительности в пересчете на терафлопс, который сулжит графическим процессорам AMD архитектура RDNA.
⇡#Переработанная структура кешей
Как мы уже писали выше, исполнение инструкций с темпом в один такт, на который рассчитана архитектура RDNA, делает ее уязвимой к задержкам исполнения, вызванным ожиданием данных, а значит чип Navi особенно требователен к организации стека памяти — от внутренних кешей Compute Unit’а до интерфейса оперативной памяти. Ведь даже чипы GCN, для которых характерна латентность исполнения инструкции в четыре такта (включая «Вегу» с чрезвычайно высокой ПСП, которую обеспечивает память HBM2) нуждаются в доступе к данным на коротком расстоянии и значительно выигрывают от разгона RAM. К счастью, создатели RDNA не обошли стороной этот момент и полностью преобразили структуру кешей графического процессора.
Отдельные CU в составе GCN и RDNA сгруппированы по несколько штук и пользуются несколькими типами разделяемых ресурсов — таких, как 32-килобайтный кеш инструкций и скалярный кеш объемом в 16 Кбайт. Однако если в чипах GCN эти хранилища были общими для четырех (а впоследствии трех) CU, то в RDNA группа связанных CU, называемая Workgroup Processor, уменьшена до двух участников, а конкуренция за общие ресурсы в результате ослабевает. Напротив, хранилище LDS (Local Data Store), которое представляет собой наиболее быстрый тип памяти после регистров векторных SIMD, теперь тоже стало общим для двух CU, несмотря на то, что объем LDS остался прежним (64 Кбайт). Впрочем, благодаря тому, что количество потоков на отдельно взятый CU при работе с 32-поточными wavefront’ами сократилось вдвое, это изменение также ни в коем случае нельзя рассматривать как шаг назад по сравнению с GCN.
Не менее грандиозные изменения произошли на следующих уровнях стека памяти RDNA: 16-килобайтный кеш L1 в пределах отдельно взятого CU теперь считается кешем нулевого уровня, а попутно инженеры AMD увеличили его ассоциативность с 4 до 32-каналов (а это, в свою очередь, значительно влияет на процент попаданий в кеш) и нарастили вдвое пропускную способность дороги к векторным ALU. Место старого L1 в иерархии памяти RDNA теперь занимает громадный 128-килобайтный кеш, доступный десяти Compute Unit’ам, с 16-канальной ассоциативностью. Он должен снять значительную часть нагрузки с кеша L2, ведь последний обошелся без значительных изменений после предыдущей итерации в чипах Vega: при 16-канальной ассоциативности и объеме в 4 Мбайт кеш L2 чипа Navi связан, с одной стороны, с каждой секцией L1, а с другой — посредством шины Infinity Fabric — с контроллерами RAM и uncore-компонентами SoC (блоками DMA для коммуникации между дискретными GPU, кодеком видеопотока и т.д.).
И наконец, в дополнение к очередной оптимизации алгоритмов компрессии цвета, RDNA допускает передачу сжатых данных по тем участкам конвейера рендеринга, где в GCN было разрешено только движение «сырых» данных. Шейдерные программы могут считывать и записывать компрессированный цвет не только в RAM, но и кеш-память L1 и L2 (шейдерам в Polaris и Vega было позволено только чтение). Также возможна передача сжатого цвета из L2 в контроллер дисплея.
⇡#Графический процессор Navi 10
Наиболее крупной структурой в организации компонентов чипа Navi является Shader Engine. В составе Navi 10 их два — каждый содержит по 20 CU и массив конвейеров растеризации (ROP). Таким образом, полнофункциональная версия Navi 10 включает 2560 шейдерных ALU и 160 блоков фильтрации текстур. Среди чипов прошлого поколения можно безошибочно назвать аналог подобной конфигурации — это старший чип семейства Polaris. Только Polaris, несмотря на две ревизии после его дебюта в составе Radeon RX 480, таки не появился в коммерческих устройствах с полностью активным набором вычислительных блоков — во всех видеокартах на его основе разблокированы только 36 CU.
Однако между Polaris и Navi можно обнаружить существенные различиях, выходящие за пределы внутренней организации Compute Unit’ов, которую мы обсуждали до сих пор — начиная с того, что Navi досталось вдвое больше ROP: 64 вместо 32. Это совершенно необходимое изменение back-end’a GPU в свете того, что от RDNA ожидается повышенная эффективность в 3D-рендеринге — считается, что Polaris избегал «пузырей», возникающих при ожидании отработки ROP, попросту за счет общего недостатка эффективной загрузки шейдерных ALU.
Впечатляющий пиксельный филлрейт, который развивают 64 конвейера растеризации, сочетается с поддержкой оперативной памяти типа GDDR6. Navi 10, как и старший Polaris, обходится 256-битной шиной RAM, но высокая пропускная способность GDDR6 (14 Гбит/с на контакт) гарантирует необходимую более эффективной архитектуре скорость доступа к данным. Полная ревизия стека памяти, которую провели инженеры AMD в чипе Navi, заканчивается поддержкой удаленных коммуникаций по шине PCI Express четвертого поколения. Впрочем, увидеть PCI Express 4.0 в деле на первых порах позволит только собственная платформа AMD с процессорами Ryzen 3000-й серии, а Navi 10 в любом случае не сможет загрузить настолько быстрый канал связи с CPU.
Front-end чипа представлен блоками обработки геометрических примитивов, причем AMD изменила конфигурацию ранних стадий аппаратного конвейера таким образом, что часть геометрической логики осталась в пределах Compute Engine (познакомьтесь с еще одним термином архитектуры чипов AMD) — структуры, объединяющей половину всего содержимого Shader Engine, — а общий геометрический процессор, занятый отсечением невидимых полигонов, вынесен за ее пределы поближе к командным процессорам ACE (Asynchronous Compute Engine), распределяющим потоки шейдерных вычислений между Compute Unit’ами.
Всего Navi 10 может получить вплоть до четырех геометрических примитивов, прошедших стадию фильтрации невидимых поверхностей — как Vega, однако напомним, что в составе полностью функционального чипа Vega на 60 % больше шейдерных ALU и блоков фильтрации текстур, так что пропорция между мощностью геометрического front-end’a и основных ресурсов, обеспечивающих текстурирование и работу шейдерных kernel’ов, в Navi явно улучшилась.
Драйвер GPU автоматически включает тайловый рендеринг, появившийся в графических процессорах Vega, для того, чтобы сократить обращения к оперативной памяти и удержать данные, необходимые для растеризации и шейдеров, в пределах кеша L2. А вот каким образом AMD поступила с альтернативным конвейером NGG (Next Generation Geometry), остается загадкой. Vega обещала нарастить пропускную способность геометрического процессора с 4 до 17 примитивов за такт при условии, что код приложений научится использовать т.н. примитивные шейдеры (Primitive Shaders). До сих пор эта возможность не была использована на практике — ни в игровых движках, ни в виде расширений API так и не появилась поддержка Primitive Shaders спустя без малого два года жизни Vega на рынке игровых ускорителей.
Что касается упомянутых блоков ACE (Asynchronous Compute Engine), то и они научились новым трюкам. В RDNA доступна такая функция, как Asynchronous Compute Tunneling (ACT). Она оперирует на уровне очередей инструкций, которые драйвер видеокарты получает от графического API — в отличие от preemption и других методов, работающих на уровне wavefront’ов и отдельных цепочек данных для векторных ALU (к примеру, Direct3D 12 поддерживает одну очередь для рендеринга и несколько для неграфических расчетов). Благодаря ACT графический процессор способен мгновенно приостановить прием дальнейших инструкций из очередей, имеющих низкий приоритет, ради того, чтобы закончить критически важную работу из другой очереди. Главной целью подобных оптимизаций, разумеется, является VR. Разработчики «железа» продолжают уделять шлемам виртуальной реальности повышенное внимание, несмотря на то, к какому плачевному состоянию сегодня пришла эта, когда-то перспективная, идея.
Однако все те нововведения, которые вобрал в себя чип Navi 10, не достались бесплатно с точки зрения компонентного бюджета. Старший Polaris при такой же конфигурации основных вычислительных блоков обходится скромными 5,7 млрд транзисторов, а для того, чтобы построить Navi 10, понадобилось уже 10,3 млрд — так много места занимает дополнительная управляющая логика и разбухшая система кешей. Неудивительно, что AMD оставит архитектуру GCN для ускорителей неграфических расчетов, ведь всю эту площадь можно попросту забить шейдерными ALU, которым GCN всегда найдет работу в GP-GPU.
Для того, чтобы эффективно задействовать ресурсы чипа в играх, с такими жертвами волей-неволей приходится мириться. Графические процессоры NVIDIA тоже набирали вес с каждым поколением, а ведь масштаб изменений в архитектуре RDNA можно сравнить одновременно с двумя крупнейшими переходами, которые совершил конкурент, — от Kepler к Maxwell и от Pascal к Turing.
Во всяком случае, техпроцесс 7 нм позволяет упаковывать дополнительные транзисторы намного компактнее, чем при норме 14 нм. Площадь Navi 10 составляет 251 мм2 — немногим больше, чем у Polaris 10/20, а плотность компонентов возросла на 67 %. Куда важнее то, что в играх Navi 10 сулит повысить удельное быстродействие на площадь чипа в 2,3 раза по сравнению с Vega 10, а быстродействие на ватт — на 48 %. Примечательно, что львиную долю выигранной мощности AMD относит именно на счет архитектуры RDNA, в то время как отдельно взятая смена технологической нормы с 14 на 7 нм дала только 11 %. Немалый вклад в энергоэффективность Navi внесла и схемотехника кристалла — в этой части команда Radeon позаимствовала лучшие методы у создателей Ryzen.