<< Пред. стр. 2 (из 12) След. >>
2) тактовой частотой работы процессора;3) количеством операций (инструкций), выполняемых за один такт работы процессора (IPC – Instruction Per Cycle).
Разрядность регистров определяет диапазон допустимых значений операндов (длину слова). Чем больше разрядность регистров процессора, тем более длинное слово (или большая порция данных) обрабатывается за один такт работы процессора и тем больше объем прямоадресуемой памяти. Исторически по мере развития процессоров происходил переход от первых 4-разрядных микропроцессоров к 8-разрядным и далее к 16- и 32-разрядным. Основной проблемой перехода к более высокой разрядности процессоров на сегодняшний день являются ограничения программного уровня. Так, для массового перехода от 32-разрядных процессоров к 64-разрядным необходима разработка практически нового 64-разрядного программного обеспечения. Однако следует отметить, что в настоящее время для 64-разрядных процессоров предложены решения постепенной миграции от 32-разрядных к 64-разрядным программным приложениям.
Увеличение тактовой частоты работы процессора – наиболее прямолинейный способ повышения производительности процессоров. С одной стороны рост тактовой частоты ограничен размерами элементарных функциональных компонентов процессорного ядра – транзисторов (чем меньше размер транзистора, тем на более высокой частоте он способен работать). С другой стороны современные процессоры включают в себя миллионы транзисторов, образующих сложные электронные схемы, что приводит к увеличению времени прохождения сигналов в процессоре. Такие «схемные задержки» тоже лимитируют максимально возможные значение тактовой частоты работы процессора.
Для увеличения тактовой частоты работы процессоров постоянно совершенствуются технические и технологические решения, применяемые при производстве процессоров. Одним из основных путей в этом направлении является снижение так называемых проектных норм (параметров) технологического процесса, определяющих размеры формируемых на полупроводниковой подложке элементов – транзисторов и межсоединений. За последние годы сменилось несколько поколений техпроцесса: 0,8 мкм – 0,5 мкм – 0,35 мкм – 0,25 мкм – 0,18 мкм – 0,13 мкм – 0,09 мкм. Каждый, как видно из приведенного ряда, уменьшает размеры элементов примерно на 30%, а их площадь (квадрат линейного размера) – примерно в 2 раза. Соответственно, плотность размещения элементов с каждым новым техпроцессом удваивается, что позволяет производить более сложные (с большим числом элементов) и более дешевые (меньшая площадь процессорного кристалла) процессоры. Другими продуктивными путями улучшения характеристик процессоров стало применение в их производстве новых материалов и соответствующих технологий, таких как использование в качестве проводящих областей и внутриядерных межсоединений меди вместо алюминия («медная» технология), использование вместо двуокиси кремния специальных диэлектриков с низкой проницаемостью (технология «Low-K-диэлектриков»), применение для уменьшения емкости транзисторов специального изолирующего слоя между кремниевой подложкой и слоем кремния, в котором формируются транзисторы (технология «кремний-на-изоляторе»), изменение параметров кристаллической решетки кремния путем размещения слоя кремния на специальном полупроводниковом слое (подложке), имеющим большие межатомные расстояния (технология «растянутого кремния»). Суть технологии «растянутого» (напряженного) кремния заключается в том, что кристаллическая решетка подложки «растягивается» таким образом, чтобы атомы разошлись на большее расстояние. Подстраиваясь под кристаллическую решетку подложки, атомы кремния «раздвигаются» на большее расстояние. В результате сопротивление движению электронов через кристаллическую решетку уменьшается, транзисторы могут пропускать больший ток, а следовательно и быстрее срабатывать, выделяя при этом меньше тепла. Эти решения позволили добиться повышения тактовой частоты, на которой способны работать процессоры, а также снизить удельные тепловыделения (за счет уменьшения потерь на перезарядку емкости транзисторов, уменьшения резистивных потерь в межсоединениях и снижения напряжения питания).
Увеличение количества операций (инструкций), выполняемых за один такт работы процессора (параметр IPC), достигается путем эффективного кэширования (см. подраздел 3.4) и совершенствования архитектурного построения процессора.
2.2. Архитектурные способы повышения производительности процессоров
Одним из наиболее эффективных способов повышения производительности процессоров является внедрение в вычислительный процесс параллелизма на уровне команд. Основное архитектурное решением в этом направлении – конвейерная обработка команд.
Механизм конвейерной обработки команд и организации таким образом их параллельного выполнения был впервые предложен в 1956 году в Советском Союзе С. А. Лебедевым, одним из руководителей разработки первых отечественных ВМ (см. раздел 1). Первоначально этот механизм в авторском изложении имел название «принцип трубопровода» и, перекочевав за рубежи нашей страны, получил дословный англоязычный перевод – «pipelining». Последующая «конвертация» этого понятия привела к появлению в русскоязычной технической литературе термина «конвейеризация», который и имеет на сегодняшний день наибольшее распространение. Рассмотрим основную сущность механизма конвейерной обработки команд.
В классическом процессоре реализация некоторой произвольной команды сводится к выполнению нескольких последовательных операций (этапов). Типовой набор таких простейших этапов в самом общем и простом случае может быть представлен следующим перечнем: этап A – выборка команды, т.е. чтение очередной команды из памяти и занесение ее в регистр команды; этап B – декодирование команды, т.е. определение кода операции (или операций, так как команда может содержать несколько операций) и способов адресации операндов; этап C – вычисление адресов операндов, т.е. вычисление исполнительных адресов каждого из операндов в соответствии с указанным в команде способом их адресации; этап D – выборка операндов, т.е. извлечение операндов из памяти (эта операция не нужна для операндов, находящихся в регистрах); этап E – исполнение команды, т.е. исполнение указанной операции;
этап F – запись результата, т.е. занесение результата в память.
Если упрощенно считать, что каждая команда обязательно проходит все шесть этапов, а выполнение каждого из этапов требует некоторой условной единицы времени (например, это может быть такт работы процессора), то для выполнения шести элементарных этапов некоторой команды K1 в классическом процессоре потребуется 6 условных единиц времени работы процессора T. Для выполнения же двух аналогичных команд K1 и K2 соответственно потребуется 12 условных единиц времени, для выполнения трех команд – 18 условных единиц времени и т.д.
Идея конвейеризации заключается в выделении нескольких самостоятельных исполнительных блоков процессора для выполнения каждого из элементарных этапов команды и соединение таких блоков в последовательную цепочку так называемых ступеней конвейера. Для сравнения на рис.2.1 и рис.2.2 показаны условные схемы работы такой последовательной цепочки ступеней при классическом варианте их загрузки и при варианте их конвейерной загрузки.
ИСПОЛНИТЕЛЬНЫЕ БЛОКИ
A B C D E F
\/ \/ \/ \/ \/ \/
T1 К1
T2 К1
– – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
– – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
T5 К1
T6 К1
T7 К2
T8 К2
– – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
– – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
T11 К2
T12 К2
Рис.2.1. Условная схема работы последовательной цепочки
исполнительных блоков (ступеней) процессора
при классическом варианте их загрузки: K – команда,
T – условная единица времени работы процессора
ИСПОЛНИТЕЛЬНЫЕ БЛОКИ
A B C D E F
\/ \/ \/ \/ \/ \/
T1 К1
T2 К2 К1
T3 К3 К2 К1
T4 К4 К3 К2 К1
T5 К5 К4 К3 К2 К1
T6 К6 К5 К4 К3 К2 К1
T7 К7 К6 К5 К4 К3 К2
T8 К8 К7 К6 К5 К4 К3
T9 К9 К8 К7 К6 К5 К4
T10 К10 К9 К8 К7 К6 К5
T11 К11 К10 К9 К8 К7 К6
T12 К12 К11 К10 К9 К8 К7
Рис.2.2. Условная схема работы последовательной цепочки
исполнительных блоков (ступеней) процессора
при варианте их конвейерной загрузки: K – команда,
T – условная единица времени работы процессора
Легко подсчитать, что в последнем случае (рис.2.2), например, за 12 условных единиц времени (T1 – T12) будет выполнено 7 команд (K1 – K7) и еще 5 команд (K8 – K12) уже будут находиться на разных этапах выполнения. В классическом же варианте (рис.2.1) за эквивалентный промежуток времени будет выполнено только 2 команды, а для выполнения 7 команд потребуется 6 Ч 7 = 42 условных единицы времени.
Приведенный пример иллюстрирует работу конвейера команд в идеальном случае. На практике производительность конвейера может быть существенно ниже по сравнению с потенциально возможной в силу ряда имеющих место ситуаций, называемых конфликтными ситуациями в конвейере или просто «конфликтами».
Различают следующие конфликтные ситуации, которые принято именовать термином «риск»:
– риск по ресурсам, или структурный риск;
– риск по данным;
– риск по управлению (неоднозначность при выборке следующей команды в случае команд перехода).
Риск по ресурсам имеет место, когда несколько команд, находящихся на разных ступенях конвейера, пытаются одновременно использовать один и тот же ресурс, чаще всего – память. Так, в представленном выше типовом примере команды сразу три этапа (A, D и F) связаны с обращением к памяти, т.е. все три обращения могут производиться одновременно. Подобных конфликтов частично удается избежать за счет модульного построения основной памяти и использования кэш-памяти. В этих случаях имеется высокая вероятность того, что команды будут обращаться либо к разным модулям основной памяти, либо одна из них станет обращаться к основной памяти, а другая – к кэш-памяти. С этих позиций выгоднее разделять кэш-память на две части: кэш-память для команд и кэш-память для данных. Так как для сравнительно большого числа команд этапы выборки операнда и записи результата обычно не требуются, то конфликты из-за одновременного обращения к памяти могут в этом случае вообще не возникать. В целом, влияние риска по ресурсам на производительность конвейера по сравнению с другими видами рисков относительно невелико.
Риск по данным обусловлен взаимосвязанностью команд по данным и, в противоположность структурному риску, является типичной и регулярно возникающей ситуацией. Рассмотрим этот тип конфликта подробнее.
Пусть две команды в конвейере Ki и Kj предусматривают обращение к одной и той же переменной N, причем команда Ki предшествует команде Kj. В общем случае между Ki и Kj могут возникнуть четыре типа ситуации обращения к переменной N:
1) команда Kj читает N до того, как команда Ki успела записать новое значение N, то есть Kj ошибочно получит старое значение N вместо нового;
2) команда Kj записывает новое значение N до того, как команда Ki успела прочитать N, то есть команда Ki ошибочно получит новое значение N вместо старого;
3) команда Kj записывает новое значение N прежде, чем команда Ki успела записать в качестве N свое значение, то есть N ошибочно содержит i-е значение N вместо j-го.
4) команда Kj читает N прежде команды Ki.
Первая ситуация – наиболее частый вид конфликтов по данным, поскольку операция чтения в цикле команды (этап D) предшествует операции записи (этап F). Третья ситуация не вызывает особых проблем в конвейерах, где команды следуют в порядке, определенном программой, и могут производить запись только на этапе F. В худшем случае, когда одна команда догоняет другую из-за приостановки последней, имеет место конфликт по ресурсу – попытка одновременного доступа к одной и той же ячейке. Четвертая ситуация не вызывает никаких конфликтов, поскольку как Ki, так и Kj получат верное значение N.
Для преодоления конфликтов по данным важны своевременное обнаружение потенциального конфликта и его устранение. При этом используются как программные, так и аппаратные методы. Программные методы ориентированы на устранение самой возможности конфликтов еще на стадии компиляции программы. Например, оптимизирующий компилятор пытается создать такой объектный код, чтобы между командами, склонными к конфликтам, находилось достаточное количество нейтральных в этом плане команд. Если это не удается, то между конфликтующими командами компилятор вставляет необходимое количество «пустых» команд. Аппаратные методы применяются для непосредственного устранения возникающих конфликтов по данным. Наиболее очевидным решением является остановка команды Kj на несколько тактов для того, чтобы команда Ki успела завершиться или, по крайней мере, миновать ступень конвейера, вызвавшую конфликт. Соответственно задерживаются и команды, следующие в конвейере за командой Kj. Иногда возможна приостановка только команд Kj, не задерживая следующие за ней команды. Этот прием более эффективен, но требует существенного аппаратного усложнения конвейера.
Риск по управлению обусловлен командами, изменяющими естественный порядок вычислений, что создает наибольшие проблемы практической реализации эффективного конвейера. Канонический конвейер ориентирован на линейные программы. В нем ступень выборки извлекает команды из последовательных ячеек памяти, используя для этого счетчик команд. Адрес очередной команды в линейной программе формируется автоматически, за счет прибавления к содержимому счетчика команд числа, равного длине текущей команды в байтах. Реальные программы практически никогда не бывают линейными. В них как правило обязательно присутствуют команды управления, изменяющие последовательность вычислений. Это команды безусловных и условных переходов, команды вызова процедур, команды возврата из процедур и т. п. Доля подобных команд в программе в среднем составляет не менее 15 – 20%. Неоднозначность при выборке следующей команды в случае команд перехода может приводить к приостановке конвейера, что в целом снижает производительность процессора.
Приостановки конвейера при выполнении команд перехода обусловлены двумя факторами.
Первый фактор характерен для любой команды перехода и связан с выборкой команды из точки перехода (по адресу, указанному в команде перехода). То, что текущая команда относится к командам перехода, становится ясным только после декодирования (а именно после прохождения ступени декодирования), то есть минимум спустя два такта от момента поступления команды на конвейер. За это время на первые ступени конвейера уже поступят новые команды, извлеченные в предположении, что естественный порядок вычислений не будет нарушен. В случае перехода эти ступени необходимо очистить и загрузить в конвейер команду, расположенную по адресу перехода, для чего нужен исполнительный адрес последней. Поскольку в командах перехода обычно указаны лишь способ адресации и адресный код, исполнительный адрес предварительно должен быть вычислен, что и делается на третьей ступени конвейера. Таким образом, реализация перехода в конвейере требует определенных дополнительных операций, выполнение которых равносильно остановке конвейера в лучшем случае на два такта.
Второй фактор нарушения ритмичности работы конвейера имеет отношение только к командам условного перехода. До завершения команды условного перехода невозможно определить, какая из команд должна выполняться следующей. Если по условию команды переход не требуется, то конвейер просто загружает следующую команду в последовательности и продолжает свою работу. При этом получается максимально возможная производительность. Если же по условию команды переход требуется (а об этом заранее не было известно), то конвейер должен быть очищен от ненужных команд, выполнявшихся в нем на других ступенях до данного момента, после чего в первую ступень должна быть загружена нужная по условию команда. Из-за этого в течение нескольких тактов не будет завершена ни одна другая команда, что приведет к естественным издержкам при работе конвейера. При этом важно отметить, что если переход происходит, то такие издержки существенно больше, чем для прочих команд перехода, а если переход не происходит – отсутствуют совсем.
Для сокращения издержек, обусловленных выборкой команды из точки перехода, применяются такие методы, как:
1) вычисление исполнительного адреса перехода на ступени декодирования команды;
2) использование буфера адресов перехода;
3) использование кэш-памяти для хранения команд, расположенных в точке перехода;
4) использование буфера цикла.
В результате декодирования команды выясняется не только ее принадлежность к командам перехода, но также способ адресации и адресный код точки перехода. Это позволяет сразу же приступить к вычислению исполнительного адреса перехода, не дожидаясь передачи команды на следующую ступень конвейера, и тем самым сократить время остановки конвейера с двух тактов до одного. Для реализации этого метода в состав ступени декодирования вводятся дополнительные блоки, вычисляющие исполнительный адрес точки перехода.
Буфер адресов перехода (Branch Target Buffer – ВТВ) представляет собой кэш-память небольшой емкости, в которой хранятся исполнительные адреса точек перехода нескольких последних команд. Перед выборкой очередной команды ее адрес (содержимое счетчика команд) сравнивается с адресами команд, представленных в ВТВ. Для команды, найденной в буфере адресов перехода, исполнительный адрес точки перехода не вычисляется, а берется из ВТВ, благодаря чему выборка команды из точки перехода может быть начата на один такт раньше. Команда, ссылка на которую в ВТВ отсутствует, обрабатывается стандартным образом. Если это команда перехода, то полученный при ее выполнении исполнительный адрес точки перехода заносится в ВТВ, при условии, что команда завершилась переходом. Применение ВТВ дает наибольший эффект, когда отдельные команды перехода в программе выполняются многократно, что типично для циклов.
Кэш-память команд, расположенных в точке перехода (Branch Target Instruction Cache – BTIC), – это усовершенствованный вариант ВТВ, где в кэш-память помимо исполнительного адреса команды в точке перехода записывается также и код этой команды. За счет увеличения емкости кэш-памяти BTIC позволяет при повторном выполнении команды перехода исключить не только этап вычисления исполнительного адреса точки перехода, но и этап выборки расположенной там команды. Преимущества данного подхода в наибольшей степени проявляются при многократном исполнении одних и тех же команд перехода, главным образом при реализации программных циклов.
Буфер цикла представляет собой быстродействующую память, входящую в состав первой ступени конвейера, где производится выборка команд. В этом буфере сохраняются коды нескольких последних команд в той последовательности, в которой они выбирались. Когда имеет место переход, аппаратными средствами сначала проверяется, нет ли нужной команды в буфере, и если это так, то команда извлекается из буфера. Такой метод наиболее эффективен при реализации циклов и итераций, чем и объясняется название буфера. Если буфер достаточно велик, чтобы охватить все тело цикла, выборку команд из памяти достаточно выполнить только один раз в первой итерации, поскольку необходимые для последующих итераций команды уже находятся в буфере. Буфер цикла принципиально близок к BTIC. Однако в буфере цикла сохраняется последовательность выполнения команд, что и отличает его от BTIC.
Решение проблемы условных переходов является особенно важной задачей при проектировании процессоров, поскольку именно эта проблема приводит к наибольшим издержкам в работе конвейера. Для устранения или частичного сокращения указанных издержек используются механизмы буферов предвыборки, параллельных (множественных) потоков команд, задержанных переходов, а также различные стратегии предсказания переходов.
Буфер предвыборки представляет собой буферную память, организованную по принципу очереди. Он располагается между ступенью выборки команды и остальной частью конвейера. Этот буфер может рассматриваться как несколько дополнительных ступеней конвейера. Благодаря буферу предвыборки, во-первых, обеспечивается ритмичность подачи команд на вход конвейера. Это очень важный фактор, так как равномерность поступления команд на вход конвейера часто нарушается, например, при занятости памяти или при выборке команд, состоящих из нескольких слов. Во-вторых, для решения проблемы условных переходов, в конвейер включают два таких буфера. При этом каждая извлеченная из памяти и помещенная в основной буфер команда анализируется блоком перехода. При обнаружении команды условного перехода блок перехода вычисляет исполнительный адрес точки перехода и параллельно с продолжением последовательной выборки в основной буфер организует выборку в дополнительный буфер команд, начиная с точки условного перехода. Далее блок перехода определяет исход команды условного перехода, в зависимости от которого подключает к остатку конвейера нужный буфер, а содержимое другого буфера сбрасывается.
Другим решением проблемы условных переходов служит дублирование начальных ступеней конвейера и создание тем самым параллельных потоков команд. В одной из ветвей такого «раздвоенного» конвейера последовательность выборки и выполнения команд соответствует случаю, когда условие перехода не выполнилось, во второй ветви – случаю выполнения этого условия. Оба потока сходятся в точке, где итог проверки условия перехода становится очевидным. Дальнейшее продвижение по конвейеру продолжает только «правильный» поток.
Механизм задержанного перехода предполагает продолжение выполнения команд, следующих за командой условного перехода, вне зависимости от ее исхода. Естественно, что это имеет смысл, когда последующие команды являются «полезными», то есть такими, которые все равно должны быть когда-то выполнены, независимо от того, происходит переход или нет, и если команда перехода никак не влияет на результат их выполнения. Для реализации этой идеи на этапе компиляции программы после каждой команды перехода вставляется «пустая» команда типа «нет операции». Затем на стадии оптимизации программы производятся попытки «перемешать» команды таким образом, чтобы по возможности большее количество команд «нет операции» заменить «полезными» командами программы. При этом замещать команду «нет операции» можно лишь на такую, которая не влияет на условие выполняемого перехода, иначе полученная последовательность команд не будет эквивалентна исходной.
Предсказание переходов является наиболее эффективным способом борьбы с конфликтами по управлению в современных процессорах. Эта стратегия заключается в том, что еще до момента выполнения команды условного перехода или сразу же после ее поступления на конвейер делается предположение о наиболее вероятном исходе такой команды (переход произойдет или не произойдет). Последующие команды подаются на конвейер в соответствии с принятым предсказанием. При этом ритмичность функционирования конвейера без остановок и задержек тем выше, чем выше точность предсказания. Термин «точность предсказания» обычно трактуют как процентное отношение числа правильных предсказаний к их общему количеству. Предложено достаточно много способов реализации идеи предсказания переходов, отличающихся друг от друга исходной информацией, на основании которой делается прогноз, сложностью реализации и, главное, точностью предсказания. При классификации схем предсказания переходов обычно выделяют два подхода: статический и динамический, в зависимости от того, в какой момент времени и на базе какой информации делается предсказание.
Статическое предсказание переходов осуществляется на основе некоторой априорной информации о подлежащей выполнению программе. Предсказание делается на этапе компиляции программы и в процессе вычислений уже не меняется. Главное различие между известными механизмами статического прогнозирования заключается в виде информации, используемой для предсказания, и ее трактовке. Один из таких механизмов заключается в предсказании перехода на основе кода операции команды перехода. При этом для одних команд предполагается, что переход произойдет, а для других, что его не случится. Наиболее эффективным механизмом является статическое предсказание назначения командам условного перехода наиболее вероятного исхода по результатам так называемого профилирования подлежащих выполнению программ. Под профилированием подразумевается выполнение программы при некотором эталонном наборе исходных данных, сопровождающееся сбором информации об исходах каждой команды условного перехода. Исходы фиксируются в специальном бите кода операции. При выполнении программы поведение конвейера команд определяется после выборки команды по состоянию этого бита. Недостаток этого способа связан с тем, что изменение набора исходных данных для профилирования может существенно менять поведение одних и тех же команд условного перехода.
В динамических стратегиях предсказания переходов решение о наиболее вероятном исходе команды условного перехода принимается в ходе вычислений, исходя из информации о предшествующих переходах (истории переходов), собираемой в процессе выполнения программы. История переходов фиксируется в форме таблицы, которая носит название таблицы предыстории переходов.
Следует подчеркнуть, что в поведении многих команд условного перехода явно прослеживается тенденция повторяемости исхода: одни команды программы, как правило, завершаются переходом, в то время как другие совершаются без него, то есть имеет место так называемое бимодальное распределение исходов. Идея бимодальных схем предсказания к отделению команд, имеющих склонность завершаться переходом, от команд, при выполнении которых переход обычно не происходит. Такая дифференциация позволяет для каждой команды выбрать наиболее подходящее предсказание. Для реализации идеи в составе схемы предсказания достаточно иметь лишь одну таблицу, каждый элемент которой отображает историю исходов одной команды условного перехода. Для обращения к элементу, ассоциированному с определенной командой условного перехода, используется адрес этой команды. Бимодальные схемы предсказания переходов можно определить как схемы, содержащие один уровень таблиц истории переходов (обычно единственную таблицу), адресуемых с помощью адреса команды условного перехода. Таким образом, бимодальные схемы предсказания (называемые также одноуровневыми) ориентированы на те команды условных переходов, очередной исход которых существенно зависит от их собственных предыдущих исходов. В то же время для многих программ наблюдается сильная зависимость команд условных переходов не от собственных исходов, а от результатов выполнения других предшествующих им команд условных переходов. Это обстоятельство учитывается в двухуровневых адаптивных схемах предсказания переходов, называемых также коррелированными (чем подчеркивается то, что они отражают взаимозависимость команд условного перехода). При двухуровневом предсказании выбор исхода перехода обусловливается двумя источниками – командой, для которой делается предсказание, и информацией об истории предшествующих переходов.
Для вышерассмотренных стратегий характерна сильная зависимость точности предсказания от особенностей программ, в рамках которых эти стратегии реализуются. Определенная схема, эффективно работая с одними программными продуктами, может давать совершенно неудовлетворительные результаты при работе с другими. Иными словами, ни одна из стратегий предсказания переходов не является универсальной, то есть лучшей в любых ситуациях. Для того, чтобы в каждой конкретной ситуации задействовать тот механизм предсказания, от которого в данном случае можно ожидать наибольшей точности предсказания, применяются гибридные или соревновательные схемы. Они объединяют в себе несколько различных механизмов предсказания.
Еще одним важным фактором является то, что точность предсказания повышается с увеличением глубины предыстории переходов, но происходит это лишь после накопления соответствующей информации, для чего требуется некоторое время. Период накопления предыстории принято называть временем «разогрева». В процессе «разогрева» точность предсказания постепенно увеличивается.
В целом, динамические стратегии по сравнению со статическими стратегиями обеспечивают более высокую точность предсказания, которая может достигать 99%, а в среднем составляет не менее 85% – 95%.
Прогрессивным архитектурным решением является увеличению количества ступеней конвейера как за счет добавления новых ступеней, так и путем дробления имеющихся ступеней на несколько более простых подступеней. Такое решение обычно называют суперконвейеризацией. К классу суперконвейерных принято относить процессоры с более чем шестью ступенями в их конвейерах. Например, первый серийным суперконвейерный процессор имел конвейер команд из восьми ступеней. Суперконвейеризация в нем стала следствием разбиения этапов выборки команды и выборки операнда. Разбивая этапы обработки инструкций на небольшие стадии, можно упростить соответствующие исполнительные блоки и вследствие этого повысить предельные частоты устойчивой работы их электронных схем.
При разбиении одной или нескольких ступеней конвейера на N подступеней при одновременном повышении тактовой частоты внутри этих ступеней также в N раз можно на каждой ступени конвейера в пределах одного «внешнего» тактового периода выполнить N команд (как правило, более простых, результатом выполнения которых будет исходная более сложная команда). Разбиением каждой ступени конвейера на N подступеней при одновременном повышении тактовой частоты внутри конвейера в N раз добиваются N-кратного увеличения темпа работы конвейера и соответственно его эффективности, которая находится в прямой зависимости от того, с какой частотой на вход конвейера подаются объекты обработки. Другими словами, чем длиннее конвейер (чем больше у него ступеней), тем меньший объем вычислений выполняется за один такт и тем быстрее этот объем вычислений может быть выполнен. То есть для достижения максимально высоких тактовых частот следует увеличивать длину конвейера. Однако увеличение числа ступеней конвейера приводит к возрастанию вероятности конфликтов. При ошибочных предсказаниях переходов приходится очищать большее число ступеней конвейера, на что требуется больше времени. Усложняется логика взаимодействия ступеней конвейера и возникают другие дополнительные сложности. Поэтому перед разработчиками процессоров достаточно остро стоит проблема оптимального выбора числа ступеней конвейера команд.
Важное значение имеет архитектурное исполнение процессора с точки зрения степени сложности (или «комплексности») команд, с которыми процессор способен работать. С самого начала развития языков программирования основной задачей было их совершенствование в направлении упрощения для программистов процесса написания программ. Это привело к возникновению и интенсивному практическому использованию языков программирования высокого уровня (ЯВУ). Операции, характерные для ЯВУ, становились все более сложными по сравнению с операциями, реализуемыми простыми машинными командами, что стало приводить к неэффективному выполнению программ. Для разрешения этой проблемы разработчики процессоров непрерывно ВМ расширяли систему команд, дополняя ее командами, реализующими сложные операторы ЯВУ на аппаратурном уровне. Такие процессоры принято называть процессорами с полным набором команд или процессорами с CISC-архитектурой (Complex Instruction Set Computer – CISC). CISC-архитектура во многом позволяет сократить разрыв между сложными операторами программы и системой команд процессора, их реализующих. Однако это приводит к существенному усложнению электронных схем, т.е. аппаратных средств процессора (особенно реализующих функции управления), что в целом ограничивает возможности увеличения его производительности указанными ранее способами. Особые сложности связаны с организацией эффективного конвейера команд, который, как уже отмечалось, является одним из наиболее действенных механизмов повышения производительности процессоров.
Более простая по аппаратной реализации так называемая архитектура с сокращенным набором команд или RISC-архитектура (Reduced Instruction Set Computer – RISC) базируется на использовании менее сложных команд, чем в CISC-архитектуре. Основные усилия в RISC-архитектуре направлены на построение максимально эффективного конвейера команд, то есть такого, где все команды извлекаются из памяти и поступают в процессор на обработку в виде равномерного потока. При этом ни одна команда не должна находиться в состоянии ожидания, а процессор должен оставаться загруженным на протяжении всего времени. Для RISC-архитектуры характерны команды стандартной длины, равной ширине шины данных, соединяющей процессор и память. Вследствие сокращения числа выполняемых команд, форматов команд и данных, а также видов адресации существенно упрощается устройство управления, что приводит к значительному снижению задержек в формировании сигналов управления. Естественно, что в сокращенном списке команд должны оставаться те, которые используются наиболее часто. Известно, что около 85% времени выполнения типовых программ приходится на относительно малую часть команд, составляющую примерно 15%. К наиболее часто востребуемым действиям относятся пересылка данных, арифметические и логические операции. В RISC-архитектуре максимально сокращено число команд, имеющих доступ к памяти для выборки операндов и/или записи результатов. При этом доступ к памяти во время исполнения осуществляется только командами «чтение» и «запись», а все операции, кроме «чтение» и «запись», имеют тип «регистр – регистр». Для упрощения выполнения большинства команд и приведения их к типу «регистр – регистр» процессор должен быть снабжен значительным числом регистров общего назначения. Большое число регистров в процессоре позволяет обеспечить временное хранение промежуточных результатов, используемых как операнды в последующих операциях, что ведет к уменьшению числа обращений к памяти и ускорению выполнения операций. Однако увеличение числа регистров общего назначения способно дать эффект только при определенном предельном увеличение их числа и разумном их использовании. Оптимизация использования регистров в RISC-процессорах обеспечивается как программными, так и аппаратными средствами. Программная оптимизация использования регистров выполняется на этапе компиляции программы, написанной на языке высокого уровня. Компилятор стремится так распределить регистры процессора, чтобы разместить в них те переменные, которые в течение заданного периода времени будут использоваться наиболее интенсивно. Аппаратная оптимизация использования регистров в RISC-процессорах ориентирована на сокращение затрат времени при работе с процедурами, так как наибольшее время в программах, написанных на языках высокого уровня, расходуется на вызовы процедур и возврат из них, что связано с созданием и обработкой большого числа локальных переменных и констант.
Таким образом, применение RISC-архитектуры ведет к сокращению времени выполнения программы, а соответственно к увеличению быстродействия за счет сокращения числа циклов на команду. Более простое схемное исполнение устройства управления приводит к снижению его стоимости и повышению надежности. Недостатки же RISC-архитектуры являются следствием ее преимуществ. Принципиальный недостаток – сокращенное число команд: на выполнение ряда функций приходится тратить несколько команд вместо одной в CISC. Это удлиняет код программы, увеличивает загрузку памяти и трафик обмена информацией между памятью и процессором. В среднем RISC-программа примерно на 30% длиннее CISC-программы, реализующей те же функции. Хотя большое число регистров в RISC-архитектуре дает существенные преимущества, однако оно усложняет схему декодирования номера регистра, тем самым увеличивая время доступа к регистрам.
Еще одним эффективным архитектурным решением, вводящим в вычислительный процесс определенный уровень параллелизма, является применение так называемых векторных (потоковых) и матричных схем работы процессоров, которые используются для обработки многокомпонентных операндов типа вектор и массив.
В средствах векторной обработки под вектором понимается одномерный массив однотипных данных (обычно в форме с плавающей запятой), регулярным образом размещенных в памяти ВМ. Если обработке подвергаются многомерные массивы, они также могут быть рассмотрены как одномерные массивы данных – векторы, так как при размещении матрицы в памяти все ее элементы заносятся в ячейки с последовательными адресами, причем данные могут быть записаны строка за строкой или столбец за столбцом.
Векторным процессором называют процессор, в котором операндами некоторых команд могут выступать упорядоченные массивы (потоки) данных – векторы. При исполнении векторного процессора с конвейерным АЛУ обработка элементов векторов производится конвейерным АЛУ для чисел с плавающей занятой. При этом очередной элемент вектора подается для обработки на вход такого конвейера, как только освобождается первая ступень. Одновременные операции над элементами векторов можно проводить и с помощью нескольких параллельно используемых АЛУ, каждое из которых отвечает за одну пару элементов. Векторный процессор можно добавлять к обычному процессору. В результате те части программы, которые могут быть преобразованы в векторную форму, выполняются векторным блоком, а остальная часть программы – обычным процессором.
При обработке больших массивов данных применяются так называемые матричные, или массивно-параллельные, схемы исполнения процессоров. Они состоят из регулярного массива процессорных элементов и имеют общее управляющее устройство, генерирующее поток команд. Процессорные элементы работают параллельно и обрабатывают каждый свой поток данных. Для обеспечения достаточной эффективности такой системы при решении широкого круга задач, необходимо организовать связи между процессорными элементами так, чтобы наиболее полно загрузить их работой.
Высокое быстродействие векторных и матричных схем работы процессоров достигается за счет одновременной обработки всех компонентов вектора или массива, однако подобные операнды характерны лишь для достаточно узкого круга решаемых задач. Основной объем вычислительной нагрузки обычно приходится на скалярные вычисления, то есть на обработку одиночных операндов, таких, например, как целые числа. Для подобных вычислений дополнительный параллелизм реализуется значительно сложнее и для этого применяются так называемые суперскалярные схемы работы процессоров. Обычно суперскалярным называют процессор, который одновременно выполняет более чем одну скалярную команду. Это достигается за счет включения в состав процессора нескольких самостоятельных функциональных исполнительных блоков, каждый из которых отвечает за свой класс операций и может присутствовать в процессоре в нескольких экземплярах. Например, в процессоре могут быть дублированы или даже «троированы» блоки целочисленной арифметики и операций с плавающей точкой.
Типичный суперскалярный процессор включает в себя шесть блоков: выборки команд, декодирования команд, диспетчеризации команд, распределения команд по функциональным блокам, исполнения и обновления состояния. Блок выборки команд извлекает команды из основной памяти через кэш-память команд. Этот блок хранит несколько значений счетчика команд и обрабатывает команды условного перехода. Блок декодирования расшифровывает код операции, содержащийся в извлеченных из кэш-памяти командах (в некоторых суперскалярных процессорах блоки выборки и декодирования могут быть совмещены). Блоки диспетчеризации и распределения взаимодействуют между собой и в совокупности играют в суперскалярном процессоре роль контроллера трафика. Оба блока хранят очереди декодированных команд. Очередь блока распределения размещается по несколько самостоятельным буферам – накопителям команд или схемам резервирования, предназначенным для хранения команд, которые уже декодированы, но еще не выполнены. Каждый накопитель команд связан со своим функциональным блоком, поэтому число накопителей обычно равно числу функциональных блоков, но если в процессоре используется несколько однотипных функциональных блоков, то им придается общий накопитель. По отношению к блоку диспетчеризации накопители команд выступают в роли виртуальных функциональных устройств. В дополнение к очереди, блок диспетчеризации хранит также список свободных функциональных блоков, который используется для отслеживания состояния очереди распределения. Один раз за цикл блок диспетчеризации извлекает команды из своей очереди, считывает из памяти или регистров операнды этих команд, после чего, в зависимости от состояния списка свободных функциональных блоков, помещает команды и значения операндов в очередь распределения. Эта операция называется выдачей команд. Блок распределения в каждом цикле проверяет каждую команду в своих очередях на наличие всех необходимых для ее выполнения операндов и при положительном ответе начинает выполнение таких команд в соответствующем функциональном блоке. Блок исполнения состоит из набора функциональных блоков, таких как целочисленные операционные блоки, блоки умножения и сложения с плавающей запятой, блок доступа к памяти. Когда исполнение команды завершается, ее результат записывается и анализируется блоком обновления состояния, который обеспечивает учет полученного результата теми командами в очередях распределения, где этот результат выступает в качестве одного из операндов.
Итак, суперскалярность предполагает параллельную работу максимального числа исполнительных блоков, что возможно лишь при одновременном выполнении нескольких скалярных команд. Такое условие хорошо сочетается с конвейерной обработкой, поэтому обычно предполагается наличие в суперскалярном процессоре нескольких конвейеров. При построении суперскалярного процессора с углубленной степенью интеграции блок выборки извлекает из памяти более одной команды и передает их через ступени декодирования команды и вычисления адресов операндов в блок выборки операндов. Когда операнды становятся доступными, команды распределяются по соответствующим исполнительным блокам. Операции «чтение», «запись» и «переход» реализуются самостоятельными исполнительными блоками.
Применение суперскалярного подхода приводит к повышению производительности процессора в несколько раз. В некоторых современных процессорах суперскалярность совмещается с суперконвейеризацией.
Сочетание в суперскалярных процессорах множественности функциональных блоков с множественностью конвейеров команд, приводит к дополнительным проблемам их эффективного функционирования, в частности к проблемам последовательности поступления команд на исполнение и проблемам последовательности завершения команд. Первая из упомянутых проблем возникает, когда очередность выдачи декодированных команд на исполнительные блоки отличается от последовательности, предписанной программой. Подобную ситуацию называют неупорядоченной выдачей команд. Термин «упорядоченная выдача команд» применяют, когда команды покидают ступени, предшествующие ступени исполнения, в определенном программой порядке. В обоих случаях завершение команд обычно является неупорядоченным (неупорядоченное завершение команд), и это является второй проблемой. Упорядоченное же завершение происходит гораздо реже. В суперскалярных процессорах, с их множественными конвейерами и неупорядоченными выдачами/завершениями, взаимозависимость команд представляет серьезную задачу. Кроме того, существует еще один фактор, характерный только для суперскалярных процессоров – это конфликт по функциональному блоку, когда на него претендуют несколько команд, поступивших из разных конвейеров. В режиме параллельного выполнения нескольких команд процессор должен определить, в какой очередности ему следует выбирать команды из памяти, выполнять эти команды, позволять командам изменять содержимое регистров и ячеек памяти. Для достижения максимальной загрузки всех ступеней своих конвейеров суперскалярный процессор должен варьировать все перечисленные виды последовательностей, но так, чтобы получаемый результат был идентичен результату при выполнении команд в порядке, определенном программой. Значит, процессор обязан учитывать все виды зависимостей и конфликтов.
В самом общем виде стратегии выдачи и завершения команд могут быть сгруппированы в следующие комбинации:
1) упорядоченная выдача и упорядоченное завершение;
2) упорядоченная выдача и неупорядоченное завершение;
3) неупорядоченная выдача и неупорядоченное завершение.
Стратегия упорядоченной выдачи и упорядоченного завершения является наиболее простым в реализации вариантом, при котором выдача декодированных команд на исполнение производится в том же порядке, в котором они должны выполняться по программе (упорядоченная выдача), с сохранением той же последовательности записи результатов (упорядоченное завершение). При этом все, что затрудняет завершение команды в одном конвейере, останавливает и другой конвейер, так как команды должны покидать конвейеры, соответствуя порядку поступления на них.
Стратегия упорядоченной выдачи и неупорядоченного завершения дает возможность одному из конвейеров продолжать работать при «заторе» в другом. При этом команды, стоящие в программе «позже», могут быть фактически выполнены раньше предыдущих, «застрявших» в другом конвейере. Естественно, процессор должен гарантировать, что результаты не будут записаны в память, а регистры не будут модифицироваться в неправильной последовательности, поскольку при этом могут получиться ошибочные результаты. По сравнению с предыдущей стратегией возможность неупорядоченного завершения команд приводит к сокращению суммарного времени выполнения команд в процессоре.
Стратегия неупорядоченной выдачи и неупорядоченного завершения развивает предыдущую концепцию, разрешая процессору нарушать предписанный программой порядок выдачи команд на исполнение. Чтобы обеспечить неупорядоченную выдачу команд, в конвейере необходимо максимально развязать ступени декодирования и исполнения. Это обеспечивается с помощью специальной буферной памяти, называемой окном команд. Каждая декодированная команда сначала помещается в эту память. Процессор может продолжать выборку и декодирование новых команд вплоть до полного заполнения буфера. Выдача команд из буфера на исполнение определяется не последовательностью их поступления, а мерой готовности. Иными словами, любая команда, для которой уже известны значения всех операндов, при условии, что функциональный блок, требуемый для ее исполнения, свободен, немедленно выдается из буфера на исполнение. Стратегии неупорядоченной выдачи и неупорядоченного завершения также свойственны ранее рассмотренные ограничения. В частности, команда не может быть выдана, если она приводит к зависимости или конфликту. Разница заключается в том, что к выдаче готово больше команд, и это позволяет уменьшить вероятность приостановки конвейера.
В целом стратегия неупорядоченной выдачи и неупорядоченного завершения команд – это дополнительный потенциал повышения производительности суперскалярного процессора, для реализации которого, вместе с тем, необходимо решить две проблемы:
1) устранить зависимость команд по данным, то есть исключить использование в качестве операнда «устаревшего» значения регистра и не допускать, чтобы очередная команда программы из-за нарушения последовательности выполнения команд заносила свой результат в регистр еще до того, как это сделала предшествующая команда;
2) сохранить такой порядок выполнения команд, чтобы общий итог вычислений остался идентичным результату, получаемому при строгом соблюдении программной последовательности.
Несмотря на то, что обе задачи в принципе могут быть решены чисто программными средствами еще на этапе компиляции программы, в реальных суперскалярных процессорах для этих целей имеются соответствующие аппаратные средства. Каждая из перечисленных проблем решается своими методами и своими аппаратными средствами. Для устранения зависимости по данным используется прием, известный как переименование регистров. Способ решения второй проблемы обобщенно называют переупорядочиванием команд (или откладыванием исполнения команд).
Основная идея переименования регистров состоит в том, что каждый новый результат записывается в один из свободных в данный момент дополнительных регистров, при этом ссылки на заменяемый регистр во всех последующих командах соответственным образом корректируются. Переименование регистров может быть реализовано и по-другому, например, с помощью специального буфера переименования.
Способ переупорядочивания команд заключается в следующем. После декодирования команд и переименования регистров команды передаются на исполнение. Как уже отмечалось, выдача команд в функциональные блоки может производиться неупорядоченно, по мере готовности. Поскольку порядок выполнения команд может отличаться от предписанного программой, необходимо обеспечить корректность их операндов (частично решается путем переименования регистров) и правильную последовательность занесения результатов в регистры. Одним из наиболее распространенных приемов решения этих проблем и является способ переупорядочивание команд. В его основе лежат использование упомянутого выше окна команд (буферной памяти, куда помещаются все команды, прошедшие декодирование) и переименование регистров (последняя операция выполняется только с теми командами, которые записывают свой результат в регистры). Окно команд обеспечивает отсрочку передачи команд на исполнение до момента готовности операндов, а также нужную очередность завершения команд и загрузки их результатов в регистры.
Рассматриваемая технология предполагает схему распределения готовых команд по требуемым для их исполнения функциональным блокам с одновременной проверкой их доступности (диспетчеризацией). В каждом такте работы процессора готовыми к выдаче могут оказаться сразу несколько команд, и все готовые команды должны быть направлены в соответствующие функциональные блоки. Если имеется несколько однотипных блоков обработки, то в процессоре должна быть предусмотрена логика выбора одного из них.
Для поддержания правильной последовательности исполнения команд в случае нескольких параллельно работающих функциональных блоков применяется механизм буфера восстановления последовательности. Название буфера подчеркивает его основную задачу – поддержание строгой последовательности завершения команд путем переупорядочивания тех из них, которые исполнялись с нарушением этой последовательности. Однако этот буфер используется на практике и для других целей, например, для переименования регистров и для распределения декодированных команд по схемам резервирования.
Достаточно часто стратегии неупорядоченной выдачи и неупорядоченного завершения команд относят к методам так называемого динамического (или с измененным порядком) исполнения команд.
В последнее время благодаря развитию технологии производства микросхем начинает применяться процессорная VLIW-архитектура с командными словами сверхбольшой длины или со сверхдлинными командами (Very Long Instruction Word – VLIW). Идея VLIW-архитектуры базируется на том, что задача эффективного планирования параллельного выполнения нескольких команд возлагается на «разумный» компилятор. Такой компилятор вначале исследует исходную программу с целью обнаружить все команды, которые могут быть выполнены одновременно, причем так, чтобы это не приводило к возникновению конфликтов. В процессе анализа компилятор может даже частично имитировать выполнение рассматриваемой программы. На следующем этапе компилятор пытается объединить такие команды в пакеты, каждый из которых рассматривается как одна сверхдлинная команда. Объединение нескольких простых команд в одну сверхдлинную производится по следующим правилам:
– количество простых команд, объединяемых в одну команду сверхбольшой длины, равно числу имеющихся в процессоре функциональных (исполнительных) блоков;
– в сверхдлинную команду входят только такие простые команды, которые исполняются разными функциональными блоками, то есть обеспечивается одновременное исполнение всех команд, составляющих сверхдлинную команду.
Длина сверхдлинной команды обычно составляет от 256 до 1024 бит. Такая метакоманда содержит несколько полей (по числу образующих ее простых команд), каждое из которых описывает операцию для конкретного функционального блока. Каждое поле сверхдлинной команды отображается на свой функциональный блок, что позволяет получить максимальную отдачу от аппаратуры блока исполнения команд.
VLIW-архитектуру можно рассматривать как статическую суперскалярную архитектуру. Имеется в виду, что распараллеливание кода производится на этапе компиляции, а не динамически во время исполнения. То, что в выполняемой сверхдлинной команде исключена возможность конфликтов, позволяет предельно упростить аппаратуру VLIW-процессора и, как следствие, добиться более высокого быстродействия.
В качестве простых команд, образующих сверхдлинную, обычно используются команды RISC-типа, поэтому архитектуру VLIW иногда называют постRISC-архитектурой. Максимальное число полей в сверхдлинной команде равно числу вычислительных устройств и обычно колеблется в диапазоне от 3 до 20. Все вычислительные устройства имеют доступ к данным, хранящимся в едином многопортовом регистровом файле. Отсутствие сложных аппаратных механизмов, характерных для суперскалярных процессоров (предсказание переходов, внеочередное исполнение и т. д.), дает значительный выигрыш в быстродействии и возможность более эффективно использовать площадь микросхемы. Серьезной проблемой VLIW является усложнение регистрового файла и связей этого файла с вычислительными устройствами.
Дальнейшим развитием технологии VLIW стал новый подход к архитектуре процессора, известный как EPIC-архитектура, предполагающая вычисления с явным параллелизмом команд (Explicitly Parallel Instruction Computing – EPIC). По сути EPIC является усовершенствованным вариантом VLIW. В EPIC предполагается наличие в процессоре 128 штук 64-разрядных регистров общего назначения и 128 штук 80-разрядных регистров с плавающей запятой. Команды упаковываются (группируются) компилятором в сверхдлинную команду – связку длиною в 128 разрядов. Связка содержит три команды и шаблон, в котором указываются зависимости между командами, а также между другими связками. Одна связка, состоящая из трех команд, соответствует набору из трех функциональных блоков процессора. Процессоры с технологией EPIC могут содержать разное количество таких наборов из блоков, оставаясь при этом совместимыми по коду. Логика выдачи команд на исполнение сложнее, чем в традиционных процессорах VLIW-архитектуры, но намного проще, чем у суперскалярных процессоров с неупорядоченной выдачей. Концепция EPIC, сохраняя все достоинства архитектурной организации VLIW, обладает лучшей масштабируемостью архитектуры до большого количества функциональных блоков.
В общих чертах основными преимуществами VLIW-архитектуры является использование компилятора, который позволяет устранить зависимости между командами до того, как они будут реально выполняться, в отличие от суперскалярных процессоров, где такие зависимости приходится обнаруживать и устранять «на лету». Отсутствие зависимостей между командами в коде, сформированном таким компилятором, ведет к упрощению аппаратных средств процессора и за счет этого к существенному увеличению его быстродействия. Наличие множества функциональных блоков дает возможность выполнять несколько команд параллельно. Однако для эффективной реализации VLIW-архитектуры требуется новое поколение компиляторов, способных проанализировать программу, найти в ней независимые команды, связать такие команды в строки длиной от 256 до 1024 бит, обеспечить их параллельное выполнение. При этом компилятор должен учитывать конкретные детали аппаратных средств и в определенных ситуациях программа может оказаться недостаточно гибкой.
Характеристики реальных процессоров и применяемые в них архитектурные решения рассмотрим на примере современного этапа разработки процессоров, начало которого положено внедрением в вычислительную технику электронных микросхем с высокой степенью интеграции активных элементов – больших и сверхбольших интегральных схем (БИС и СБИС).
2.3. История разработки микропроцессоров и эволюции их характеристик
История микропроцессорной техники берет свое начало с выпуска в 1971 году корпорацией Intel первого в мире микропроцессора i4004. Этот микропроцессор был 4-разрядным и первоначально предназначался для использования в электронных калькуляторах. Уже через год Intel разработала 8-разрядный микропроцессор i8008, а еще через два года – i8080, на базе которого был собран первый коммерческий компьютер «персонального» Altair 8800.
В 1978 году появился 16-разрядный микропроцессор i8086, а через год вышла его более дешевая модификация i8088, имевшая 16-разрядные внутренние регистры, но 8-разрядную внешнюю шину данных. Это позволяло использовать совместно с i8088 недорогие 8-разрядные сопутствующие микросхемы, что и побудило корпорацию IBM выбрать i8088 в качестве процессора для своего знаменитого первого образца персонального компьютера IBM РС (IBM Personal Computer), который приобрел широкую популярность и быстрое распространение.
16-разрядные процессоры (далее для краткости будем употреблять термин «процессор» в общепринятом написании без приставки «микро», имея ее в виду) i8086 (i8088) заложили основы системы команд х86, базирующейся на CISC-архитектуре. Эта система команд стала стандартом де-факто на долгие годы.
Следующая модель от Intel – 16-разрядный i80286 (1982 г.) имел 16-разрядную внешнюю шину данных и 24 адресные линии, способные адресовать 16 Мбайт памяти (в отличие от 1 Мбайт адресного пространства у процессоров i8086 с 20-ю адресными линиями). В процессоре i80286 было впервые реализовано управление виртуальной памятью, организованной для обмена данными между оперативной памятью и внешними запоминающими устройствами.
Революционной разработкой Intel стал в 1985 году 32-разрядный процессор i80386. В основной модификации (i80386DX) этот процессор обладал 32-разрядной внешней шиной данных и 32 адресными линиями, обеспечивающими возможность адресации 4 Гбайт (2 в степени 32) памяти.
Для перечисленных выше моделей процессоров х86 корпорацией Intel были разработаны так называемые математические сопроцессоры (i8087, i80287, i80387). Математический сопроцессор представляет собой вычислительное устройство со своим набором регистров, архитектура которого оптимизирована под выполнение операций с плавающей точкой (причем не только сложения, вычитания, умножения и деления, но и более сложных операций, таких как вычисление логарифмов, тригонометрических функций и некоторых других). Сопроцессоры вплоть до модели i80387 не были интегрированы в ядро основного процессора и размещались отдельно от него, обеспечивая при этом совместную работу. Для работы нового исполнительного блока потребовалось расширение системы команд определенным набором инструкций. Этот блок получил название х87. Обработка инструкций х87 производилась следующим образом: их выборкой, декодированием и выдачей результатов занимался основной процессор, тогда как за исполнение инструкций отвечал сопроцессор, который подключался по мере необходимости. При этом в целях совместимости сохранялась возможность выполнения операций с плавающей точкой на АЛУ основного процессора. Но в этом случае проигрыш в производительности был весьма ощутим.
В сопроцессоре i80387 по сравнению с i8087 и i80287 был значительно расширен набор выполняемых инструкций и ускорено выполнение существующих. Например, если i8087 и i80287 из тригонометрических функций поддерживали лишь тангенс, а все остальные функции вычислялись только через тангенс половинного аргумента, то i80387 уже мог одной инструкцией вычислять синус и косинус.
Для компьютеров на базе i8086 и i80286 сопроцессор был редко устанавливаемым устройством, а вместе с процессором i80386 математический сопроцессор уже стал употребляться практически всегда. На сложных математических вычислениях сопроцессор позволял увеличить производительность ВМ в 20–30 раз.
На начальном этапе развития процессоров основными показателями прогресса были увеличение разрядности (4 – 8 – 16 – 32 разряда) и увеличение тактовой частоты работы процессора (i4004 – 108 КГц, i8008 – 2 МГц, i8086 – от 4,77 до 12 МГц, i80286 – от 6 до 20 МГц, i80368 – от 16 до 40 МГц). Однако рост быстродействия центрального процессора стало существенно опережать рост быстродействие оперативной памяти ВМ. Чтобы скорость работы ВМ в целом не ограничивалась быстродействием оперативной памяти, между процессорами старших моделей i80386 и основной памятью начали устанавливать небольшую по объему кэш-память, имеющую существенно более высокую скорость работы по сравнению с основной памятью.
На каждом из этапов эволюции процессоров с корпорацией Intel конкурировали другие производители, такие как корпорации IBM, AMD (American Micro Devises), NEC (Nippon Electronics Corporation), Cyrix, Weitek. В период повышения роли сопроцессоров конкурирующие корпорации особое внимание уделяли именно разработке новых сопроцессоров. Так, сопроцессоры Cyrix работали на 20–40% быстрее сопроцессоров Intel, а сопроцессоры Weitek – даже в 2–4 раза.
Выпуском в 1989 году нового процессора i80486 корпорация Intel избавилась от конкурентов на «сопроцессорном фронте». В процессор i80486 были введены два новшества: внутрь ядра процессора интегрированы сопроцессор и кэш-память объемом 8 Кбайт. Блок сопроцессора получил название FРU (Floating Point Unit, т. е. «устройство для обработки вещественных чисел») На этой стадии развития блок FРU оснащался набором 80-разрядных регистров, что позволяло оперировать с вещественными числами двойной точности. Набор реализуемых этим процессором команд возрос до 220.
Первое поколение процессоров i80486 (i80486DX) работало на тактовых частотах от 25 до 50 МГц. В следующем поколении этих процессоров было внедрен способ умножения внешней тактовой частоты, при котором система, состоящая из процессора, сопроцессора и кэш-памяти, работала на частоте, превышающей в 2–3 раза частоты работы системной шины и основной оперативной памяти, которые составляли 33 МГц. Таким образом, процессорная система i80486DX2 работала на частоте 66 МГц, а i80486DX4 – на 100 МГц. Клоны процессоров i80486, выпускаемые по лицензионному соглашению корпорацией AMD, работали и на более высоких частотах, а сама корпорация AMD на протяжении всей истории была и является основным серьезным конкурентом Intel.
Переход к 32-разрядной архитектуре процессоров позволял решать весьма ресурсоемкие задачи благодаря увеличению возможного объема адресного пространства до 4 Гбайт, что заведомо превосходило емкости запоминающих устройств того времени. Так как переход к 64-разрядным процессорам в тех условиях требовал существенных затрат на переработку имевшегося для персональных компьютеров достаточно обширного 32-разрядного программного обеспечения, дальнейшие усилия проектировщиков процессоров были направлены на совершенствование внутренней архитектуры 32-разрядных процессоров.
Одним из шагов в этом направлении стало использование в процессоре i80486 конвейерной архитектуры, хотя следует отметить, что разработчики семейства х86 начали заниматься проблемами такой архитектуры еще на стадии выпуска процессора i8086.
В 1993 году корпорацией Intel был выпущен новый процессор пятого поколения под названием Pentium. Эта торговая марка с целью борьбы с конкуренцией была запатентована, поэтому с того момента времени процессоры пятого поколения других разработчиков не имели права называться так же, как продукция Intel.
Pentium имел 32-разрядную адресную шину и 64-разрядную шину данных, две раздельные 8 килобайтные кэш-памяти (для данных и для команд). Эти процессоры выпускались с тактовыми частотами от 60 до 200 МГц. В процессоре Pentium была впервые применена суперскалярная архитектура. Pentium содержал два пятиступенчатых конвейера, функционирующих параллельно и обрабатывающих две команды за один такт. В Intel Pentium использовались следующие особенности обработки команд. После блоков предварительной выборки и первой стадии декодирования инструкции разделялись на два конвейера, в которых происходили их окончательная дешифрация, выполнение и запись результатов. Эти конвейеры не были полностью независимыми. Команды по ним продвигались только в связке, то есть, если на выполнение конкретной стадии у одной инструкции уходил один такт, а у другой – два такта, то первый конвейер был вынужден простаивать.
В 1995 году был выпущен процессор шестого поколения Intel Pentium Pro, работа которого предусматривалась на частотах 150 – 200 МГц. По внутренней и внешней разрядности он был аналогичен процессору Pentium и также содержал раздельную кэш-память для данных и для команд емкостью по 8 Кбайт. Однако новый процессор значительно отличался от предыдущего по архитектуре. В процессорах Pentium Pro в составе ядра появился кэш второго уровня. Он был менее быстрым, чем кэш первого уровня, но зато его объем варьировался в пределах от 256 Кбайт до 2 Мбайт. Заметим, что в настоящее время подобная иерархия кэш-памяти стала общепринятой, а серверные варианты процессоров оснащаются кэш-памятью третьего и даже четвертого уровней относительно большого объема (подробнее кэш-памяти см. в разделе 3).
Pentium Pro имел три конвейера с более высокой степенью конвейеризации и большим, чем у Pentium, числом ступеней в блоке арифметических операций. В Pentium Pro получили применение методы динамического исполнения команд, а также механизмы предсказания передач управления в программах при условных переходах. У корпорации AMD первенцем динамического исполнения команд стал процессор К6. Отметим, что только за счет архитектурных новаций производительность процессора Intel Pentium Pro по отношению к Intel 8086 выросла в десятки раз. Хорошей иллюстрацией к вышесказанному является тот факт, что у процессора Intel 8086 на обработку одной команды (инструкции) требовалось 12 тактов работы процессора, тогда как процессор Intel Pentium Pro в среднем выполнял две команды за такт. То есть производительность за один такт увеличилась в среднем в 24 раза. При этом тактовые частоты за тот же период выросли в меньшее число раз (15–20 раз), что наглядно подчеркивает важную роль архитектуры процессора в повышении его общей производительности.
С середины 1990-х годов персональный компьютер постепенно стал превращаться в мультимедийный центр. Быстро растущая производительность уже позволяла обычным ПК решать задачи обработки изображений, звука и даже видео. Развитие подобных приложений происходило настолько бурными темпами, что довольно быстро назрел вопрос внедрения в процессор специализированных исполнительных устройств для обработки так называемых потоковых данных, когда по одной команде обрабатываются множественные «наборы» («потоки» или «векторы») операндов. В первоначальном варианте системы команд х86 использовался принцип однопоточности команд и данных SISD (Single Instruction – Single Data, т.е. «одна инструкция – один набор операндов»). При этом каждая команда одновременно могла обрабатывать только один набор операндов. И даже в том случае, если несколько последовательно расположенных команд оперировали одними и теми же данными, их выполнение не могло быть оптимизировано.
Принцип однопоточности команд и многопоточности данных SIMD (Single Instruction – Multiple Data, т. е. «одна инструкция – много наборов операндов») позволил существенно ускорить обработку однотипных данных, которые очень часто используются в мультимедийных приложениях. Например, при умножении массива переменных на определенное число при однопоточной схеме работы процессор будет циклически повторять одни и те же действия для каждой переменной, в том числе много раз декодировать одну и ту же команду умножения. Работая же по многопоточной схеме, процессор только один раз декодирует инструкцию, а дальше будет заниматься только вычислениями и пересылкой данных. Кроме того, при наличии соответствующих аппаратных средств он может одновременно выполнять несколько операций. Естественно, такая схема работы процессора значительно повышает эффективность вычислений.
Итак, необходимость повышения производительности при обработке потоковых данных привела к тому, что практически каждый принципиально новый процессор оснащался дополнительными исполнительными блоками, а система команд х86 все расширялась и расширялась.
Корпорация Intel произвела модификацию своего процессора пятого поколения Pentium и в начале 1997 года выпустила процессор Pentium MMX (ММХ – MultiMedia eXtensions, «мультимедийные расширения»). Исполнительный блок ММХ был предназначен для оптимизации обработки потоков целочисленных данных, что ускоряло быстродействие при работе со звуком и графикой. Отметим, что ММХ являлся первой реализацией многопоточной схемы на процессорах семейства х86. Расширение ММХ дополнило систему команд х86 новыми командами (57 дополнительных инструкций). В распоряжении ММХ-инструкций находилось восемь 64-разрядных регистров, что позволяло одновременно обрабатывать не только 64-разрядные операнды, но и пары 32-разрядных, четверки 16-разрядных и, наконец, восьмерки 8-разрядных операндов. Таким образом, за счет упаковки данных, наличия специальных команд, которые умеют эти данные одновременно обрабатывать, и самого исполнительного устройства становилось возможным существенно увеличить производительность процессора.
Однако в процессорах Pentium физические регистры ММХ не были предусмотрены. Фактически потоковые инструкции работали с логическими регистрами, которые отображались на адресное пространство блока FPU. В результате исполнительные устройства FPU и ММХ не могли функционировать параллельно, что уменьшало пиковую производительность.
Отметим, что блок ММХ не нарушал совместимости процессоров Pentium с ранее написанными программами, так как при их выполнении он попросту отключался. Процессор Pentium ММХ имел вдвое увеличенную кэш-память (16+16 Кбайт) и выпускался для работы на тактовых частотах 166–233 МГц.
В середине 1997 года Intel представила новую модификацию ранее разработанного процессора шестого поколения Pentium Pro. Этот процессор получил торговую марку Pentium II. В нем использовались высокопроизводительная технология обработки информации, впервые внедренная в Pentium Pro, и расширенная система команд ММХ. Pentium II имел увеличенную кэш-память первого уровня (16+16 Кбайт) и кэш-память второго уровня емкостью 512 Кбайт. Важным отличием Pentium II являлась архитектура двойной независимой шины, первые варианты введения которой были уже у Pentium Pro. В этой архитектуре процессор обменивается данными с кэшем второго уровня по специализированной высокоскоростной шине (часто называемой backsidebus – «шина заднего фронта»), отделенной от основной системной шины (frontsidebus или FSB – «шина переднего фронта»), которая работает на частоте материнской платы. Наличие более скоростного канала обмена с кэш-памятью второго уровня существенно увеличивало быстродействие системы в целом. Процессоры Pentium II поддерживали двухпроцессорную конфигурацию ПК и выпускались в частотных модификациях от 233 до 600 МГц. Разрядность шины адреса у процессоров Pentium ММХ и Pentium II составляла 36 бит, что увеличивало потенциальный объем адресного пространства памяти до 64 Гбайт.
С 1998 года корпорация Intel начинает выпускать «облегченные» и, соответственно, более дешевые варианты своих базовых процессоров. Такие процессоры получили торговую марку Celeron, которая используется и по сей день. Первые процессоры Celeron являлись модификацией Pentium II с полным отсутствием или относительно небольшим объемом вторичного кэша (128 Кбайт), а также сокращенной разрядностью адресной шины с 36 до 32 бит. Процессоры Celeron были и остаются весьма популярными для установки в недорогих ПК, не слишком требовательных к производительности.
Модернизация Pentium II привела к разработке процессора Pentium III (1999 г.), который относят к шестому поколению процессоров. Главным отличием нового процессора стало использование в нем нового набора инструкций SSE, которые являются дальнейшим развитием системы потоковых команд SIMD. SSE (Streaming SIMD Extensions – «потоковые SIMD расширения») представляет собой подсистему команд, предназначенных для обработки уже не только целочисленных, но и вещественных данных. SSE по сравнению с ММХ представляет гораздо больше возможностей для повышения быстродействия процессора. Исполнительный блок SSE изначально оснащен восьмеркой 128-битных физических регистров ММХ, поэтому он может функционировать одновременно с FPU. В новую подсистему команд включены операции обработки упакованных вещественных и целых чисел. Однако, несмотря на значительный объем регистров ММХ, максимально допустимая разрядность вещественных чисел составляет 32 бита. Это позволяет программистам оперировать лишь с данными одинарной точности, что, конечно, является существенным недостатком SSE. Применение SSE при обработке ранее созданного программного кода естественно невозможно. Для этого требуется как минимум перекомпиляция с использованием специальных библиотек, а как максимум – оптимизация алгоритмов. Кроме того, чтобы ощутить преимущества потоковых команд, процессор необходимо перевести в специальный режим, что требует соответствующей поддержки от операционной системы. Поэтому поначалу инструкции SSE внедрялись в практику довольно медленно. Но со временем появились программы, оптимизированные под этот набор инструкций (игры, кодеки, графические редакторы и многое другое), и стало понятно, что SSE – большой шаг вперед в развитии схемы SIMD.
Еще до внедрения технологии SSE в процессоры Intel корпорация AMD предложила свой собственный набор SIMD-инструкций под названием «3DNow!». Впервые его поддержка была включена в процессор AMD К6-2. Этот набор инструкций представляет собой подсистему команд, ускоряющих выполнение операций трехмерной графики. Как и SSE, 3DNow! позволяет оперировать вещественными числами. Недостатком первой реализации данной технологии в процессоре AMD К6-2 следует признать тот факт, что блок 3DNow! фактически подменял FPU. В седьмом поколении этот недочет был исправлен. Но, к сожалению, технология 3DNow! так и не получила широкой поддержки разработчиков программ ввиду ее узкой направленности. К тому же в настоящее время основную работу по обработке изображений выполняют так называемые графические видеоакселераторы (см. подраздел 4.2), что существенно уменьшает значимость данного набора инструкций.
Необходимо отметить, что производители х86-процессоров, оставаясь в рамках CISC-архитектуры, постепенно переводили микроархитектуру процессоров на идеологически более совершенную основу – архитектуру RISC. Для использования такого подхода поступающие CISC-команды сначала переводятся во внутренние RISC-команды, которые и исполняются процессором. Корпорация Intel начала применять элементы RISC-архитектуры еще в четвертом поколении своих процессоров (процессор i486), однако только в шестом поколении (Pentium Pro, Pentium II и Pentium III) переход на использование внутренних RISC-команд был полностью завершен. Корпорация AMD перешла на внутреннюю RISC-архитектуру еще в процессоре пятого поколения К5.
В середине 1999 года корпорация AMD выпустила первый процессор седьмого поколения, которому была присвоена торговая марка Athlon. В этом процессоре была достигнута высокая степень параллелизма исполняемых инструкций и существенно возросла производительность операций над вещественными числами за счет трех полностью конвейеризированных исполнительных блоков. Была также применена высокопроизводительная системная шина с частотами 100 и 133 МГц с передачей данных по обоим фронтам тактового импульса (таким образом фактическая частота передачи данных при этом составляла 200 и 266 МГц, а пропускная способность – 1,6 и 2,1 Гбайт/с соответственно). Новый процессор в отличие от процессоров предыдущего поколения был значительно лучше оптимизирован для достижения высоких тактовых частот, что оказалось решающим фактором его дальнейшего успеха.
Выпуск процессоров Athlon заставил корпорацию Intel форсировать разработку своего 32-разрядного процессора седьмого поколения, промышленные образцы которого под торговой маркой Pentium 4 поступили в продажу к концу 2000 года. Главные архитектурные нововведения в Pentium 4 носят фирменное название архитектуры NetBurst и заключаются в следующих механизмах и технологиях. Во-первых, в Pentium 4 для достижения максимальных тактовых частот резко увеличены длины конвейеров (до 20 стадий) и эта архитектура по определению Intel получила название гиперконвейеризированной (hyperpipelining). Однако еще раз отметим, что производительность процессора не зависит прямо пропорционально от длины конвейера и для каждой конкретной архитектуры существует оптимальное значение числа стадий, которое к тому же зависит от тактовой частоты процессора и даже типа выполняемых приложений. Основное достоинство длинного конвейера заключается в возможности соответствующего увеличения тактовой частоты работы процессора. С другой стороны, у длинного конвейера могут быть велики потери за счет остановок, что приводит к снижению производительности. Например, AMD в своих процессорах использует относительно более короткие конвейеры, чем в процессорах Intel, но у процессоров AMD выше степень скалярности (пространственного распараллеливания обработки данных). Например, в процессоре AMD Athlon, как уже указывалось выше, имеется три исполнительных блока для обработки чисел с плавающей запятой.
Другим важным нововведением в Pentium 4 стала передача четырех пакетов данных по системной шине за один такт. Таким образом, при физической тактовой частоте шины 100, 133 и 200 МГц для передачи данных используются оба фронта тактового сигнала плюс сдвиг фазы на 90 градусов, в результате чего эффективная частота передачи составляет 400, 533 и 800 МГц, а пропускная способность – 3,2; 4,3 и 6,4 Гбайт/с соответственно.
В Pentium 4 были внедрены быстрый исполнительный механизм (Rapid Execution Engine) и трассирующий кэш (Execution Trace Cache). Оба они призваны скомпенсировать издержки сверхдлинного конвейера. Первый делает это за счет увеличения вдвое частоты работы каждого из двух АЛУ по сравнению с частотой работы процессора, а второй – за счет изменения алгоритма работы кэш-памяти первого уровня для команд, в которой кэшируются уже декодированные инструкции, сгруппированные в соответствии с предсказанными переходами (трассами). Это позволяет очень быстро загрузить конвейер командами в случае неправильно предсказанного перехода. Кэш-память первого уровня для данных в Pentium 4 стала быстрее – ее размер был уменьшен в два раза (до 8 Кбайт). Кэш-память второго уровня также стала быстрее, но в данном случае уже за счет имевшегося резерва – данные передаются на каждый такт, а не через такт. Были усовершенствованы и другие блоки процессора, увеличена эффективность предсказания переходов, введена дополнительная буферизация.
В процессоре Pentium 4 корпорация Intel сделала очередной (ставший уже традиционным) шаг в совершенствовании архитектуры х86 – ввела новое расширение команд SSE2 для потоковых SIMD-инструкций. Набор SSE2 содержит 144 инструкции и позволяет работать со 128-разрядными данными: целочисленными и с плавающей точкой (отметим, что предшествующий набор SSE работал с 64-разрядными данными, а ММХ – только с целочисленными). Кроме того, в SSE2 появились новые инструкции для управления кэшированием, а именно для осуществления предварительной выборки и потоковой передачи данных. Результатом внедрения SSE2 стал значительный рост производительности процессора в мультимедийных приложениях, многих играх, задачах кодирования видео, научных расчетах. Фактически оказалось, что блок, ответственный за обработку SIMD-инструкций в процессорах Pentium 4, оказался мощнее, чем FPU. Подчеркнем, что все отличия SSE2 от SSE заключаются в системе команд и не касаются архитектуры процессора.
В процессорах Pentium 4 поддерживается новая технология Hyper-Threading. Суть этой технологии (название которой можно перевести как «многопоточность») заключается в том, что при исполнении нескольких потоков (т. е. нескольких приложений либо многопоточного приложения) процессор имеет возможность распределять ресурсы между ними. Такая схема коренным образом отличается от многозадачного режима работы, так как в последнем случае процессор распределяет лишь процессорное время, постоянно переключаясь между задачами. На практике Hyper-Threading реализуется следующим образом. Для программиста и операционной системы процессор с поддержкой этой технологии представляется как пара логических процессоров. На этапе выборки и дешифрации команд данная технология не вносит никаких изменений в процесс обработки данных, но после того, как команды «разложены» на микроинструкции, становится возможным параллельное исполнение двух потоков. Если, к примеру, текущая инструкция из первого потока осуществляет сложение целых чисел, а из второго – умножение вещественных, то они будут выполняться одновременно, задействовав ALU и FPU соответственно. При этом для каждой из них будут выделяться логические регистры путем переименования физических. Естественно, может возникнуть конфликтная ситуация, когда обоим потокам потребуются одни и те же исполнительные устройства. В этом случае процессор сам решает, какой из потоков имеет больший приоритет. Тесты процессоров Intel Pentium 4 с Hyper-Threading указывают на то, что во многих приложениях, работающих «в одиночку», данная технология не приводит к заметному росту быстродействия. С другой стороны, к примеру, в задачах кодирования видеоинформации и обработки изображений увеличение производительности достигает 10–15%. Но наибольший прирост производительности (до 30–40%) Hyper-Threading обеспечивает при одновременном выполнении нескольких приложений, поэтому новая технология имеет очевидные преимущества.
Необходимо отметить, что начиная с процессоров пятого поколения, корпорация Intel, а затем и другие фирмы-производители стали присваивать собственные имена процессорным ядрам (кристаллам), как элементам, во многом определяющим производительность процессоров. Таким образом, процессоры одной линии, построенные на разных ядрах, имеют как бы двойное наименование, которое указывается в их технических характеристиках. Каждое новое ядро с новым именем становится более совершенным по сравнению с предыдущим, а соответственно появление в наименовании процессора нового имени его ядра свидетельствуют об улучшении технических характеристик процессора. Например, процессоры Pentium III прошли следующую эволюцию ядер: Katmai – Coppermine – Tualatin, а семейство Celeron: Deschutes – Mendocino – Coppermine – Tualatin –Willamette – Northwood – Prescott.
Процессоры Pentium 4 образца 2003 года, изготовленные на основе процессорного ядра Northwood (выполнено по 0,13-мкм технологии с применением медных соединений, имеет площадь 146 мм2 и содержит 55 млн транзисторов) достигли частоты 3,4 ГГц, имели кэш-память второго уровня объемом 512 Кбайт, передача данных осуществлялась по системной шине с эффективной частотой 800 МГц (при реальной частоте шины FSB на материнской плате – 200 МГц).
В это же время наивысший уровень процессоров AMD определялся процессором Athlon XP с рейтингом 3200+ (тактовая частота 2250 МГц), кэш-памятью первого уровня 128 Кбайт (64+64), кэш-памятью второго уровня 512 Кбайт и шиной с частотой 400 МГц. Старшие модели Athlon XP реализованы на процессорном ядре Barton с 0,13-мкм технологией и с использованием медных соединений, площадь ядра – 115 мм2, количество транзисторов – около 54 млн шт. Под рейтингом (или «номером модели») корпорация AMD понимает некоторую эффективную (условную) частоту, которая, по заявлениям AMD, определяется в результате тестирования процессора на различных приложениях и обозначает частоту, на которой должен работать некий эталонный процессор, чтобы иметь такую же производительность, как и тестируемый.
Соблюдая примерный паритет в производительности на реальных приложениях по сравнению с процессорами AMD Athlon XP, процессоры Pentium 4 работают на значительно более высоких частотах, но обладают при этом меньшими значениями параметра IPC. Это связано с различием в подходах корпораций Intel и AMD к проектированию процессоров, вследствие чего архитектуры Pentium 4 и Athlon отличаются чрезвычайно сильно. Поэтому сравнение их только по тактовой частоте абсолютно бессмысленно.
Для рынка недорогих настольных компьютеров корпорация AMD предложила к 2003 году свой модельный ряд недорогих процессоров Duron на ядре Morgan (0,18-мкм техпроцесс, площадь ядра – 106 мм2, количество транзисторов – около 25 млн), а также процессоры Athlon XP для нижнего ценового диапазона с более низкими рейтингами («младшие» модели от 1600+ до 2000+ с ядром Thoroughbred, имеющими выгодное соотношение цена/производительность).
В табл. 2.1 представлены основные технические и технологические характеристики базовых процессоров х86 с первого по седьмое поколения.
Таблица 2.1
Основные технические и технологические характеристики
базовых процессоров х86 с первого по седьмое поколения
Поколение
Семейство
процессоров Год начала выпуска
Разрядность, бит
Тактовая частота
процессора,
МГц Частота системной шины,
МГц Кэш-память L1,
Кбайт Кэш-память L2,
Кбайт Норма тех-
процесса, мкм
Количество тран- зисторов, млн
1
Intel 8086
Intel 8088
1978
1979
16
16
4,77 - 8
4,77 - 8
4,77-8
4,77-8
–
–
–
–
3
3
0,07
0,07
2 Intel 80286 1982 16 8 - 20 8 - 20 – – 1,5 0,18
3 Intel 80386 1985 32 16 - 33 16 - 33 – – 1 0,28
4 Intel 80486 1989 32 25 - 100 25 - 33 8 – 1 1,2
5
Intel Pentium
Intel Pentium
MMX 1993
1997 32
32 60 - 200
166-233 60 - 66
66 8+8
16+16 –
– 0,5
0,35 3,3
5,0
6
Intel
Pentium Pro
Pentium II
Pentium III
1995
1997
1999