Вроде бы все понимают, что CPU нужен в качестве «головного мозга» компьютера, а GPU ускоряет задачи, связанные с графикой. Но мало кто знает, почему так происходит.
Задался вопросом, чем на уровне железа отличаются чипы тех же Intel и NVIDIA друг от друга. Вроде, оба сделаны из транзисторов, а по факту совершенно разные.
Давно хотел разобраться, и решил поделиться выводами с вами.
Ниже объясню разницу процессоров на трёх уровнях.
Сначала вспомним, какие задачи они выполняют, затем посмотрим на структуру каждого и в конце разберёмся, чем отличается ядро CPU от ядра GPU и почему главная разница кроется именно в этом различии.
Перепрыгивайте к нужному пункту:
- • Зачем нужны CPU и GPU
• Основная структура обоих чипов очень похожа
• Но ядра в CPU и GPU абсолютно разные
• Ядра CPU, часть 1. Универсальнее и быстрее, но очень сложные
• Ядра CPU, часть 2. Вычислительный модуль ALU как главная сила любого ядра
• Ядра GPU. Простой вычислительный модуль ALU, но их много
• Подводим итоги. Одна база, но разное масштабирование
Зачем нужны CPU и GPU
Процессор CPU выполняет разные задачи последовательно, а GPU одинаковые параллельно. Потому первый универсальный, а второй рассчитан под специфичные задачи
С целями, которые выполняют CPU и GPU, знакомы почти все, но коротко пропишу общую картину. Так будет проще понять, почему у процессоров разная архитектура.
Каждый чип выполняет свои задачи.
CPU:
◆ Нужен для работы операционной системы и фоновых процессов
◆ Запускает любые программы от простого блокнота до сложного фотошопа
◆ Обрабатывает сетевые подключения
◆ Быстро выполняет сложные специализированные задачи на логику
GPU:
◆ В разы ускоряет обработку и вывод графики
◆ Полезен в играх, рендеринге видео и 3D-программах
◆ Гладко воспроизводит 4К- и 8К-видео с высоким битрейтом (плотностью)
◆ Ускоряет интерфейс системы и страницы в браузере с поддержкой GPU
◆ Даёт использовать несколько мониторов
◆ Ускоряет оффлайн ИИ-функции
◆ Быстрее выполняет простые и повторяющиеся задачи
Их ключевое отличие в том, что CPU молниеносно выполняет сложные процессы один за другим, а GPU умеет обрабатывать тысячи простых процессов одновременно.
Чтобы понять, как это происходит, давайте посмотрим на компоненты, из которых эти чипы состоят.
Основная структура обоих чипов очень похожа
Дизайн процессора сильно зависит от производителя, но структура у всех похожа. Цвета соответствуют компонентам на картинках.
CPU содержит следующие компоненты:
🔵 Несколько сложных ядер (от 1 до 24 в обычных домашних компьютерах)
🟣 Контроллер памяти для коммуникации с RAM
🟡 Кэш трёх уровней (L1 в каждом ядре, L2 на несколько ядер, L3 на весь процессор)
🟣 Шина связи между компонентами (кольцевая шина)
🔴 Дополнительный блок для коммуникации чипа с остальными элементами компьютера (системный агент).
GPU имеет такие компоненты:
🔵 Тысячи простых ядер
🟣 Контроллер памяти для коммуникации с VRAM
🟡 Кэш обычно двух уровней (L1 на ядро и L2 на процессор)
🟣 Планировщик для управления компонентами (потоковый мультипроцессор)
🔴 Интерфейс для коммуникации с CPU
Как видите, в общих чертах набор компонентов похожий.
Если смотреть на операции, которые выполняют процессоры в целом, их главное отличие в том, что CPU выполняет в зависимости от количества ядер от одной до в среднем 32 операций за раз, а GPU способен выполнять тысячи операций.
Основная задача CPU – последовательно одна за другой исполнять сложные инструкции.
Основная задача GPU – параллельно выполнять тысячи одинаковых простых инструкций.
Чтобы эти отличия работали, в CPU и GPU ставят разные ядра. Их «состав» напрямую влияет на возможности процессора и количество тех самых ядер.
Но ядра в CPU и GPU абсолютно разные
Давайте на берегу определимся, что, всё-таки, называют ядром в процессоре.
Задача любого процессора на глубоком уровне – путём арифметических и логических расчётов преобразовать единицы и нули (биты), поступающие в виде инструкций от программ.
Ядро для выполнения этой задачи проводит сложение, вычитание, умножение, деление, логические операции (И, ИЛИ, НЕ), сравнение чисел (больше, меньше, равно) с помощью специальных арифметико-логических модулей ALU разного типа.
Ровно для этого ядра и есть в процессоре и на этом строится работа операционной системы и всех запущенных на ней программ.
Поскольку центральный процессор CPU играет роль головного мозга в вашем компьютере и смартфоне, он должен уметь делать сотни разных задач, по возможности одновременно.
Для этого нужно, чтобы ядро CPU выполняло все эти операции в их непредсказуемом разнообразии и моментально переключалось между ними.
У такой универсальности оказался один простой минус. Ядро CPU очень сложное в своей архитектуре и выполняет только одну большую операцию за раз, поэтому процессор не умеет быстро совершать простые логические операции в огромном объёме.
CPU плохо справляется с расчётом пикселей в картинке, генерацией видеопотока, просчётом геометрии и растеризацией графики в играх.
Чтобы это исправить, нужно увеличить число ядер, но упростить их.
Ядро GPU получилось, когда из ядра CPU убрали сложные операции ветвления и выполнения инструкций вне очереди, большие кэши, точные операции с плавающей запятой, и снизили его энергопотребление.
Так процессор смог выполнять простое умножение и сложение для одновременно сначала сотен, а потом тысяч одинаковых задач.
Поэтому GPU ускоряет все операции, связанные с изображениями.
Теперь посмотрим на устройство ядер в CPU и GPU, чтобы на физическом уровне разобраться, чем они отличатся друг от друга.
Ядра CPU, часть 1. Универсальнее и быстрее, но очень сложные
В большинстве современных CPU высокого класса ядра делятся на производительные с высокой тактовой частотой и энергоэффективные.
Это позволяет быстро выполнять сложные вычисления и выделить место для менее приоритетных, чаще всего фоновых или простых процессов.
Например, в процессоре Intel Core i9-14900K есть 8 мощных P-ядер и 16 энергоэффективных Е-ядер.
Здесь я опишу строение мощного и более сложного P-ядра.
Рассмотрим на примере задачи «Ввести текст в Word». Максимально простая схема.
1. Word отправляет задачу для выполнения ввода текста в язык операционной системы Windows
2. Windows интерпретирует эту задачу в инструкцию на язык системы
3. Windows смешивает инструкцию с другими инструкциями фоновых программ и самой системы
4. Поток направляется в процессор
5. Процессор разбивает инструкции и направляет на ядро или несколько ядер
6. Ядро декодирует инструкции на понятный транзисторам бинарный язык
7. Ядро разбивает декодированные инструкции на микропроцессы и обрабатывает их один за другим в последовательности, которую устанавливает сам.
8. Результат уходит в оперативную память и отображается на экране.Всё это происходит на некоторых этапах за десятые одной наносекунды (одна миллиардная секунды).
В P-ядре информация из оперативной памяти RAM и кэша третьего уровня L3 поступает в раздел Front End для первичной сортировки, а из него в Back End для исполнения.
Если упростить процесс до уровня разных модулей в одном ядре получаем следующую последовательность:
Front End
▪︎ Модули извлечения и предсказания ветвлений определяет порядок обработки поступивших инструкций
▪︎ Кэш процессора копит инструкции для декодирования в нужном порядке
▪︎ Декодер преобразует инструкции в микрооперации
Back End
▪︎ Распределитель снова сортирует микрооперации по нужным задачам и важности
▪︎ Арифметико-логические модули ALU разного типа обрабатывают микрооперации
▪︎ Преобразованные микрооперации направляются в кэш и освобождаются в виде готового результата
Теперь остановимся подробнее, как происходит обработка задачи в единой связке внутри ядра.
Попадая в Front End, в первую очередь задача попадает в модуль извлечения инструкций и предсказания ветвлений (Fetch&Predict). Модуль интерпретирует поступающие данные и на основе прошлых инструкций предсказывает, когда запустить следующий процесс.
▪︎ Поскольку этот модуль обрабатывает информацию быстрее, чем она может поступать, копия данных из RAM уходит во внутреннюю память чипа в виде разных модулей кэша. Они называются по-разному, например, есть кэш инструкции, кэш данных и второй уровень кэша L2.
▪︎ Из кэша инструкции операционной системы попадают в декодеры. Тут они обрабатываются в максимально совместимый вид для архитектура процессора, чтобы стать «микрооперациями» или uOp.
▪︎ Декодоры могут сократить изначальные инструкции в количестве, перевести их или разделить на менее крупные и тем самым увеличить количество микроопераций.
Иногда инструкции не декодируются сразу, а накапливаются в отдельном кэше декодирования, чтобы перевести их позже единым пакетом для увеличения энергоэффективности.
После декодирования микрооперации отправляются во вторую часть ядра, Back End.
Ядра CPU, часть 2. Вычислительный модуль ALU как главная сила любого ядра
Из распределителя микропроцессы uOp поступают в модули вычисления ALU разного типа. Эти модули составляют главную сложность и универсальность в архитектуре ядра CPU
В Back End микрооперация назначается в Распределитель, который распознаёт зависимость одной микрооперации от другой, и решает, в каком порядке и каким вычислительным модулем их нужно выполнять. Процесс называется Allocation (распределение).
▪︎ После распределения микрооперации отправляются в планировщик, где ждут своей очереди на выполнение.
▪︎ Далее микрооперация, наконец, попадает в арифметико-логический модуль ALU. То есть туда, где и происходит то самый процесс преобразования, от которого процессор CPU получил P в своём названии.
ALU (Arithmetic Logic Unit) является центральным модулем ядра и выполняет преобразования разного типа из арифметики и логики.
На разные операции в CPU есть разные модули ALU. Одни выполняют простое сложение и вычитание целых чисел, другие умножение, другие выполняют операции с плавающей запятой с разной точностью (простые FP32 и сложные FP64), операции с дробями и десятичными числами. Есть ALU, рассчитанные на обработку векторов.
▪︎ После исполнения просчитанная микрооперация направляется в кэш второго уровня L2 и затем уходит на отображение конечному пользователю.
Как видите, даже одно ядро в CPU благодаря вычислительным модулям ALU разного типа умеет выполнять очень разные операции. Но из-за сложности ядра, их устанавливают совсем немного, в среднем не больше 24 штук.
Это значит, что параллельно CPU выполняет пару десятков операций в один момент, не больше.
А теперь посмотрим, как это соотносится с GPU.
Ядра GPU. Тут вычислительный модуль ALU простой, но их много
В графическом процессоре структура компонентов не последовательная, как мы наблюдали выше в разделе о CPU, а по большей части паралелльная.
Рассмотрим, как устроен вычислительный модуль GPU на примере NVIDIA RTX 3090ti, архитектура которой хорошо изучена. GPU в процессорах M от Apple, особенно M3 и новее, значительно отличаются от всей индустрии, и его архитектура должна быть темой отдельной статьи.
Видеокарты с RTX 3080 по RTX 3090ti основываются на процессоре GA102, который после максимально качественной литографии без изъянов имеет 10752 CUDA ядер.
Большую часть чипа GA102 в его центре занимает область с ядрами, которая имеет иерархическую структуру.
Вся область графических ядер делится на 7 графических кластеров GPC (Graphics Processor Cluster).
▪︎ Каждый кластер состоит из 12 потоковых мультипроцессоров SM (Streaming Multiprocessor) и одного растрово-геометрического движка.
▪︎ Каждый SM состоит из четырёх ворпов (Warp) и одного ядра трассировки лучей.
▪︎ И, наконец, внутри каждого ворпа расположено 32 ядра CUDA (шейдерное) и 1 тензорное ядро.
Всего получается 10752 CUDA ядер, 336 тензорных и 84 трассировочных ядра.
CUDA ядра состоят их тех самых ALU, которые является главным вычислительным элементом в CPU. Они выполняют простые операции умножения и сложения с парой дополнительных (маска и смещение). Используются для просчёта графики в играх.
Тензорные ядра умножают и складывают матрицы. Нужны для просчёта геометрии и работы нейронных сетей.
Трассировочные ядра для трассировки лучей работают по особым алгоритмам.
Как видите, в ядра GPU происходят простые логические операции по сравнению с ядрами CPU.
Тут нет предсказателей ветвлений, распределительного модуля для непоследовательного выполнения процессов, нет ALU с более точными вычислений с плавающей точкой формата FP64 (более гранулярный инструмент для подсчётов).
Поэтому ядра значительно меньше и каждое потребляет меньше энергии, чем в CPU. Например, в 3090ti оно составляет 1560 МГц. Но, учитывая количество вычислительных блоков, итоговое потребление видеокарты всё равно доходит до огромных 450 Вт.
Думаю, пришло время сделать вывод.
Подводим итоги. Одна база, но разное масштабирование
Если вы ещё тут, респект.
Тема сложная и мало подсвечивается, но является фундаментальной.
В самой своей базе ядра CPU и GPU используют один и тот же главный компонент, вычислительный модуль ALU.
🟦 Но в CPU эти модули разного типа, которые работают с разными операциями, чтобы на компьютере могла работать операционная система и разные программы. Из-за этого у ядра сложная структура, которая потребляет много энергии.
А сами процессы выполняются последовательно, один за другим.
🟩 А вот в GPU модулей ALU очень много и они максимально упрощены. Тут они играют роль простых калькуляторов, задача которых делать операцию умножения и сложения. Поэтому ядра очень маленькие и их на одном чипе их умещается тысяча.
Тут один и тот же процесс можно разбить на много простых микропроцессов и выполнять их параллельно, отсюда и скорость в выполнении задач на графику.
Кроме этого, со временем в GPU появились другие ядра, нацеленные на одну конкретную операцию: тензорные для умножения матриц и трассировки лучей. Таких в CPU тоже нет, поскольку тут опять же нужно параллельное вычисление в большом объёме.
Слева схема ядер CPU, справа схема ядер GPU
В остальном, за пределами ядра, процессоры очень похожи по своей структуре.
Ядра объединены шиной и подключены к общим модулям кэша, на обоих чипах расположены контроллеры памяти и дополнительные модули для коммуникации с другим железом.
Кстати, SSD, в которых хранится информация, которая потом обрабатывается CPU и GPU, на самом деле тоже является самым настоящим процессором. Но совсем другим по своей сути.
О том, как устроено хранилище в вашем компьютере, я рассказывал здесь.
9 комментариев
Форум →Это все прикольно, только без базовых пониманий что такое кэш памяти, модули, Инструкции, как передается и обрабатывается код и в каком виде итп (которых у большинства 99% и у меня нет) это просто набор высокоабстрактного описания. Нужно глубже и больше простого описания 🥱но было интересно, тема для хабра
Есть потрясающая книжка: “But How Do It Know? – The Basic Principles of Computers for Everyone” J. Clark Scott
Там рассказ начинается что такое транзистор, потом как из двух транзисторов сделать логическое И, потом как из транзистора и логического И сделать логическое ИЛИ, потом как из И и ИЛИ сделать умножение, и вот так, от самого элементарного объекта становится понятно как работает любой элемент процессора! Потрясающая книга!
Ну так это же база схематехники, в первом семестре изучали ( если сейчас нет, то все печально)
Все равно архитектура Фон-Неймановская, как ни крути. Вот квантовый процессор уже совсем иначе работает, там реальное распараллеливание, из серии многотыщ операций обычного процессора за один такт.
только квантовый процессор это пока еще лабораторные образцы против масс-маркета
Браво Павел. Действительно полезная и познавательная информация для технического сайта. Продолжайте в том-же духе
Мне кажется если по простому ЦПУ отвечает за оперативку, а ГПу за видео)
Хорошая редкая техническая научпоп статья — отлично! Успехов в написании, в новом году
Офигеть. На айфонс реально хорошая техническая статья, а не “20 причин, почему я перестал использовать AirPods перед сном по четвергам”. Павел, респект и уважуха! А можно и дальше так?
Нашли орфографическую ошибку в новости?
Выделите ее мышью и нажмите Ctrl+Enter.Как на Apple Watch включить тактильную передачу времени
Как на iPhone скрыть уведомления от приложения Быстрые команды
Как включить встроенный переводчик в Safari на iOS 14
Почему iPhone стал сильно греться
В Finder пропадает Избранное. Как вернуть?
Как изменить номер SMS-центра на iPhone?
Как организовать домашний медиа-сервер из iPad, Apple TV и Android-смартфона
Почему Magic Mouse часто теряет связь с Mac