Найти в Дзене
Ciber Service

Анатомия процессора

Оглавление

Центральный процессор часто называют мозгом компьютера, и, как и человеческий мозг, он состоит из нескольких частей, которые работают вместе для обработки информации. Есть части, которые принимают информацию, части, которые хранят информацию, части, которые обрабатывают информацию, части, которые помогают выводить информацию, и многое другое. В сегодняшнем объяснении мы рассмотрим ключевые элементы, из которых состоит ЦП, и то, как все они работают вместе для питания вашего компьютера.

Вы должны знать, что эта статья является частью нашей серии статей «Анатомия», в которой анализируются все технологии, лежащие в основе компонентов ПК. У нас также есть специальная серия, посвященная проектированию ЦП, в которой более подробно рассматривается процесс проектирования ЦП и то, как все работает внутри. Это настоятельно рекомендуется к прочтению с технической точки зрения. В этой статье по анатомии будут пересмотрены некоторые основы из серии CPU, но на более высоком уровне и с дополнительным содержанием.

По сравнению с предыдущими статьями нашей серии «Анатомия» эта неизбежно будет более абстрактной. Когда вы заглядываете внутрь чего-то вроде блока питания, вы можете ясно видеть конденсаторы, трансформаторы и другие компоненты. Это просто невозможно с современным процессором, потому что все очень крошечные и потому что Intel и AMD не раскрывают публично свои разработки. Большинство конструкций ЦП являются проприетарными, поэтому темы, затронутые в этой статье, представляют общие функции, которыми обладают все ЦП.

Итак, давайте углубимся. Каждой цифровой системе требуется центральный процессор в той или иной форме. По сути, программист пишет код для выполнения своей задачи, а затем процессор выполняет этот код для получения желаемого результата. ЦП также подключен к другим частям системы, таким как память и ввод-вывод, чтобы обеспечить снабжение его соответствующими данными, но мы не будем рассматривать эти системы сегодня.

Чертеж ЦП: ISA

При анализе любого процессора первое, с чем вы столкнетесь, - это архитектура набора команд (ISA). Это образный план того, как работает ЦП и как все внутренние системы взаимодействуют друг с другом. Так же, как существует множество пород собак одного вида, существует множество различных типов ISA, на которых может быть построен ЦП. Двумя наиболее распространенными типами являются x86 (используются в настольных компьютерах и ноутбуках) и ARM (используются во встроенных и мобильных устройствах).

Есть и другие, такие как MIPS, RISC-V и PowerPC, которые имеют более нишевые приложения. ISA будет определять, какие инструкции может обрабатывать ЦП, как он взаимодействует с памятью и кешами, как работа делится на множество этапов обработки и многое другое.

-2

Чтобы охватить основные части ЦП, мы проследим путь, по которому выполняется инструкция. Различные типы инструкций могут следовать разным путям и использовать разные части ЦП, но мы обобщим здесь, чтобы охватить самые большие части. Мы начнем с самого простого дизайна одноядерного процессора и постепенно будем усложнять его по мере приближения к более современному дизайну.

Блок управления и Datapath

Части ЦП можно разделить на две части: блок управления и канал данных. Представьте себе вагон поезда. Двигатель - это то, что движет поездом, но кондуктор за кулисами тянет за рычаги и управляет различными аспектами двигателя. То же самое и с процессором.

Путь к данным похож на движок, и, как следует из названия, это путь, по которому данные передаются по мере их обработки. Канал данных получает входные данные, обрабатывает их и отправляет в нужное место по завершении. Блок управления сообщает каналу данных, как вести себя как проводник поезда. В зависимости от инструкции, канал данных будет маршрутизировать сигналы к различным компонентам, включать и выключать различные части пути данных и контролировать состояние ЦП.

-3

Блок-схема базового процессора. Черные линии обозначают поток данных, красные - поток управления. Иллюстрация Lambtron через Википедию

Цикл инструкций - выборка

Первое, что должен сделать наш ЦП, - это выяснить, какие инструкции выполнять дальше, и передать их из памяти в ЦП. Инструкции производятся компилятором и относятся к ISA ЦП. ISA будут совместно использовать наиболее распространенные типы инструкций, такие как загрузка, сохранение, сложение, вычитание и т.д., но есть много дополнительных специальных типов инструкций, уникальных для каждого конкретного ISA. Блок управления будет знать, какие сигналы необходимо направить для каждого типа команд.

Например, когда вы запускаете .exe в Windows, код этой программы перемещается в память, а ЦП сообщает, с какого адреса начинается первая инструкция. ЦП всегда поддерживает внутренний регистр, в котором хранится место в памяти следующей инструкции, которая должна быть выполнена. Это называется программным счетчиком (ПК).

Как только он знает, с чего начать, первым шагом цикла инструкций будет получение этой инструкции. Это перемещает инструкцию из памяти в регистр инструкций ЦП и называется этапом выборки . На самом деле инструкция, скорее всего, уже находится в кеше ЦП, но мы немного рассмотрим эти детали.

Цикл инструкций - декодирование

Когда у ЦП есть инструкция, ему нужно конкретно выяснить, какой это тип инструкции. Это называется этапом декодирования . Каждая инструкция будет иметь определенный набор битов, называемый кодом операции, который сообщает процессору, как ее интерпретировать. Это похоже на то, как разные расширения файлов используются, чтобы сообщить компьютеру, как интерпретировать файл. Например, .jpg и .png являются файлами изображений, но они организуют данные по-разному, поэтому компьютеру необходимо знать тип, чтобы правильно их интерпретировать.

В зависимости от того, насколько сложен ISA, часть ЦП, декодирующая инструкции, может стать сложной. ISA, как RISC-V, может иметь всего несколько десятков инструкций, в то время как x86 - тысячи. На типичном процессоре Intel x86 процесс декодирования является одним из самых сложных и занимает много места. Наиболее распространенными типами инструкций, которые может декодировать ЦП, являются инструкции для памяти, арифметические операции или инструкции ветвления.

3 основных типа инструкций

Инструкция памяти может быть чем-то вроде «прочитать значение из адреса 1234 памяти в значение A» или «записать значение B в адрес 5678 памяти». Арифметическая инструкция может быть чем-то вроде «добавить значение A к значению B и сохранить результат в значении C». Инструкция ветвления может быть чем-то вроде «выполнить этот код, если значение C положительно, или выполнить этот код, если значение C отрицательно». Типичная программа может объединить их в цепочку, чтобы придумать что-то вроде «прибавить значение по адресу памяти 1234 к значению по адресу 5678 и сохранить его по адресу памяти 4321, если результат положительный, или по адресу 8765, если результат отрицательный». .

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

ЦП имеет несколько очень маленьких, но очень быстрых участков памяти, называемых регистрами. На 64-битном процессоре каждый из них будет содержать 64 бита, а для ядра может быть всего несколько десятков. Они используются для хранения значений, которые используются в настоящее время, и могут считаться чем-то вроде кеша L0. В приведенных выше примерах инструкций все значения A, B и C будут храниться в регистрах.

АЛУ

Теперь вернемся к стадии казни. Это будет отличаться для трех типов инструкций, о которых мы говорили выше, поэтому мы рассмотрим каждый из них отдельно.

Начнем с арифметических инструкций, поскольку они самые простые для понимания. Эти типы инструкций подаются в арифметический логический блок (ALU) для обработки. ALU - это схема, которая обычно принимает два входа с управляющим сигналом и выводит результат.

-4

Представьте себе простой калькулятор, которым вы пользовались в средней школе. Чтобы выполнить операцию, вы вводите два входных числа, а также тип операции, которую вы хотите выполнить. Калькулятор производит вычисление и выводит результат. В случае ALU нашего процессора тип операции определяется кодом операции инструкции, и блок управления отправляет его в ALU. Помимо базовой арифметики, ALU также могут выполнять побитовые операции, такие как AND, OR, NOT и XOR. ALU также выводит некоторую информацию о состоянии для блока управления о вычислении, которое он только что завершил. Это может включать такие вещи, как положительный результат, отрицательный, нулевой или переполнение.

ALU больше всего ассоциируется с арифметическими операциями, но его также можно использовать для памяти или инструкций перехода. Например, ЦП может потребоваться вычислить адрес памяти, полученный в результате предыдущей арифметической операции. Также может потребоваться вычислить смещение для добавления к счетчику программы, которое требуется для инструкции перехода. Что-то вроде «если предыдущий результат был отрицательным, перейти на 20 инструкций вперед».

Инструкции по запоминанию и иерархия

Для инструкций памяти нам нужно понять концепцию, называемую иерархией памяти . Это представляет взаимосвязь между кешами, ОЗУ и оперативной памятью. Когда ЦП получает инструкцию памяти для фрагмента данных, которого у него еще нет локально в своих регистрах, он будет спускаться вниз по иерархии памяти, пока не найдет его. Большинство современных процессоров содержат кеш-память трех уровней: L1, L2 и L3. В первую очередь ЦП проверяет кэш L1. Это самый маленький и самый быстрый из трех уровней кеш-памяти. Кэш L1 обычно делится на часть для данных и часть для инструкций. Помните, что инструкции нужно извлекать из памяти точно так же, как данные.

Типичный кэш L1 может составлять несколько сотен КБ. Если ЦП не может найти то, что ищет в кеш-памяти L1, он проверит кеш-память L2. Это может быть порядка нескольких МБ. Следующим шагом является кэш L3, размер которого может составлять несколько десятков МБ. Если ЦП не может найти нужные данные в кэше L3, он перейдет в ОЗУ и, наконец, в основное хранилище. С каждым шагом доступное пространство увеличивается примерно на порядок, но вместе с ним увеличивается и задержка.

-5

Как только ЦП находит данные, он поднимает их вверх по иерархии, чтобы ЦП имел к ним быстрый доступ, если это потребуется в будущем. Здесь много шагов, но это обеспечивает быстрый доступ ЦП к нужным данным. Например, ЦП может считывать данные из своих внутренних регистров всего за один-два цикла, L1 за несколько циклов, L2 за десять или около того циклов, а L3 за несколько десятков. Если ему нужно перейти в память или основное хранилище, это может занять десятки тысяч или даже миллионы циклов. В зависимости от системы каждое ядро, вероятно, будет иметь свой собственный частный кэш L1, совместно использовать L2 с одним другим ядром и совместно использовать L3 между группами из четырех или более ядер. Подробнее о многоядерных процессорах мы поговорим позже в этой статье.

Инструкции по переходу и переходу

Последний из трех основных типов инструкций - это инструкция перехода. Современные программы постоянно прыгают, и ЦП редко когда-либо выполнит более дюжины непрерывных инструкций без ответвления. Инструкции ветвления поступают из таких программных элементов, как операторы if, циклы for и операторы возврата. Все они используются для прерывания выполнения программы и переключения на другую часть кода. Также есть инструкции перехода, которые всегда выполняются.

Условные переходы особенно сложны для ЦП, поскольку он может выполнять несколько инструкций одновременно и может не определять результат перехода до тех пор, пока он не запустится для последующих инструкций.

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

Классический способ понять это - провести аналогию с стиркой. У вас есть две загрузки, и каждая стирка и сушка занимают час. Вы можете положить первую загрузку в стиральную машину, а затем в сушилку, когда это будет сделано, а затем начать вторую загрузку. Это займет четыре часа. Однако если вы разделите работу и начнете стирку со второй загрузкой, пока сушится первая загрузка, вы сможете выполнить обе загрузки за три часа. Сокращение на один час зависит от количества загруженных вещей, а также от количества стиральных и сушильных машин. Для выполнения отдельной загрузки по-прежнему требуется два часа, но перекрытие увеличивает общую пропускную способность с 0,5 загрузки / час до 0,75 загрузки / час.

-6

Графическое представление конвейера, используемого в ядре AMD Bobcat с 2011 года. Обратите внимание на его сложность и количество этапов.

Процессоры используют этот же метод для повышения пропускной способности инструкций. Современный процессор ARM или x86 может иметь 20+ этапов конвейера, что означает, что в любой момент это ядро ​​обрабатывает 20+ различных инструкций одновременно. Каждый дизайн уникален, но одно деление выборки может составлять 4 цикла для выборки, 6 циклов для декодирования, 3 цикла для выполнения и 7 циклов для обновления результатов обратно в память.

Вернемся к веткам, надеюсь, вы заметите проблему. Если мы не знаем, что инструкция является ветвью до цикла 10, мы уже начали выполнение 9 новых инструкций, которые могут оказаться недействительными, если ветвление будет выполнено. Чтобы обойти эту проблему, ЦП имеют очень сложные структуры, называемые предикторами ветвлений. Они используют аналогичные концепции из машинного обучения, чтобы попытаться угадать, будет ли ветка взята или нет. Сложности предсказателей ветвления выходят далеко за рамки этой статьи, но на базовом уровне они отслеживают состояние предыдущих ветвей, чтобы узнать, будет ли следующая ветвь вероятна или нет. Современные предикторы ветвлений могут иметь точность 95% или выше.

Как только результат перехода станет известен точно (он завершил этот этап конвейера), счетчик программы будет обновлен, и ЦП перейдет к выполнению следующей инструкции. Если ветвление было предсказано неверно, ЦП выбрасывает все инструкции после ветвления, которое он по ошибке начал выполнять, и запускается снова с правильного места.

Исполнение вне очереди

Теперь, когда мы знаем, как выполнять три наиболее распространенных типа инструкций, давайте взглянем на некоторые из более продвинутых функций ЦП. Практически все современные процессоры не выполняют инструкции в том порядке, в котором они были получены. Парадигма, называемая исполнением вне очереди, используется для минимизации времени простоя в ожидании завершения других инструкций.

Если ЦП знает, что для предстоящей инструкции требуются данные, которые не будут готовы вовремя, он может переключить порядок инструкций и ввести независимую инструкцию из более поздней версии программы, пока она ожидает. Такое переупорядочение инструкций - чрезвычайно мощный инструмент, но это далеко не единственный трюк, который используют процессоры.

-7

Еще одна функция повышения производительности - предварительная выборка. Если бы вы рассчитали время, необходимое для выполнения случайной инструкции от начала до конца, вы бы обнаружили, что большую часть времени занимает доступ к памяти. Устройство предварительной выборки - это модуль в ЦП, который пытается заранее определить будущие инструкции и то, какие данные им потребуются. Если он обнаруживает, что приходит что-то, требующее данных, которые ЦП не кэширует, он обращается к ОЗУ и загружает эти данные в кеш. Отсюда и название упреждающей выборки.

Ускорители и будущее

Еще одна важная функция, которую начинают включать в процессоры, - это ускорители для конкретных задач. Это схемы, вся работа которых заключается в выполнении одной небольшой задачи с максимально возможной скоростью. Это может включать шифрование, кодирование мультимедиа или машинное обучение.

ЦП может делать эти вещи сам по себе, но гораздо эффективнее иметь для них специальный блок. Отличный пример - встроенная графика по сравнению с выделенным графическим процессором. Несомненно, ЦП может выполнять вычисления, необходимые для обработки графики, но наличие специального блока для них обеспечивает на порядок лучшую производительность. С появлением ускорителей фактическое ядро ​​процессора может занимать лишь небольшую часть чипа.

На рисунке ниже показан процессор Intel, созданный несколько лет назад. Большую часть места занимают ядра и кеш. На втором рисунке ниже показан гораздо более новый чип AMD. Большую часть места там занимают не ядра, а другие компоненты.

-8

Вверху: кристалл архитектуры Nehalem первого поколения от Intel. Обратите внимание, что ядра и кэш занимают большую часть места.

-9

Вверху: кристалл AMD SoC, демонстрирующий большое количество места, отведенного под ускорители и внешние интерфейсы.

Переход на многоядерность

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

Например, для 4-ядерной архитектуры ЦП должен иметь возможность отдавать инструкции в 4 раза быстрее. Также требуется четыре отдельных интерфейса для памяти. Когда несколько объектов работают с потенциально одними и теми же фрагментами данных, необходимо решить такие проблемы, как согласованность и непротиворечивость . Если два ядра являются инструкциями обработки, которые используют одни и те же данные, как они узнают, у кого есть правильное значение? Что, если одно ядро ​​изменило данные, но не успело достичь другого ядра для выполнения? Поскольку у них есть отдельные кеши, в которых могут храниться перекрывающиеся данные, для устранения этих конфликтов необходимо использовать сложные алгоритмы и контроллеры.

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

Обычно отдельные ядра обрабатывают потоки инструкций из разных потоков. Это помогает уменьшить зависимость между ядрами. Вот почему, если вы проверите Диспетчер задач, вы часто увидите, что одно ядро ​​усердно работает, а другие еле работают. Многие программы не предназначены для многопоточности. Также могут быть определенные случаи, когда более эффективно использовать одно ядро, выполняющее работу, чем платить накладные расходы, связанные с попыткой разделить работу.

Физический дизайн

Большая часть этой статьи была посвящена архитектурному дизайну ЦП, поскольку именно в этом и заключается большая часть сложности. Однако все это нужно создавать в реальном мире, а это добавляет еще один уровень сложности.

Для синхронизации всех компонентов процессора используется тактовый сигнал. Современные процессоры обычно работают в диапазоне от 3,0 до 5,0 ГГц, и это, похоже, не изменилось за последнее десятилетие. В каждом из этих циклов миллиарды транзисторов внутри микросхемы включаются и выключаются.

Часы имеют решающее значение для обеспечения того, чтобы на каждом этапе конвейера все значения отображались в нужное время. Часы определяют, сколько инструкций ЦП может обработать в секунду. Увеличение его частоты за счет разгона сделает чип быстрее, но также увеличит энергопотребление и тепловыделение.

-10

Изображение: Майкл Дзедзич

Тепло - злейший враг процессора. По мере нагрева цифровой электроники микроскопические транзисторы могут начать разрушаться. Это может привести к повреждению микросхемы, если не удалить тепло. Вот почему все процессоры поставляются с теплораспределителями. Фактический кремниевый кристалл ЦП может занимать только 20% площади поверхности физического устройства. Увеличение площади основания позволяет более равномерно распределять тепло по радиатору. Это также позволяет использовать больше контактов для взаимодействия с внешними компонентами.

Современные процессоры могут иметь тысячу или более входных и выходных контактов на задней панели. Мобильный чип может иметь всего несколько сотен контактов, поскольку большинство вычислительных компонентов находится внутри чипа . Независимо от конструкции, около половины из них предназначены для подачи питания, а остальные используются для передачи данных. Это включает в себя связь с ОЗУ, набором микросхем, хранилищем, устройствами PCIe и т. Д. Поскольку высокопроизводительные процессоры потребляют сто или более ампер при полной нагрузке, им нужны сотни контактов для равномерного распределения тока. Штифты обычно позолочены для улучшения электропроводности. Разные производители используют разное расположение штифтов во многих своих продуктовых линейках.

Собираем все вместе с примером

Подводя итоги, мы кратко рассмотрим дизайн процессора Intel Core 2. Это сделано еще в 2006 году, поэтому некоторые детали могут быть устаревшими, но подробности о более новых конструкциях недоступны.

Начиная сверху, у нас есть кеш инструкций и ITLB. Буфер замены трансляции (TLB) используется, чтобы помочь процессору узнать, где в памяти идти, чтобы найти нужную инструкцию. Эти инструкции хранятся в кэше инструкций L1, а затем отправляются в предварительный декодер. Архитектура x86 чрезвычайно сложна и плотна, поэтому декодирование требует множества этапов. Между тем, как предиктор ветвления, так и предварительная выборка предвидят любые потенциальные проблемы, вызванные входящими инструкциями.

-11

Оттуда инструкции отправляются в очередь инструкций. Вспомните, как нестандартный дизайн позволяет процессору выполнять инструкции и выбирать наиболее своевременную из них для выполнения. Эта очередь содержит текущие инструкции, которые рассматривает процессор. Как только ЦП знает, какую инструкцию лучше всего выполнить, она далее декодируется в микрооперации. В то время как инструкция может содержать сложную задачу для ЦП, микрооперации представляют собой гранулированные задачи, которые проще интерпретировать ЦП.

Эти инструкции затем входят в таблицу псевдонимов регистрации, ROB и станцию ​​резервирования. Точная функция этих трех компонентов немного сложна (например, университетский курс для выпускников), но они используются во внеочередном процессе, чтобы помочь управлять зависимостями между инструкциями.

Одно «ядро» на самом деле будет иметь много ALU и портов памяти. Входящие операции помещаются в станцию ​​резервирования до тех пор, пока для использования не станет доступен ALU или порт памяти. Как только требуемый компонент будет доступен, инструкция будет обработана с помощью кеша данных L1. Результаты вывода будут сохранены, и теперь ЦП готов к запуску по следующей инструкции. Вот и все!

Хотя эта статья не задумывалась как исчерпывающее руководство по тому, как именно работает каждый процессор, она должна дать вам хорошее представление об их внутренней работе и сложностях. Честно говоря, никто, кроме AMD и Intel, на самом деле не знает, как работают их процессоры. Каждый раздел этой статьи представляет собой целую область исследований и разработок, поэтому представленная здесь информация лишь мельком.

Переведено с сайта Techspot, автор Nick Evanson.

На правах рекламы:

-12

Cyber-Servise. IT-аутсорсинг на грани фантастики!

Город - Новокузнецк