Графический процессор — «сердце» видеокарты. Он производит расчеты в играх и некоторых программах, которые умеют его использовать. Как устроен ГП внутри, какие блоки находятся в его составе, и как они работают?
Графический процессор (ГП) видеокарты — вычислительный чип, имеющий непростое внутреннее устройство. Современные топовые ГП технически сложнее, чем многоядерные центральные процессоры. А все потому, что вычислительные блоки в них хоть и устроены проще, но их количество в разы больше.
Из каких частей состоит графический процессор? За что они отвечают, как работают, и как связаны между собой? Разбираем по порядку.
Шейдерные процессоры
В центральном процессоре расчеты производят вычислительные ядра. В ГП базовым вычислительным элементом является шейдерный процессор (Shader Processor, SP). До 2006 года шейдерные процессоры делились на вершинные и пиксельные. Первые вычисляли пространственные координаты вершин полигонов, необходимые для переноса 3D-картинки в двухмерное изображение на мониторе. Вторые занимались вычислением цвета каждой точки этого изображения с учетом данных о ее освещении. Современные ГП оснащены универсальными шейдерными процессорами, которые могут выполнять оба вида вычислений, а также генерировать новую геометрию на основе уже имеющихся вершин. Вдобавок к этому они поддерживают неграфические вычисления, благодаря которым мощь ГП можно задействовать в некоторых программах — например, для обработки и конвертации видео.
NVIDIA называет свои шейдерные процессоры CUDA-ядрами — в честь одноименного API CUDA, разработанного компанией и предназначенного для вычислений на ГП собственного производства. Несмотря на другое название, их внутреннее устройство довольно схоже с шейдерными процессорами конкурентов — AMD и Intel.
Текстурные блоки
Текстурные блоки (Texture Mapping Unit, TMU) занимаются выборкой, наложением и фильтрацией игровых текстур. В каждом TMU имеются блоки адресации (Texture Address, TA) и фильтрации (Texture Filtering, TF).
С помощью блоков адресации TMU «натягивают» текстуры на полигоны, которые рассчитали шейдерные процессоры.
А с помощью блоков фильтрации они могут применять к текстурам один из видов фильтрации для их более четкого отображения: билинейную, трилинейную или анизотропную.
Растровые блоки
Блоки растровых операций (Render Output Unit, ROP) занимаются финальным этапом появления 3D-изображения на экране — растеризацией.
ROP собирают информацию от шейдерных процессоров и текстурных модулей. С помощью них эти блоки вычисляют конечное значение цвета для каждой точки двухмерного изображения, которое появляется на экране.
Некоторые методы сглаживания используют для своей работы именно блоки растровых операций — например, MSAA, SSAA и AAA.
Блоки трассировки лучей
Современные графические процессоры оснащены специальными блоками, которые занимаются трассировкой лучей. Их также называют RT-ядрами (Ray Tracing Core).
RT-ядра просчитывают пересечения лучей с полигонами и боксами иерархии ограничивающих объемов (BVH), в которые помещаются 3D-объекты для более эффективных и быстрых расчетов трассировки лучей.
Блоки матричных вычислений
Основная масса вычислений, необходимая для рендера игровой графики — это расчеты с 32-битной точностью. Иногда можно встретить и 16-битные графические расчеты, которые могут производиться с целью упрощения некоторых операций и повышения производительности. Однако в общем количестве их процент достаточно мал. Такие расчеты выполняют шейдерные процессоры ГП, оптимизированные под 32-битную точность. Однако есть целая категория вычислений, для которой столь точные расчеты попросту не нужны. К ним относятся технологии «умного» масштабирования изображения NVIDIA DLSS, AMD FSR и Intel XeSS. Аналогичных расчетов достаточно для подавления шумов, которые появляются при трассировке лучей, а также некоторых неигровых вычислений — например, нейросетей и программных продуктов на их базе.
Расчеты пониженной точности многие современные графические процессоры выполняют с помощью отдельных блоков матричных вычислений. Для всего вышеописанного парка технологий могут использоваться 16-битные расчеты, но более эффективны менее точные: восьми-, четырех- или даже двухбитные. Чем меньше точность, тем быстрее эти вычисления выполняются на матричных блоках.
Как и шейдерные процессоры, такие блоки относятся к вычислительным. Но в силу пониженной точности вычислений они устроены заметно проще, чем SP. NVIDIA называет их тензорными ядрами, Intel – матричными ядрами XMX. В ГП AMD выделенные блоки для таких расчетов отсутствуют, но имеется возможность переключить шейдерные процессоры в альтернативный режим работы с помощью специальных блоков матричного ускорения.
Вычислительные модули
Все вышеописанные блоки — это базовые «кирпичики» графического процессора. Из них формируются более крупные вычислительные модули. В каждом поколении графической архитектуры соотношение блоков в вычислительных модулях отличается, но их общие принципы устройства остаются довольно схожими для всех ГП.
У ГП NVIDIA самый маленький вычислительный модуль — потоковый мультипроцессор (Streaming Multiprocessor, SM). К примеру, в видеокарте RTX4090 такой модуль разделен на четыре части, в каждой из которой находится 32 ядра CUDA и одно тензорное ядро. По аналогии с ядром центрального процессора, каждая часть оснащена блоками загрузки данных и регистровым файлом. Общая часть SM содержит 128 КБ кэша, четыре TMU, RT-ядро и процессор обработки геометрии.
Два потоковых мультипроцессора объединены в кластер текстурной обработки (Texture Processing Cluster, TPC). Из шести TPC и 16 блоков ROP образуется один крупный графический вычислительный кластер (Graphics Processing Cluster, GPC) — вычислительная единица, содержащая все необходимое для работы с графикой. В каждом графическом процессоре таких кластеров несколько.
Cхоже устроены и ГП AMD, с тем отличием, что модули у них называются по-другому. Самым небольшим из них является вычислительный блок (Compute Unit, CU). Каждый CU современных моделей содержит 64 шейдерных процессора, четыре блока TMU, одно RT-ядро, кэш-память и регистровый файл. Два вычислительных блока объединяются в один процессор групповой обработки (Work Group Processor, WGP). Или как его еще называют, Dual CU.
В последнем поколении ГП Radeon RX7000 каждый CU вдобавок к этому набору имеет два блока матричного ускорения. Из восьми Dual CU и 32 ROP образуется один крупный шейдерный движок (Shader Engine, SE) — аналог графического вычислительного кластера от NVIDIA, содержащий в себе все необходимые блоки для работы с графикой. Аналогично конкуренту, в графических процессорах AMD таких шейдерных движков несколько.
В ГП Intel группировка модулей немного другая. Каждые 16 шейдерных процессоров здесь объединены в векторный движок (Xe Vector Engine, XVE). К нему присоединены два матричных блока XMX. 16 таких связок вкупе с регистровым файлом и кэшем образуют вычислительную единицу графического процессора — ядро XE.
Четыре ядра XE объединены в более крупный модуль Render Slice. Помимо ядер XE, в нем содержатся четыре RT-ядра, 16 блоков ROP и процессор обработки геометрии. Аналогично графическому вычислительному кластеру NVIDIA и шейдерному движку AMD, Render Slice имеет все нужные блоки для работы с графикой. Вычислительную часть графического процессора Intel образуют несколько подобных блоков.
Подсистема памяти
Все вычислительные блоки объединены общей шиной, к которой подключен второй уровень кэша (L2). У NVIDIA и Intel сразу после L2 информация поступает на контроллеры памяти, которые связывают ГП с микросхемами графической ОЗУ.
В отличие от двух других производителей, в ГП AMD блоки обработки геометрии и асинхронных вычислений выделены из состава вычислительных блоков и находятся рядом с кэшем L2. Вслед за ним следует память Infinity Cache, которая играет роль кэша третьего уровня, и лишь потом графическая ОЗУ.
Прочие блоки
Помимо уже упомянутых, в графическом процессоре содержатся и другие блоки, которые не относятся к вычислительным: