Как работают видеокарты?
Самое время поговорить о видеокартах. Не о их дефиците и коррумпированности производителей и ритейла, а именно о полезных свойствах, которые они обеспечивают. И как так получается, что с определенным типом вычислений видеокарты справляются быстрее процессоров.
С момента, как 3dfx выпустила первый 3D-акселератор Voodoo, ни один другой ПК-компонент так сильно не влиял на то, может ли ваш компьютер считаться хорошей игровой машиной или нет, как видеокарта. Безусловно, другие «запчасти» для ПК тоже важны, но даже если у вас будет топовая система с 32 Гб RAM-памяти, процессором за 4 тысячи долларов и PCIe-накопителем, она всё равно, скорее всего, загнётся в попытке запустить современную AAA-игру на видеокарте 10-летней давности с нынешними разрешением и уровнем детализации. Графические карты (они же GPU – от англ. «graphics processing units», что можно перевести как «модуль для обработки графики») критически важны для игровой производительности и мы пишем о них постоянно. Но вот о том, как они работают, мы рассказывали лишь вскользь.
Это очень широкая тема, так что здесь будет лишь общий обзор функциональности GPU, затрагивающий и AMD, и NVIDIA, и интегрированные карты Intel, и все прочие Intel’овские GPU, которые компания планирует выпустить в будущем. Кроме того, это касается и мобильных GPU от Apple, Imagination Technologies, Qualcomm, ARM и так далее.
Почему бы не рендерить графику на CPU?
Хороший вопрос. По правде говоря, графические данные можно обрабатывать напрямую в CPU. Ранние 3D-игры, которые выходили до нашествия видеокарт – вроде Ultima Underworld – работали полностью на CPU. Эта игра, кстати, служит хорошим примером по множеству разных причин – у неё был более продвинутый рендеринг-движок, чем у игр вроде Doom: в нём была возможность смотреть вверх и вниз, а также ещё более продвинутые функции вроде наложения текстур. Но всё это далось большой ценой – мало у кого был ПК, способный осилить такую игру.
На заре 3D-эпохи у многих игр вроде Half-Life и Quake II был программный обработчик графики, который позволял играть в них тем, у кого не было 3D-ускорителей. Но в дальнейшем от этого решения пришлось отказаться, и причина проста: CPU – это микропроцессоры общего назначения, то есть они лишены специализированного «железа» и функций, которые есть у GPU. Современный CPU с лёгкостью справится с играми, 18 лет назад тормозившими в режиме программного рендеринга, но ни один CPU на планете Земля не способен совладать с современной AAA-игрой, если запустить её в таком режиме. По крайней мере, без значительных изменений в детализации сцен, разрешении и различных визуальных эффектах.
В качестве забавного примера: вы можете запустить Crysis на Threadripper 3990X в режиме программного рендера, но результат будет далеко не так хорош, как хотелось бы.
Что такое GPU?
GPU – это устройство с аппаратными возможностями, которые разработаны специально под то, как различные 3D-движки обрабатывают свой код, включая настройку и расчет геометрии, наложение текстур, доступ к памяти и шейдеры. То есть существует взаимосвязь между тем, как функционируют 3D-движки, и тем, как производители GPU конструируют своё «железо». Возможно, некоторые из вас помнят, что семейство AMD HD 5000 использовало архитектуру VLIW5, тогда как некоторые топовые GPU в семействе HD 6000 имели архитектуру VLIW4. В архитектуре GCN компания изменила свой подход к параллельным вычислениям – в целях улучшения производительности на тактовый цикл.
В RDNA – архитектуре, которая последовала за GCN – AMD решила поднажать на показатель IPC (от англ. «instructions per cycle», т.е. «количество команд, выполняемых за такт»), в итоге повысив его на 25%. Архитектура RDNA2 унаследовала это улучшение, а также получила дополнительные функции вроде огромного кэша L3, что тоже положительно повлияло на производительность.
Ultima Underworld
Первой термином «GPU» воспользовалась компания NVIDIA при запуске оригинальной GeForce 256, где вычисления, связанные с освещением и трансформацией геометрии, выполнялись аппаратно (примерно в то же время Microsoft выпустила DirectX 7). Встраивание специализированного функционала прямо в «железо» стало отличительной чертой ранних этапов развития технологии GPU. Многие из этих специализированных техник используются до сих пор (в самых разных формах). Быстрее и энергоэффективнее обрабатывать специализированные задачи на встроенных в чип специализированных устройствах, чем пытаться проделать всю работу в одном массиве программных ядер.
Между GPU- и CPU-ядрами есть много отличий, но суть в следующем. CPU обычно предназначены для максимально быстрого и эффективного выполнения однопоточного кода. Улучшить это помогают функции вроде SMT/гиперпоточности, но многопоточность можно обеспечить и поместив рядом друг с другом высокоэффективные однопоточные ядра. На данный момент самые большие CPU – это 64-ядерные, 128-поточные процессоры Epyc от AMD. То есть для сравнения – самый слабый GPU на основе NVIDIA-архитектуры Pascal оснащён 384 ядрами, тогда как самое большое количество ядер у x86-процессора на рынке – это 64. Термин «ядро» в терминологии GPU – это гораздо более маленький процессор.
Примечание: Нельзя сравнивать или оценивать относительную игровую производительность GPU от AMD, NVIDIA и Intel лишь на основе количества GPU-ядер. Но если речь об отдельных GPU-семействах (например, о Nvidia GeForce GTX 10 или AMD RX 4xx/5xx), то да, здесь большее количество GPU-ядер означает и более высокую игровую производительность. К слову, терафлопсы – это тоже не лучший способ сравнения GPU друг с другом.
Причина, по которой не стоит делать спешных выводов о производительности GPU разных производителей и семейств, опираясь лишь на количество ядер, заключается в том, что у разных архитектур – разная степень эффективности. В отличие от CPU, GPU предназначены для параллельных вычислений. Видеокарты обеих компаний состоят из вычислительных блоков. NVIDIA называет эти блоки потоковыми мультипроцессорами (SM – от англ. «streaming multiprocessor»), а AMD – вычислительными блоками (CU – от англ. «compute unit»).
Каждый блок состоит из группы ядер, планировщика, регистрового файла, кэша команд, кэша текстур и кэша L1, а также блоков для наложения текстур (их также называют блоками для текстурирования или текстурными блоками). То есть SM/CU – это что-то типа самого маленького функционального блока GPU. В нём находится далеко не всё – движки для декодирования видео, средства для рендеринга изображения на экране и интерфейсы памяти, используемые для коммуникации со встроенной VRAM-памятью находятся за их пределами – но когда AMD говорит, что её APU оснащён 8 или 11 вычислительными блоками Vega, то имеет в виду именно эти блоки. И если взглянуть на схему любого GPU, то можно заметить, что эти SM/CU дублируются в них огромное количество раз.
Чем больше количество SM/CU в GPU, тем больше параллельных вычислений он способен выполнить за один такт. К слову, рендеринг относится к типу задач, которые иногда называют «чрезвычайно параллельными», что означает, что с увеличением количества вычислительных блоков значительно растёт и улучшение эффективности самого процесса.
Говоря об устройстве GPU, мы часто используем обозначение вроде 4096:160:64. Первое число – это количество GPU-ядер. Чем оно больше, тем быстрее GPU, но с условием, если вы сравниваете GPU из одного и того же семейства (GTX 970 с GTX 980 или GTX 980 Ti, RX 560 с RX 580 и т.д.).
Наложение текстур и вывод отрендеренного изображения
У GPU есть и два других важных компонента – блоки наложения текстур и блоки рендеринга. От количества блоков наложения текстур зависит количество генерируемых текселей и то, как быстро GPU будет выполнять адресацию и наложение текстур на объекты. В ранних 3D-играх текстурирование использовалось мало, потому что отрисовка трёхмерных полигональных фигур была достаточно сложной задачей. По сути, текстуры – это необязательный элемент 3D-игр, однако сейчас список игр, в которых вообще нет текстур, крайне невелик.
Вторым числом в 4096:160:64 идёт количество блоков наложения текстур. У видеокарт AMD, NVIDIA и Intel это число, как правило, меняется плавно – по мере перехода от самого слабого к самому мощному GPU в семействе. Другими словами, вы вряд ли увидите GPU с 160 текстурными блоками (4096:160:64), а рядом – GPU сразу с 320 текстурными блоками (4096:320:64). В играх наложение текстур может запросто стать бутылочным горлышком, но у более топового GPU в линейке всегда как минимум больше ядер и блоков наложения текстур (будет ли у него больше блоков рендеринга, зависит от семейства и конфигурации карты).
Блоки рендеринга (которые также называют блоками растеризации) – это то, где результат работы GPU собирается в изображение, которое затем будет показано на мониторе или телевизоре. От количества блоков рендеринга и тактовой частоты GPU зависит показатель пиксельной скорости заполнения. Чем больше количество блоков рендеринга, тем больше одновременно отрисовываемых пикселей. Блоки рендеринга также отвечают за сглаживание (AA), поэтому включение AA – особенно SSAA, т.е. избыточной выборки сглаживания – может привести к значительному снижению пиксельной скорости заполнения.
Тензорные ядра – подходящие для задач машинного обучения, и нашедшие применение в играх, например в технологии умного масштабирования разрешения DLSS.
Пропускная способность и ёмкость памяти
Последние две характеристики, которые мы здесь обсудим – это пропускная способность памяти и её объём. Пропускная способность – это то, сколько данных в секунду может быть скопировано в и из VRAM-буфера GPU. Чтобы сохранить приемлемый фреймрейт (количество кадров в секунду), более продвинутым визуальным эффектам (и, как правило, более высокому разрешению) как раз требуется память с более высокой пропускной способностью, поскольку это дополнительная нагрузка, увеличивающая общее количество данных, копируемых в и из GPU-ядер.
В некоторых случаях маленькая пропускная способность может стать серьёзным бутылочным горлышком для GPU. APU производства AMD вроде Ryzen 5 3400G имеют очень маленькую пропускную способность, и это значит, что увеличение тактовой частоты DDR4 может серьёзно повлиять на общую производительность GPU. Выбор игрового движка – и целевого разрешения игры – тоже может оказать большое влияние на то, насколько большая пропускная способность должна быть у GPU, чтобы справиться с этими задачами.
Ещё один критически важный фактор GPU – это общее количество встроенной памяти. Если количество VRAM-памяти, необходимое для запуска с текущим уровнем детализации или разрешением, превосходит доступные ресурсы, игра зачастую запустится, но ей также придётся воспользоваться оперативной памятью для хранения дополнительных текстурных данных. А у GPU уходит гораздо больше времени на вывод данных из DRAM, чем из VRAM-памяти, специально предназначенной для этой цели. Это приводит к серьёзным подвисаниям, так как игра мечется между выводом данных из быстрого пула локальной памяти и общей RAM.
Мы заметили, что иногда производители GPU оснащают карты нижней и средней ценовой категории большей VRAM-памятью, чем у стандартной модели, с целью выручить за этот продукт чуть больше денег. Мы затрудняемся точно сказать, стоит ли покупать такую карту, потому что это очень сильно зависит от конкретного GPU. Но что мы можем сказать наверняка, так это то, что во многих случаях платить больше за карту, оснащённую лишь увеличенной VRAM-памятью, не стоит. Опыт показывает, что GPU нижней ценовой категории склонны упираться в другие бутылочные горлышки, прежде чем дело дойдёт до самой VRAM. Если сомневаетесь, лучше почитайте обзоры на карту и сравните, как 8-гигабайтная версия показывает себя относительно 12-гигабайтной (или какое там количество гигабайт будет в вашем случае). Зачастую – с условием, что во всём остальном карты более-менее идентичны – обнаруживается, что более высокое количество VRAM-памяти не стоит того, чтобы за него переплачивать.
По материалам ExtremeTech