<< Пред.           стр. 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

<< Пред.           стр. 2 (из 12)           След. >>

Список литературы по разделу