Страница 4: GPU

Что скрывается за потоковым процессором, блоком шейдеров или ядром CUDA?

Ядро CUDA, потоковый процессор, блок шейдеров – все это синонимы вычислительного блока GPU, который выполняет расчет данных. NVIDIA по традиции называет их ядрами CUDA, где CUDA расшифровывается как Compute Unified Device Architecture. Ядра CUDA отличаются от ядер процессора, они намного менее сложные и имеют высокую степень специализации под обрабатываемые данные. GPU сегодня умеют намного больше, чем выполнять рендеринг графики через конвейер, поэтому унификация под названиями потоковый процессор или унифицированный блок шейдеров вполне обоснована.

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

Впрочем, потоковые процессоры - довольно общий термин, на практике у современных GPU все сложнее. GPU могут выполнять как вычисления с плавающей запятой (FP), так и целочисленные (INT) с различной точностью. Для графики важнее всего вычисления FP32 и INT32 с 32-битной точностью. В случае научных расчетов все более важными являются расчеты с более высокой точностью, а именно FP64. Поэтому в GPU появились выделенные вычислительные блоки для типа данных FP64. Впрочем, далеко не для всех расчетов нужна точность с 32 и 64 битами. Были разработаны способы выполнения менее точных вычислений на блоках INT32, например, одновременное выполнение операций над двумя 16-битными целыми числами.

Еще одним шагом дальше можно назвать интеграцию ядер Tensor в архитектуре NVIDIA Ampere, которые способны эффективно выполнять менее сложные вычисления INT8 и INT4, но об этом мы поговорим чуть позже.

Ниже на примере архитектуры Ada Lovelace мы рассмотрим структуру вычислительных блоков, ведь в GPU не просто несколько тысяч шейдерных блоков, они организованы определенным образом.

В составе GPU AD102 имеются 12 кластеров Graphics Processing Clusters (GPC) с 12 потоковыми мультипроцессорами Streaming Multiprocessors (SM) каждый. Но на видеокартах GeForce RTX 4090 и GeForce RTX 4080 активны не все SM. AD102 GPU теоретически содержит 18.432 блока FP32 (12 GPC x 12 SM x 128 блоков FP32). Но у GeForce RTX 4090 16 SM отключены, поэтому видеокарта предлагает «всего» 16.384 блока FP32. Такой подход повышает выход годных чипов NVIDIA, поскольку наличие нескольких дефектных SM не приводит к отбраковке кристалла.

В GeForce RTX 4080 уже используется более компактный GPU AD103, который имеет в общей сложности 8 SM, 6 из которых активны, что дает 9.728 потоковых процессоров. Для GeForce RTX 4070 Ti и GeForce RTX 4070 используется GPU AD104. Ниже NVIDIA расположила GPU AD106 и AD107, которые устанавливаются в видеокарты GeForce RTX 4060 (Ti). О том, что это GPU проектировались для ноутбуков, говорит и тот факт, что интерфейс PCI Express сокращен до восьми линий.

Одновременное выполнение операций с целыми числами и числами с плавающей запятой

Как мы уже упоминали, вычислительные блоки FP32 могут работать в режиме 2x FP16, то же самое касается INT16. Чтобы увеличить вычислительную производительность и сделать ее более гибкой, в архитектуре NVIDIA Turing появилась возможность одновременного расчета чисел с плавающей запятой и целых чисел. Конечно, подобная возможность сохранилась и в архитектурах Ampere и Ada Lovelace. NVIDIA проанализировала данные вычисления в конвейере рендеринга в десятках игр, обнаружив, что на каждые 100 расчетов FP выполняется примерно треть вычислений INT. Впрочем, значение среднее, на практике оно меняется от 20% до 50%. Конечно, если вычисления FP и INT будут выполняться одновременно, то конвейеру придется иногда "подтормаживать" в случае взаимных связей.

Соотношение 1/3 INT32 и 2/3 FP32 отражено в структуре Streaming Multiprocessor (SM), составляющем элементе архитектуры Ada Lovelace. NVIDIA удвоила число вычислительных блоков FP32 на каждый SM. Вместо 64 блоков FP32 на SM, их теперь насчитывается 128. Плюс 64 блока INT32. Теперь на квадрант SM насчитывается два пути данных, некоторые могут работать параллельно. Один из путей данных содержит 16 блоков FP32, то есть может выполнять 16 вычислений FP32 за такт. Второй путь данных содержит по 16 блоков FP32 и INT32. Каждый из квадрантов SM может выполнять либо 32 операции FP32, либо по 16 операций FP32 и INT32 за такт. Если же брать SM целиком, то возможно выполнение 128 операций FP32 или по 64 операции FP32 и INT32 за такт.

Параллельное выполнение продолжается и на других блоках. Например, ядра RT и Tensor могут работать параллельно в конвейере рендеринга, что снижает время, требующееся на рендеринг кадра.

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

Текстурные блоки

Потоковые процессоры выполняют так называемые шейдеры - небольшие программы. Вершинные шейдеры используются для геометрических вычислений и динамического изменения объектов. Геометрические шейдеры позволяют рассчитать финальную геометрию и структуру объекта из точек, линий и треугольников. Шейдеры тесселяции обеспечивают дальнейшее разделение примитивов (тех же треугольников).

Текстурные блоки Texture Mapping Units (TMU) отвечают за то, чтобы все поверхности были покрыты соответствующими текстурами. TMU - выделенные вычислительные блоки GPU. В случае архитектуры Ada Lovelace, один текстурный блок дополняет 16 потоковых процессоров. Данные для текстурных блоков хранятся в видеопамяти, их можно считывать оттуда и записывать. Поскольку TMU уже не являются внешними вычислительными блоками в полном понимании, а встроены в конвейер рендеринга, каждый текстурный блок может обрабатывать объекты по нескольку раз.

Действительно, для рендеринга объекта простых текстур уже недостаточно, использование нескольких слоев позволяет, например, получить 3D-эффект вместо плоской текстуры. Раньше объекты приходилось рассчитывать на конвейере несколько раз, и каждый проход текстурный блок накладывал текстуру, сегодня достаточно одного процесса рендеринга, текстурный блок может получать данные объекта для многократной обработки из буфера.

Контроллер памяти

Высокая пропускная способность памяти не менее важна, чем вычислительная производительность GPU. Только если данные можно будет быстро считывать из видеопамяти на GPU и записывать их обратно, вычисления будут проводиться достаточно быстро. На заднем плане здесь можно представить GPU, выполняющий вычисления, а на переднем - систему кэшей и памяти. Архитектуры GPU разрабатываются с учетом доступной пропускной способности памяти, иногда им необходима высокая пропускную способность, но в других случаях зависимость, напротив, снижается. Впрочем, как правило, производители пытаются добиться самой высокой пропускной способности памяти. И контроллер памяти здесь имеет решающее значение.

Помимо изменений в SM, новая архитектура NVIDIA получила оптимизированную структуру конвейеров растровых операций (ROP), а также соединения ROP и контроллера памяти. До поколения Turing ROP всегда подключались к интерфейсу памяти. И на каждый 32-битный контроллер памяти приходилось восемь ROP. Если число контроллеров памяти и ширина шины менялись, то же самое касалось и ROP. В архитектуре Ada Lovelace ROP перенесены в GPC. Используются два раздела ROP на GPC, каждый раздел содержит восемь ROP.

Что дает иную формулу вычисления ROP на GeForce RTX 4090. 11 GPC с 2x 8 ROP на каждом дают 176 ROP. У GeForce RTX 4080 работают семь GPC с 2x 8 ROP, что дает 112 ROP. NVIDIA намеренно интегрировала ROP глубже, чтобы задняя часть конвейера рендеринга меньше зависела от интерфейса памяти. Например, видеокарта GeForce RTX 4080 использует 256-битный интерфейс памяти, но содержит 112 ROP, а не 64 ROP.

Интерфейс памяти разделен на 32-битные блоки. В зависимости от желаемой ширины интерфейса памяти или емкости, их можно набирать в произвольном количестве.

Кэши L1 и L2

Размер кэша L1 составляет 128 кбайт для четырех SM. Однако кэш L2 значительно больше. Полный графический процессор AD102 имеет кэш L2 емкостью 98.304 кбайт, то есть почти 100 Мбайт. В стадии расширения GeForce RTX 4090 GPU имеет 73.728 кбайт. У GPU GA102 было всего 6.144 кбайт кэша L2. Как видим, NVIDIA увеличила кэш L2 в 12 раз и, конечно, надеется минимизировать «узкие места» при доступе к видеопамяти.

Ядра RT третьего поколения

Блоки трассировки лучей 3-го поколения или RT-ядра Ada Lovelace имеют вдвое большую пропускную способность, чем их предшественники, увеличивая производительность трассировки лучей до 2,8 раз. Для GeForce RTX 4090 это теоретически означает 191 RT TFLOPS, по сравнению с 78 RT TFLOPS для GeForce RTX 3090 Ti.

Кроме того, ядра RT 3-го поколения получили такие функции, как Opacity Micro-Map Engines и Micro-Mesh Engines. Это новые специализированные аппаратные блоки, которые ускоряют наиболее требовательные нагрузки трассировки лучей.

Мы хотели бы рассказать о Opacity Micro-Map Engines и Micro-Mesh Engines более подробно.

Opacity Micro-Maps представляют собой оптимизацию расчета трассировки лучей. Трассировка лучей не очень хорошо справляется с некоторыми объектами, например, листвой и растительностью. Лучи могут отражаться в бессчетных направлениях между листьями и ветвями, поэтому подобные объекты значительно осложняют трассировку. Третье поколение ядер RT может использовать Opacity Micro-Maps для присвоения статуса прозрачности подобным элементам, которые могут быть непрозрачными, прозрачными или неизвестными. Для сложных объектов ранее трассировка лучей не использовалась или применялась в облегченном виде. Opacity Micro-Maps должны учитывать подобные объекты в будущем.

Ядра RT третьего поколения генерируют Displaced Micro-Meshes (DMM). Дерево BVH (bounding volume hierarchies), которое используется для трассировки лучей, будет строиться до 10 раз быстрее и потреблять в 20 раз меньше видеопамяти. NVIDIA описывает DMM следующим образом: «DMM – это новые примитивы, представляющие собой структурированную сетку микротреугольников, которые вычислительные блоки RT 3-го поколения обрабатывают нативно. В результате снижаются требования к памяти и вычислительной производительности при рендеринге сложной геометрии с использованием простых треугольников по сравнению с предыдущими поколениями».

Ядра Tensor 4-го поколения и DLSS 3

Технология Deep Learning Super Sampling в третьей версии получила различные оптимизации. Улучшенные ядра Tensor четвертого поколения обеспечивают рост вычислительной производительности FP8 до 5x по сравнению с ядрами Tensor третьего поколения.

В DLSS 3 используются так называемые ускорители Optical Flow (OFA). Они вычисляют данные о движении пикселей из нескольких кадров для нейронной сети DLSS. Однако мы еще вернемся к этому в контексте DLSS 3 и реконструкции лучей, а также генерации кадров.

Shader Execution Reordering

Shader Execution Reordering (SER) используется для эффективного объединения вычислений в конвейере, чтобы вычислительные блоки всегда были задействованы максимально эффективно. SER позволяет повысить производительность выполнения шейдеров в 2 раза и увеличить частоту кадров в игре на 25%.