Введение

Центральный процессор (ЦПУ), также называемый центральным процессором, главным процессором или просто процессором, является важнейшим процессором в компьютере. Его электронные схемы выполняют инструкции компьютерной программы, такие как арифметические, логические, управляющие и операции ввода-вывода (I/O). Эта роль отличается от роли внешних компонентов, таких как основная память и схемы ввода-вывода, а также специализированных сопроцессоров, таких как графические процессоры (GPU). Форма, конструкция и реализация ЦПУ менялись со временем, но их фундаментальный принцип работы остаётся практически неизменным. Основные компоненты ЦПУ включают в себя арифметико-логическое устройство (ALU), выполняющее арифметические и логические операции, регистры процессора, которые предоставляют операнды для ALU и хранят результаты его операций, и устройство управления, которое координирует выборку (из памяти), декодирование и выполнение (инструкций), направляя согласованную работу ALU, регистров и других компонентов. Современные ЦПУ выделяют значительную площадь полупроводника под кэш-память и параллелизм на уровне инструкций для повышения производительности, а также используют режимы процессора для поддержки операционных систем и виртуализации. Большинство современных ЦПУ реализованы на микропроцессорах интегральных схем (ИС), содержащих один или несколько ЦПУ на одном кристалле ИС. Микропроцессорные чипы с несколькими ЦПУ называются многоядерными процессорами. Отдельные физические ЦПУ, называемые процессорными ядрами, также могут поддерживать многопоточность для обеспечения многопоточной обработки на уровне ЦПУ. Такие интегрированные устройства также называют микроконтроллерами или системами на кристалле (SoC).

История

Ранние компьютеры, такие как ENIAC, требовали физического перекоммутирования для выполнения различных задач, из-за чего эти машины стали называться "компьютерами с фиксированной программой". Термин "центральный процессор" используется с 1955 года. Поскольку термин "CPU" обычно определяется как устройство для исполнения программного обеспечения (компьютерной программы), самые ранние устройства, которые можно было бы справедливо назвать CPU, появились с изобретением компьютера с хранимой программой. Идея компьютера с хранимой программой уже присутствовала в проекте ENIAC Дж. Преспера Эккерта и Джона Уильяма Мокли, но изначально была опущена, чтобы ENIAC можно было завершить раньше. 30 июня 1945 года, до создания ENIAC, математик Джон фон Нейман распространил документ под названием "Первый проект отчета об EDVAC". Это был эскиз компьютера с хранимой программой, который в конечном итоге был завершен в августе 1949 года. EDVAC был разработан для выполнения определенного количества инструкций (или операций) различных типов. Важно отметить, что программы, написанные для EDVAC, должны были храниться в высокоскоростной компьютерной памяти, а не определяться физической схемой компьютера. Это устранило серьезное ограничение ENIAC, заключавшееся в значительном времени и усилиях, необходимых для перенастройки компьютера для выполнения новой задачи. С конструкцией фон Неймана программу, выполняемую EDVAC, можно было изменить, просто изменив содержимое памяти. EDVAC не был первым компьютером с хранимой программой; Manchester Baby, представлявший собой экспериментальный компьютер малого масштаба с хранимой программой, выполнил свою первую программу 21 июня 1948 года, а Manchester Mark 1 выполнил свою первую программу в ночь с 16 на 17 июня 1949 года. Ранние CPU были специализированными разработками, использовавшимися как часть более крупного и иногда уникального компьютера. Однако этот метод проектирования специализированных CPU для конкретного применения во многом уступил место разработке многоцелевых процессоров, производимых в больших количествах. Эта стандартизация началась в эпоху дискретных транзисторных мэйнфреймов и миникомпьютеров и быстро ускорилась с популяризацией интегральной схемы (ИС). ИС позволила проектировать и производить все более сложные CPU с допусками порядка нанометров. Как миниатюризация, так и стандартизация CPU значительно расширили присутствие цифровых устройств в современной жизни, выйдя далеко за рамки ограниченного применения специализированных вычислительных машин. Современные микропроцессоры встречаются в электронных устройствах, начиная от автомобилей и заканчивая мобильными телефонами, а иногда даже в игрушках. Хотя фон Нейману чаще всего приписывают разработку компьютера с хранимой программой из-за его разработки EDVAC, и эта конструкция стала известна как архитектура фон Неймана, другие исследователи до него, такие как Конрад Цузе, предлагали и реализовывали подобные идеи. Так называемая архитектура Гарварда, реализованная в Гарвардской марке I, которая была завершена до EDVAC, также использовала конструкцию с хранимой программой, используя перфорированную бумажную ленту вместо электронной памяти. Ключевое различие между архитектурами фон Неймана и Гарварда заключается в том, что последняя разделяет хранение и обработку инструкций и данных CPU, в то время как первая использует одно и то же пространство памяти для обоих. Большинство современных CPU в основном построены на архитектуре фон Неймана, но CPU с архитектурой Гарварда также встречаются, особенно во встраиваемых приложениях; например, микроконтроллеры Atmel AVR являются процессорами с архитектурой Гарварда. Реле и вакуумные лампы (термионные лампы) обычно использовались в качестве переключающих элементов; для работоспособного компьютера требуются тысячи или десятки тысяч переключающих устройств. Общая скорость системы зависит от скорости переключателей. Компьютеры на вакуумных лампах, такие как EDVAC, в среднем работали восемь часов между отказами, в то время как релейные компьютеры, такие как более медленный, но более ранний Harvard Mark I, выходили из строя очень редко.

Процессоры транзисторов

Сложность конструкции процессоров возрастала по мере развития технологий, позволявших создавать более компактные и надежные электронные устройства. Первым значительным улучшением стало изобретение транзистора. Транзисторные процессоры 1950-х и 1960-х годов больше не требовали использования громоздких, ненадежных и хрупких коммутационных элементов, таких как вакуумные лампы и реле. Благодаря этому стало возможным создавать более сложные и надежные процессоры на одной или нескольких печатных платах, содержащих дискретные (индивидуальные) компоненты. В 1964 году IBM представила компьютерную архитектуру IBM System/360, которая использовалась в серии компьютеров, способных выполнять одни и те же программы с разной скоростью и производительностью. Это было особенно важно в то время, когда большинство электронных компьютеров были несовместимы друг с другом, даже если они производились одним и тем же производителем. Для реализации этого улучшения IBM использовала концепцию микропрограммы (часто называемой "микрокодом"), которая до сих пор широко применяется в современных процессорах. Архитектура System/360 оказалась настолько популярной, что доминировала на рынке мейнфреймов на протяжении десятилетий и оставила наследие, которое продолжается в современных компьютерах, таких как IBM zSeries. В 1965 году Digital Equipment Corporation (DEC) представила еще один влиятельный компьютер, ориентированный на научные и исследовательские рынки — PDP 8. Компьютеры на основе транзисторов обладали рядом существенных преимуществ по сравнению со своими предшественниками. Помимо повышения надежности и снижения энергопотребления, транзисторы позволяли процессорам работать на значительно более высоких скоростях благодаря короткому времени переключения транзистора по сравнению с лампой или реле. Повышенная надежность и резкое увеличение скорости коммутационных элементов, которые к этому времени практически полностью состояли из транзисторов, позволили легко достигать тактовой частоты процессоров в десятки мегагерц. Кроме того, наряду с широким использованием дискретных транзисторов и интегральных схем (ИС), стали появляться новые высокопроизводительные конструкции, такие как векторные процессоры с однократным вводом множественных данных (SIMD). Эти ранние экспериментальные разработки впоследствии привели к появлению специализированных суперкомпьютеров, таких как те, что производятся компаниями Cray Inc и Fujitsu Ltd. Процессоры, основанные на этих "строительных блоках" ИС, обычно называют устройствами "малой степени интеграции" (МСИ). МСИ ИС, такие как те, что использовались в компьютере управления Apollo, обычно содержали до нескольких десятков транзисторов. Для создания целого процессора из МСИ ИС требовались тысячи отдельных чипов, но при этом они занимали гораздо меньше места и потребляли меньше энергии, чем более ранние дискретные транзисторные схемы. IBM System/370, последователь System/360, использовал МСИ ИС вместо дискретных транзисторных модулей Solid Logic Technology. PDP 8/I и KI10 PDP 10 от DEC также перешли от отдельных транзисторов, использовавшихся в PDP 8 и PDP 10, к МСИ ИС, а их чрезвычайно популярная линейка PDP 11 изначально строилась на МСИ ИС, но в конечном итоге была реализована с использованием компонентов БСИ, как только они стали практически осуществимыми.

Крупномасштабные интеграционные процессоры

Ли Бойзель опубликовал влиятельные статьи, включая "манифест" 1967 года, в котором описывалось, как создать эквивалент 32-битного мейнфрейма из относительно небольшого количества крупномасштабных интеграционных схем (LSI). Единственный способ создания LSI-чипов, содержащих сотни и более логических элементов, заключался в их изготовлении с использованием технологии металл-оксид-полупроводник (MOS) – полупроводникового производственного процесса (либо PMOS логики, NMOS логики, либо CMOS логики). Однако некоторые компании продолжали производить процессоры на основе биполярной транзисторной логики (TTL), поскольку биполярные транзисторы были быстрее, чем MOS-чипы, вплоть до 1970-х годов (несколько компаний, таких как Datapoint, продолжали использовать TTL-чипы для производства процессоров до начала 1980-х годов). После разработки Федерико Фаггином в Fairchild Semiconductor в 1968 году технологии MOS с кремниевыми затворами, MOS-интегральные схемы в значительной степени заменили биполярную TTL в качестве стандартной чиповой технологии в начале 1970-х годов. С развитием микроэлектронных технологий количество транзисторов, размещаемых на интегральных схемах, увеличивалось, что снижало количество отдельных интегральных схем, необходимых для создания полноценного центрального процессора. MSI и LSI-интегральные схемы увеличили количество транзисторов до сотен, а затем и тысяч. К 1968 году количество интегральных схем, необходимых для создания полноценного процессора, было сокращено до 24 ИС восьми различных типов, при этом каждая ИС содержала около 1000 MOSFET. В отличие от своих предшественников SSI и MSI, первая LSI-реализация PDP 11 содержала процессор, состоящий всего из четырех LSI-интегральных схем.

Микропроцессоры

С момента появления микропроцессоров они практически полностью вытеснили все другие методы реализации центральных процессоров. Первым коммерчески доступным микропроцессором, выпущенным в 1971 году, был Intel 4004, а первым широко используемым микропроцессором, выпущенным в 1974 году, был Intel 8080. Производители мейнфреймов и миникомпьютеров того времени запустили собственные программы разработки интегральных схем (ИС) для модернизации своих устаревших компьютерных архитектур и в конечном итоге создали микропроцессоры, совместимые с набором команд, обеспечивающие обратную совместимость со старым оборудованием и программным обеспечением. В сочетании с появлением и успехом повсеместного персонального компьютера, термин CPU теперь применяется почти исключительно к микропроцессорам. Несколько процессоров (обозначаемых ядрами) могут быть объединены в один процессорный чип. Предыдущие поколения процессоров реализовывались в виде дискретных компонентов и множества небольших интегральных схем (ИС) на одной или нескольких печатных платах. Микропроцессоры, напротив, представляют собой процессоры, изготовленные на очень небольшом количестве ИС, как правило, на одном. Общий меньший размер процессора, обусловленный реализацией на одном кристалле, обеспечивает более быстрое время переключения благодаря физическим факторам, таким как уменьшение паразитной ёмкости затворов. Это позволило синхронным микропроцессорам достигать тактовых частот от десятков мегагерц до нескольких гигагерц. Кроме того, возможность создания чрезвычайно маленьких транзисторов на ИС многократно увеличила сложность и количество транзисторов в одном процессоре. Эта широко наблюдаемая тенденция описывается законом Мура, который оказался достаточно точным прогнозом роста сложности процессоров (и других ИС) до 2016 года. Хотя сложность, размер, конструкция и общая форма процессоров значительно изменились с 1950 года, базовая конструкция и функция остались практически неизменными. Почти все современные процессоры можно с высокой точностью описать как машины фон Неймана с хранимой программой. В связи с тем, что закон Мура больше не действует, возникли опасения относительно пределов технологии интегральных транзисторов. Экстремальная миниатюризация электронных элементов приводит к тому, что эффекты таких явлений, как электромиграция и подпороговый ток утечки, становятся гораздо более значимыми. Эти новые проблемы – лишь один из многих факторов, побуждающих исследователей изучать новые методы вычислений, такие как квантовые компьютеры, а также расширять использование параллелизма и других методов, повышающих эффективность классической модели фон Неймана.

Операция

Основная функция большинства процессоров, независимо от их физической формы, заключается в выполнении последовательности сохраненных инструкций, называемой программой. Инструкции, которые должны быть выполнены, хранятся в некоторой компьютерной памяти. Почти все процессоры следуют этапам выборки, декодирования и выполнения в своей работе, которые в совокупности известны как цикл инструкций. После выполнения инструкции весь процесс повторяется, при этом следующий цикл инструкций обычно выбирает следующую инструкцию в последовательности из-за инкрементированного значения в счетчике программы. Если была выполнена инструкция перехода, счетчик программы будет изменен для хранения адреса инструкции, к которой был выполнен переход, и выполнение программы продолжится как обычно. В более сложных процессорах несколько инструкций могут быть выбраны, декодированы и выполнены одновременно. В этом разделе описывается то, что обычно называют "классическим RISC-конвейером", который довольно распространен среди простых процессоров, используемых во многих электронных устройствах (часто называемых микроконтроллерами). Он в значительной степени игнорирует важную роль кэша процессора и, следовательно, стадию доступа конвейера. Некоторые инструкции манипулируют счетчиком программы, а не генерируют данные результата напрямую; такие инструкции обычно называются "переходами" и обеспечивают поведение программы, такое как циклы, условное выполнение программы (через использование условного перехода) и наличие функций. В некоторых процессорах другие инструкции изменяют состояние битов в регистре "флагов". Эти флаги могут использоваться для влияния на поведение программы, поскольку они часто указывают на результат различных операций. Например, в таких процессорах инструкция "сравнение" оценивает два значения и устанавливает или сбрасывает биты в регистре флагов, чтобы указать, какое из них больше или равны ли они; один из этих флагов затем может быть использован последующей инструкцией перехода для определения потока программы.

Принеси .

Fetch включает в себя извлечение инструкции (которая представлена числом или последовательностью чисел) из памяти программы. Расположение (адрес) инструкции в памяти программы определяется счетчиком команд (PC; в микропроцессорах Intel x86 он называется "указателем инструкций"), который хранит число, идентифицирующее адрес следующей извлекаемой инструкции. После извлечения инструкции, счетчик команд увеличивается на длину инструкции, чтобы содержать адрес следующей инструкции в последовательности. Часто извлекаемая инструкция должна быть получена из относительно медленной памяти, что приводит к остановке процессора в ожидании ее возврата. Эта проблема в значительной степени решается в современных процессорах благодаря кэшам и конвейерной архитектуре (см. ниже).

Декодирование

Инструкция, извлекаемая процессором из памяти, определяет его дальнейшие действия. На этапе декодирования, выполняемом бинарным декодером, известным как декодер инструкций, инструкция преобразуется в сигналы, управляющие другими частями процессора. Способ интерпретации инструкции определяется архитектурой набора инструкций (ISA) процессора. Как правило, одна группа битов в инструкции, именуемая кодом операции (опкодом), указывает, какую операцию необходимо выполнить, а остальные поля обычно предоставляют дополнительную информацию, необходимую для этой операции, такую как операнды. Эти операнды могут быть указаны как непосредственное значение (константа) или как местоположение значения, которое может быть регистром процессора или адресом памяти, в зависимости от используемого режима адресации. В некоторых конструкциях процессоров декодер инструкций реализован в виде жесткой, неизменяемой двоичной схемы. В других используется микропрограмма для преобразования инструкций в наборы сигналов конфигурации процессора, которые последовательно применяются в течение нескольких тактовых циклов. В некоторых случаях память, хранящая микропрограмму, может быть перезаписываемой, что позволяет изменять способ декодирования инструкций процессором.

Выполнить

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

Структура и реализация

В схеме процессора заложен набор основных операций, которые он может выполнять, называемый набором команд. Эти операции могут включать, например, сложение или вычитание двух чисел, сравнение двух чисел или переход к другой части программы. Каждая команда представлена уникальной комбинацией битов, известной как машинный код операции (опкод). При обработке команды процессор декодирует опкод (с помощью двоичного декодера) в сигналы управления, которые управляют работой процессора. Полная машинная команда состоит из опкода и, во многих случаях, дополнительных битов, определяющих аргументы для операции (например, числа, которые нужно сложить в случае операции сложения). По мере усложнения, программа на машинном языке представляет собой набор машинных команд, которые процессор выполняет. Фактическое математическое вычисление для каждой команды выполняется комбинационной логической схемой в процессоре, известной как арифметико-логическое устройство (АЛУ). В общем случае, процессор выполняет команду, извлекая её из памяти, используя свой АЛУ для выполнения операции, а затем сохраняя результат обратно в память. Помимо команд для целочисленной математики и логических операций, существуют различные другие машинные команды, такие как команды загрузки данных из памяти и сохранения их обратно, команды ветвления и математические операции над числами с плавающей точкой, выполняемые блоком операций с плавающей точкой (FPU) процессора.

Управляющий блок

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

Арифметическая логическая единица

Арифметико-логическое устройство (ALU) — это цифровой блок в процессоре, выполняющий целочисленную арифметику и побитовые логические операции. Входными данными для ALU являются операнды – слова данных, над которыми выполняются операции, информация о состоянии от предыдущих операций и код от блока управления, указывающий, какую операцию следует выполнить. В зависимости от выполняемой инструкции, операнды могут поступать из внутренних регистров процессора, внешней памяти или представлять собой константы, генерируемые самим ALU. После того, как все входные сигналы установились и распространились по схеме ALU, результат выполненной операции появляется на выходах ALU. Результат состоит из слова данных, которое может быть сохранено в регистре или памяти, и информации о состоянии, которая обычно сохраняется в специальном внутреннем регистре процессора, предназначенном для этой цели. Современные процессоры обычно содержат несколько ALU для повышения производительности.

Устройство генерации адресов

Адресный генератор (AGU), иногда также называемый адресным вычислительным блоком (ACU), является исполнительным устройством внутри ЦП, которое вычисляет адреса, используемые ЦП для доступа к основной памяти. Благодаря тому, что вычисления адресов выполняются отдельными схемами, работающими параллельно с остальной частью ЦП, количество циклов ЦП, необходимых для выполнения различных машинных инструкций, может быть сокращено, что приводит к повышению производительности. При выполнении различных операций ЦП необходимо вычислять адреса памяти, требуемые для извлечения данных из памяти; например, позиции элементов массива в памяти должны быть вычислены, прежде чем ЦП сможет извлечь данные из фактических ячеек памяти. Эти вычисления генерации адресов включают в себя различные целочисленные арифметические операции, такие как сложение, вычитание, операции по модулю или битовые сдвиги. Часто вычисление адреса памяти включает в себя более одной машинной инструкции общего назначения, которые не всегда быстро декодируются и выполняются. Интегрируя AGU в конструкцию ЦП и вводя специализированные инструкции, использующие AGU, различные вычисления генерации адресов могут быть переложены с остальной части ЦП и часто выполняться быстро, за один цикл ЦП. Возможности AGU зависят от конкретного ЦП и его архитектуры. Таким образом, некоторые AGU реализуют и предоставляют больше операций вычисления адресов, в то время как другие также включают более продвинутые специализированные инструкции, которые могут работать с несколькими операндами одновременно. Некоторые архитектуры ЦП включают несколько AGU, что позволяет выполнять более одной операции вычисления адресов одновременно, что еще больше повышает производительность благодаря суперскалярной природе современных конструкций ЦП. Например, Intel включает несколько AGU в свои микроархитектуры Sandy Bridge и Haswell, что увеличивает пропускную способность подсистемы памяти ЦП, позволяя выполнять несколько инструкций доступа к памяти параллельно.

Устройство управления памятью (MMU)

Многие микропроцессоры (в смартфонах, настольных, ноутбуках и серверных компьютерах) оснащены блоком управления памятью, который преобразует логические адреса в физические адреса оперативной памяти, обеспечивая защиту памяти и поддержку страничной организации, что полезно для реализации виртуальной памяти. Более простые процессоры, особенно микроконтроллеры, как правило, не содержат MMU.

Кэш-память

Кэш процессора — это аппаратный кэш, используемый центральным процессором (ЦП) компьютера для снижения средней стоимости (времени или энергии) доступа к данным из основной памяти. Кэш — это меньшая, более быстрая память, расположенная ближе к ядру процессора, которая хранит копии данных из часто используемых областей основной памяти. Большинство процессоров имеют различные независимые кэши, включая кэши инструкций и данных, при этом кэши данных обычно организованы в виде иерархии уровней кэша (L1, L2, L3, L4 и т. д.). Все современные (быстрые) процессоры (за редкими исключениями) имеют несколько уровней кэша ЦП. Первые процессоры, использовавшие кэш, имели только один уровень кэша; в отличие от более поздних кэшей первого уровня, он не был разделен на L1d (для данных) и L1i (для инструкций). Почти все современные процессоры с кэшем имеют разделенный кэш L1. Они также имеют кэши L2 и, для более крупных процессоров, кэши L3. Кэш L2 обычно не разделяется и служит общим хранилищем для уже разделенного кэша L1. Каждое ядро многоядерного процессора имеет выделенный кэш L2 и обычно не разделяет его с другими ядрами. Кэш L3 и кэши более высоких уровней совместно используются ядрами и не разделяются. Кэш L4 в настоящее время встречается редко и обычно реализован на динамической памяти с произвольным доступом (DRAM), а не на статической памяти с произвольным доступом (SRAM), на отдельном кристалле или чипе. Исторически это также было характерно для L1, однако более крупные чипы позволили интегрировать его и, как правило, все уровни кэша, за исключением последнего. Каждый дополнительный уровень кэша, как правило, больше по размеру и оптимизирован по-разному. Существуют и другие типы кэшей (которые не учитываются при определении "размера кэша" наиболее важных кэшей, упомянутых выше), такие как буфер трансляции Lookaside (TLB), являющийся частью блока управления памятью (MMU), который присутствует в большинстве процессоров. Размеры кэшей обычно кратны степеням двойки: 2, 8, 16 и т. д. КиБ или МиБ (для больших размеров, не относящихся к L1), хотя IBM z13 имеет кэш инструкций L1 размером 96 КиБ.

Часовой режим

Большинство процессоров являются синхронными схемами, что означает, что они используют тактовый сигнал для синхронизации своих последовательных операций. Тактовый сигнал генерируется внешним генератором, который выдает постоянное количество импульсов каждую секунду в виде периодической прямоугольной волны. Частота тактовых импульсов определяет скорость выполнения инструкций процессором и, следовательно, чем выше частота, тем больше инструкций процессор выполняет каждую секунду. Для обеспечения корректной работы процессора, период тактового сигнала должен быть больше максимального времени, необходимого для распространения (перемещения) всех сигналов внутри процессора. Устанавливая период тактового сигнала значительно больше, чем наихудшая задержка распространения, можно спроектировать весь процессор и способ передачи данных, ориентируясь на фронты и спады тактового сигнала. Это упрощает процессор как с точки зрения проектирования, так и с точки зрения количества компонентов. Однако, это также означает, что весь процессор должен ждать завершения работы своих самых медленных элементов, даже если некоторые его части работают значительно быстрее. Это ограничение во многом компенсируется различными методами повышения параллелизма процессора (см. ниже). Однако, одних архитектурных улучшений недостаточно для устранения всех недостатков глобально синхронных процессоров. Например, тактовый сигнал подвержен задержкам, как и любой другой электрический сигнал. Более высокие тактовые частоты в современных, все более сложных процессорах затрудняют поддержание тактового сигнала в фазе (синхронизированным) по всему устройству. Это привело к тому, что многие современные процессоры требуют использования нескольких идентичных тактовых сигналов, чтобы избежать значительной задержки одного сигнала, которая может привести к сбою процессора. Другая важная проблема, возникающая при значительном увеличении тактовых частот, – это количество тепла, рассеиваемого процессором. Постоянно изменяющийся тактовый сигнал заставляет многие компоненты переключаться, независимо от того, используются они в данный момент или нет. В общем, компонент, находящийся в процессе переключения, потребляет больше энергии, чем элемент в статическом состоянии. Следовательно, с увеличением тактовой частоты растет и энергопотребление, что требует более эффективного охлаждения процессора. Один из методов снижения переключений ненужных компонентов называется "clock gating" (управление тактированием), который заключается в отключении тактового сигнала для неиспользуемых компонентов (фактически, их отключении). Однако, реализация этого метода часто считается сложной, поэтому он редко используется за пределами конструкций с очень низким энергопотреблением. Примером современной реализации с широким использованием clock gating является процессор IBM PowerPC Xenon, используемый в Xbox 360, что позволяет снизить энергопотребление консоли.

Процессоры без часов

Другой способ решения некоторых проблем, связанных с глобальным тактовым сигналом, – это его полное исключение. Хотя отказ от глобального тактового сигнала значительно усложняет процесс проектирования во многих аспектах, асинхронные (или бесчастотные) схемы обладают существенными преимуществами в потреблении энергии и теплоотводе по сравнению с аналогичными синхронными схемами. Несмотря на относительную редкость, были созданы целые асинхронные процессоры, не использующие глобальный тактовый сигнал. Два заметных примера – AMULET, совместимый с ARM, и MiniMIPS, совместимый с MIPS R3000. Вместо полного удаления тактового сигнала некоторые конструкции процессоров допускают использование асинхронных элементов в определенных частях устройства, например, асинхронных АЛУ в сочетании с суперскалярной конвейерной обработкой для повышения производительности арифметических операций. Хотя пока неясно, могут ли полностью асинхронные схемы работать на уровне, сопоставимом или превосходящем синхронные, очевидно, что они, по крайней мере, превосходят в простых математических вычислениях. Это, в сочетании с их отличными характеристиками энергопотребления и теплоотвода, делает их очень подходящими для встраиваемых компьютеров.

Модуль регулятора напряжения

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

Диапазон целых чисел

Каждый процессор представляет числовые значения определенным образом. Например, некоторые ранние цифровые компьютеры представляли числа в привычной десятичной (основание 10) системе счисления, а другие использовали более необычные представления, такие как троичная (основание три). Почти все современные процессоры представляют числа в двоичной форме, где каждая цифра кодируется двумя возможными физическими состояниями, например, высоким или низким уровнем напряжения. Связанными с представлением чисел являются размер и точность целых чисел, которые процессор может обрабатывать. В случае двоичного процессора это измеряется количеством бит (значимых цифр двоичного кода целого числа), которые процессор может обработать за одну операцию. Это количество обычно называют разрядностью, шириной шины данных, шириной канала данных, точностью целого числа или размером целого числа. Разрядность процессора определяет диапазон целых значений, с которыми он может непосредственно работать. Например, 8-битный процессор может напрямую оперировать целыми числами, представленными восемью битами, что обеспечивает диапазон в 256 (2⁸) различных целых значений. Диапазон целых чисел также влияет на количество ячеек памяти, к которым процессор может напрямую обращаться (адрес – это целое число, представляющее конкретную ячейку памяти). Например, если двоичный процессор использует 32 бита для представления адреса памяти, он может напрямую адресовать 2³² ячеек памяти. Чтобы обойти это ограничение и по другим причинам, некоторые процессоры используют механизмы (например, переключение банков памяти), позволяющие адресовать больший объем памяти. Процессоры с большей разрядностью требуют более сложной схемотехники, а следовательно, физически больше, дороже и потребляют больше энергии (и, соответственно, выделяют больше тепла). В результате, небольшие 4- или 8-битные микроконтроллеры часто используются в современных приложениях, хотя доступны процессоры с гораздо большей разрядностью (например, 16, 32, 64, даже 128 бит). Однако, когда требуется более высокая производительность, преимущества большей разрядности (расширенные диапазоны данных и адресные пространства) могут перевесить недостатки. Процессор может иметь внутренние шины данных, меньшие по разрядности, чем основная разрядность, для уменьшения размера и стоимости. Например, хотя архитектура набора команд IBM System/360 была 32-битной, модели System/360 Model 30 и Model 40 имели 8-битные шины данных в арифметико-логическом устройстве (АЛУ), поэтому для выполнения 32-битного сложения требовалось четыре такта, по одному на каждый 8-битный операнд. Аналогично, хотя набор команд серии Motorola 68000 был 32-битным, процессоры Motorola 68000 и Motorola 68010 имели 16-битные шины данных в АЛУ, поэтому для выполнения 32-битного сложения требовалось два такта. Чтобы получить преимущества как меньшей, так и большей разрядности, многие наборы команд используют разную разрядность для целых и чисел с плавающей точкой, позволяя процессорам, реализующим этот набор команд, иметь разную разрядность для различных частей устройства. Например, набор команд IBM System/360 был в основном 32-битным, но поддерживал 64-битные числа с плавающей точкой для обеспечения большей точности и диапазона. Многие современные конструкции процессоров используют аналогичную смешанную разрядность, особенно когда процессор предназначен для общего назначения, где требуется разумный баланс между целочисленной и операциями с плавающей точкой.

Параллелизм на уровне инструкции

Один из простейших методов повышения параллелизма — начать первые этапы выборки и декодирования инструкции до завершения выполнения предыдущей инструкции. Эта техника известна как конвейерная обработка инструкций и используется практически во всех современных универсальных процессорах. Конвейерная обработка позволяет выполнять несколько инструкций одновременно, разделяя путь выполнения на отдельные стадии. Это разделение можно сравнить со сборочной линией, где инструкция становится все более завершенной на каждой стадии, пока не покинет конвейер выполнения и не будет завершена. Однако конвейерная обработка создает возможность ситуации, когда для завершения следующей операции требуется результат предыдущей; состояние, часто называемое конфликтом зависимостей данных. Поэтому конвейерные процессоры должны проверять наличие таких ситуаций и при необходимости задерживать часть конвейера. Конвейерный процессор может стать почти скалярным, ограничиваясь лишь остановками конвейера (инструкция, занимающая более одного тактового цикла на стадии). Улучшения в конвейерной обработке инструкций привели к дальнейшему сокращению времени простоя компонентов процессора. Архитектуры, которые называют суперскалярными, включают в себя длинный конвейер инструкций и несколько идентичных исполнительных устройств, таких как блоки загрузки-сохранения, арифметико-логические устройства, блоки операций с плавающей точкой и блоки генерации адресов. В суперскалярном конвейере инструкции считываются и передаются диспетчеру, который определяет, могут ли инструкции выполняться параллельно (одновременно). Если да, то они отправляются в исполнительные устройства, что приводит к их одновременному выполнению. В общем случае количество инструкций, которые суперскалярный процессор завершит за цикл, зависит от количества инструкций, которые он может одновременно отправить в исполнительные устройства. Большая часть сложности при проектировании суперскалярной архитектуры процессора заключается в создании эффективного диспетчера. Диспетчер должен быстро определять, могут ли инструкции выполняться параллельно, а также отправлять их таким образом, чтобы как можно больше исполнительных устройств были заняты. Это требует максимально частого заполнения конвейера инструкций и значительного объема кэш-памяти процессора. Это также делает важными методы предотвращения опасностей, такие как предсказание ветвлений, спекулятивное выполнение, переименование регистров, выполнение вне порядка и транзакционная память для поддержания высокого уровня производительности. Пытаясь предсказать, по какой ветви (или пути) пойдет условная инструкция, процессор может минимизировать количество раз, когда весь конвейер должен ждать завершения условной инструкции. Спекулятивное выполнение часто обеспечивает умеренное повышение производительности за счет выполнения частей кода, которые могут не понадобиться после завершения условной операции. Выполнение вне порядка несколько изменяет порядок выполнения инструкций, чтобы уменьшить задержки, вызванные зависимостями данных. Также, в случае одного потока инструкций и нескольких потоков данных, когда необходимо обработать большой объем данных одного типа, современные процессоры могут отключать части конвейера, так что при многократном выполнении одной инструкции процессор пропускает этапы выборки и декодирования, тем самым значительно повышая производительность в определенных случаях, особенно в высокомонотонных программных средах, таких как программное обеспечение для создания видео и обработки фотографий. Если часть процессора является суперскалярной, то не суперскалярная часть испытывает снижение производительности из-за задержек планирования. Intel P5 Pentium имел два суперскалярных АЛУ, которые могли принимать по одной инструкции за такт, но его блок операций с плавающей точкой — нет. Таким образом, P5 был суперскалярным для целочисленных операций, но не для операций с плавающей точкой. Преемник архитектуры P5 от Intel, P6, добавил суперскалярные возможности в свои функции с плавающей точкой. Простая конвейерная обработка и суперскалярная конструкция увеличивают ILP процессора, позволяя ему выполнять инструкции со скоростью, превышающей одну инструкцию за такт. Большинство современных конструкций процессоров по крайней мере в некоторой степени являются суперскалярными, и почти все универсальные процессоры, разработанные за последнее десятилетие, являются суперскалярными. В последние годы часть акцента в разработке компьютеров с высоким ILP была перенесена из аппаратной части процессора в его программный интерфейс, или архитектуру набора команд (ISA). Стратегия очень длинного слова инструкции (VLIW) заставляет часть ILP быть явно заданной программным обеспечением, уменьшая объем работы процессора по повышению ILP и, тем самым, снижая сложность проектирования.

Параллелизм на уровне задач

Другая стратегия достижения производительности заключается в параллельном выполнении нескольких потоков или процессов. Эта область исследований известна как параллельные вычисления. В таксономии Флинна эта стратегия известна как множественный поток инструкций, множественный поток данных (MIMD). Одна из технологий, используемых для этой цели, – мультипроцессинг (MP). Первоначальный тип этой технологии известен как симметричный мультипроцессинг (SMP), где небольшое количество процессоров разделяют согласованное представление о своей системе памяти. В этой схеме каждый процессор имеет дополнительное аппаратное обеспечение для поддержания постоянно актуального представления о памяти. Избегая устаревших представлений памяти, процессоры могут совместно работать над одной программой, а программы могут мигрировать с одного процессора на другой. Для увеличения количества совместно работающих процессоров, таких как неравномерный доступ к памяти (NUMA) и протоколы когерентности на основе каталогов, были введены в 1990-х годах. Системы SMP ограничены небольшим количеством процессоров, в то время как системы NUMA были созданы с тысячами процессоров. Изначально мультипроцессинг строился с использованием нескольких дискретных процессоров и плат для реализации межсоединений между процессорами. Когда процессоры и их межсоединения реализованы на одном чипе, технология известна как многопроцессорная обработка на уровне чипа (CMP), а сам чип – как многоядерный процессор. Позже было признано, что более тонкозернистый параллелизм существует внутри одной программы. Одна программа может иметь несколько потоков (или функций), которые могут выполняться раздельно или параллельно. Одни из первых примеров этой технологии реализовали обработку ввода-вывода, например, прямой доступ к памяти, как отдельный поток от вычислительного потока. Более общий подход к этой технологии был представлен в 1970-х годах, когда системы были разработаны для параллельного выполнения нескольких вычислительных потоков. Эта технология известна как многопоточность (MT). Этот подход считается более экономически эффективным, чем мультипроцессинг, поскольку для поддержки MT реплицируется лишь небольшое количество компонентов внутри процессора, в отличие от всего процессора в случае MP. В MT исполнительные устройства и система памяти, включая кэши, совместно используются несколькими потоками. Недостатком MT является то, что аппаратная поддержка многопоточности более заметна для программного обеспечения, чем в MP, и, следовательно, системное программное обеспечение, такое как операционные системы, должно претерпевать более значительные изменения для поддержки MT. Один из реализованных типов MT известен как временная многопоточность, когда один поток выполняется до тех пор, пока не возникнет задержка в ожидании возврата данных из внешней памяти. В этой схеме процессор быстро переключается на другой готовый к выполнению поток, переключение часто выполняется за один такт процессора, например, в UltraSPARC T1. Другой тип MT – это одновременная многопоточность, когда инструкции из нескольких потоков выполняются параллельно в течение одного такта процессора. В течение нескольких десятилетий, с 1970-х до начала 2000-х годов, основное внимание при разработке высокопроизводительных процессоров общего назначения уделялось достижению высокой степени ILP (Instruction Level Parallelism) с помощью таких технологий, как конвейеризация, кэширование, суперскалярное выполнение, внеочередное выполнение и т.д. Эта тенденция привела к созданию больших, энергоемких процессоров, таких как Intel Pentium 4. К началу 2000-х годов разработчики процессоров столкнулись с трудностями в достижении более высокой производительности с помощью методов ILP из-за растущего разрыва между тактовой частотой процессора и тактовой частотой основной памяти, а также из-за увеличения энергопотребления процессора из-за более сложных методов ILP. Затем разработчики процессоров заимствовали идеи из коммерческих вычислительных рынков, таких как обработка транзакций, где общая производительность нескольких программ, также известная как пропускная способность, была более важна, чем производительность отдельного потока или процесса. Это изменение акцента подтверждается распространением процессоров с двумя и более ядрами и, в частности, новыми разработками Intel, напоминающими его менее суперскалярную архитектуру P6. Поздние модели нескольких ...

Паралелизм данных

Менее распространенная, но все более важная парадигма процессоров (и, в целом, вычислений) связана с параллелизмом данных. Рассмотренные ранее процессоры относятся к скалярным устройствам. Как следует из названия, векторные процессоры обрабатывают несколько элементов данных в рамках одной инструкции. Это отличается от скалярных процессоров, которые обрабатывают один элемент данных для каждой инструкции. В соответствии с таксономией Флинна, эти два подхода к обработке данных обычно обозначаются как однопоточная, многоданные (SIMD) и однопоточная, одноданные (SISD) соответственно. Значительное преимущество создания процессоров, работающих с векторами данных, заключается в оптимизации задач, требующих выполнения одной и той же операции (например, суммирования или скалярного произведения) над большим набором данных. Классическими примерами таких задач являются мультимедийные приложения (изображения, видео и звук), а также многие научные и инженерные расчеты. В то время как скалярный процессор должен полностью выполнить процесс выборки, декодирования и исполнения каждой инструкции и каждого значения в наборе данных, векторный процессор может выполнить одну операцию над сравнительно большим набором данных с помощью одной инструкции. Это возможно только тогда, когда приложение требует множества шагов, применяющих одну и ту же операцию к большому набору данных. Большинство ранних векторных процессоров, таких как Cray 1, использовались преимущественно в научных исследованиях и криптографии. Однако, с переходом мультимедиа в цифровую среду, потребность в SIMD в процессорах общего назначения стала существенной. Вскоре после того, как блоки операций с плавающей точкой стали стандартной функцией процессоров общего назначения, появились спецификации и реализации SIMD-блоков и для них. Некоторые из этих ранних спецификаций SIMD, такие как Multimedia Acceleration eXtensions (MAX) от HP и MMX от Intel, работали только с целыми числами. Это стало серьезным препятствием для некоторых разработчиков программного обеспечения, поскольку многие приложения, выигрывающие от использования SIMD, в основном работают с числами с плавающей точкой. Со временем разработчики усовершенствовали и переработали эти ранние разработки в современные, широко используемые спецификации SIMD, которые обычно связаны с определенной архитектурой набора инструкций (ISA). Примерами являются Streaming SIMD Extensions (SSE) от Intel и AltiVec, связанный с PowerPC (также известный как VMX).

Счетчик производительности оборудования

Многие современные архитектуры (включая встраиваемые) часто включают в себя аппаратные счетчики производительности (HPC), которые обеспечивают сбор, оценку, отладку или анализ метрик работающего программного обеспечения на низком уровне (уровне инструкций). HPC также могут использоваться для обнаружения и анализа необычной или подозрительной активности программного обеспечения, такой как эксплойты, использующие обратное ориентированное программирование (ROP) или sigreturn-ориентированное программирование (SROP) и т.п. Обычно это делается командами по обеспечению безопасности программного обеспечения для оценки и выявления вредоносных двоичных программ. Многие крупные производители (такие как IBM, Intel, AMD и Arm) предоставляют программные интерфейсы (обычно написанные на C/C++), которые можно использовать для сбора данных из регистров процессора с целью получения метрик. Производители операционных систем также предоставляют программное обеспечение, такое как perf (Linux), для записи, оценки или трассировки событий процессора, возникающих в ядрах и приложениях. Аппаратные счетчики обеспечивают метод с низкой нагрузкой для сбора всесторонних метрик производительности, связанных с основными элементами процессора (функциональными блоками, кэшами, основной памятью и т.д.) – значительное преимущество по сравнению с программными профилировщиками. Кроме того, они обычно избавляют от необходимости изменять исходный код программы. Поскольку аппаратные реализации различаются в зависимости от архитектуры, конкретные типы и интерпретации аппаратных счетчиков также будут меняться.

Привилегированные режимы

Большинство современных процессоров имеют привилегированные режимы для поддержки операционных систем и виртуализации. Облачные вычисления могут использовать виртуализацию для предоставления виртуальных центральных процессоров (vCPU) отдельным пользователям. Хост — это виртуальный эквивалент физической машины, на которой работает виртуальная система. Когда несколько физических машин работают согласованно и управляются как единое целое, объединенные вычислительные и память ресурсы образуют кластер. В некоторых системах возможно динамическое добавление и удаление машин из кластера. Ресурсы, доступные на уровне хоста и кластера, могут быть разделены на пулы ресурсов с высокой степенью детализации.

Выступление

Производительность или скорость процессора зависит, помимо множества других факторов, от тактовой частоты (обычно измеряемой в герцах или кратных герцах) и количества инструкций, выполняемых за такт (IPC), которые в совокупности определяют количество инструкций в секунду (IPS), которое процессор способен выполнить. Многие заявленные значения IPS отражают "пиковую" производительность на искусственных последовательностях инструкций с минимальным количеством переходов, в то время как реальные рабочие нагрузки состоят из смеси инструкций и приложений, некоторые из которых требуют больше времени на выполнение, чем другие. На производительность процессора также существенно влияет производительность иерархии памяти, что редко учитывается при расчете IPS. В связи с этими проблемами были разработаны различные стандартизированные тесты, часто называемые "бенчмарками", такие как SPEC, для попытки измерения реальной эффективной производительности в типичных приложениях. Производительность компьютеров повышается за счет использования многоядерных процессоров, которые, по сути, представляют собой объединение двух или более отдельных процессоров (в данном контексте называемых ядрами) в одном интегральном чипе. В идеале, двухъядерный процессор должен быть почти в два раза мощнее одноядерного. Однако на практике прирост производительности значительно меньше, около 50%, из-за несовершенства программных алгоритмов и реализации. Увеличение количества ядер в процессоре (например, двухъядерный, четырехъядерный и т.д.) увеличивает объем обрабатываемых задач. Это означает, что процессор теперь может обрабатывать множество асинхронных событий, прерываний и т.п., которые могут стать серьезной нагрузкой на процессор при перегрузке. Эти ядра можно представить как разные этажи на производственном предприятии, где каждый этаж выполняет свою задачу. Иногда ядра могут выполнять одни и те же задачи, что и соседние, если одного ядра недостаточно для обработки информации. Многоядерные процессоры повышают способность компьютера выполнять несколько задач одновременно, предоставляя дополнительную вычислительную мощность. Однако увеличение скорости не пропорционально количеству добавленных ядер. Это связано с тем, что ядрам необходимо взаимодействовать друг с другом по определенным каналам, и эта межъядерная коммуникация потребляет часть доступной вычислительной мощности. Благодаря специфическим возможностям современных процессоров, таким как одновременная многопоточность и uncore, которые подразумевают совместное использование аппаратных ресурсов процессора для повышения его загрузки, мониторинг производительности и использования оборудования постепенно становится все более сложной задачей. В ответ на это некоторые процессоры реализуют дополнительную аппаратную логику, которая отслеживает фактическое использование различных частей процессора и предоставляет различные счетчики, доступные программному обеспечению; примером является технология Performance Counter Monitor от Intel.