Вы находитесь на странице: 1из 21

Процессоры с сокращенным набором инструкций

Основой архитектуры современных рабочих станций и серверов является


архитектура компьютера с сокращенным набором команд (RISC — Reduced Instruction Set
Computer).
Появление данной архитектуры обязано разработчикам ЭВМ CDC6600 которые поняли
важность упрощения набора команд для построения быстрых вычислительных машин .
Эту традицию упрощения архитектуры С. Крэй с успехом применил при создании
широко известной серии суперкомпьютеров компании Cray Research.
Основная идея архитектуры - отделение команд обработки от команд работы с
памятью , и эффективная конвейерная обработка. Система команд должна
разрабатываться таким образом, чтобы выполнение любой команды занимало небольшое
количество машинных тактов (предпочтительно один машинный такт ).
Логика выполнения команд с целью повышения производительности ориентируется на
аппаратную, а не на микропрограммную реализацию. Для того чтобы упростить логику
декодирования команд используются команды фиксированной длины и фиксированного
формата. Среди других особенностей RISC-архитектур следует отметить наличие
достаточно большого регистрового файла ( в типовых RISC- процессорах реализуются 32
или большее число регистров по сравнению с 8-16 регистрами в CISC-архитектурах ).
Это позволяет большему объему данных храниться в регистрах на процессорном кристалле большее
время и упрощает работу компилятора по распределению регистров под переменные. Для
обработки, как правило, используются команды , имеющие неразрушимый формат (трехадресные ), что
помимо упрощения дешифрации дает возможность сохранять большее число переменных в регистрах
без их последующей перезагрузки.
Основные черты RISC архитектуры :
• одинаковая длина команд ( обычно 4 байта) вместо переменного формата ( от 1 до 15 байт ),
характерного для CISC- процессоров;
• использование неразрушимого формата команд ( трехадресные команды ); одинаковый формат
команд: код команды , один регистр приемник, два регистра источника; отказ от сложных и
редко используемых команд;
• операндами команд могут быть только регистры ;
• команды выполняют только простые действия ;
• наличие большого количества регистров общего назначения ( от 32 до нескольких сотен, которые
могут быть использованы любой командой);
• наличие конвейеров ;
• время выполнения команды около одного такта;
• простая адресация, отказ от аппаратной реализации сложных способов адресации ( с
постинкрементом или предекрементом, косвенной адресации и др.);
• использование в командах обработки данных только регистровой адресации. Обращение к памяти
используется в командах загрузки и сохранения содержимого регистров, а также в командах
управления программой;
Типичными RISC- процессорами являются процессоры Alpha, PowerPC, PA-RISC, SPARC.
В качестве примера рассмотрим структуру микропроцессора Alpha 21164
Процессор включает пять функциональных устройств:
устройство управления потоком команд (IBOX),
целочисленное устройство (EBOX), устройство
плавающей точки (FBOX), устройство управления
памятью (MBOX) и устройство управления кэш
памятью и интерфейсом шины (CBOX). Длина
конвейеров этого процессора варьируется от 7
ступеней для выполнения. целочисленных команд и 9
ступеней для реализации команд с плавающей
точкой до 12 ступеней при выполнении команд
обращения к памяти на кристалле и переменного
числа ступеней при выполнении команд обращения к
памяти за пределами кристалла.
Устройство управления потоком команд
осуществляет выборку и декодирование инструкций,
поступающих из кэш -команд. Затем оно проводит
арбитраж всех конфликтов по регистрам и
функциональным устройствам и направляет команду
для выполнения в соответствующие исполнительные
устройства .
Устройство управления реализует также выполнение программы и обработку исключительных
ситуаций и прерываний. Кроме того , оно обеспечивает управление всеми исполнительными
устройствами , контролируя все цепи обхода данных и записи в регистры . Оно содержит 8 Кбайт
кэш - команд, схемы предварительной выборки команд и связанный с ними буфер перезагрузки ,
схемы прогнозирования направления условных переходов и буфер преобразования адресов команд.
Целочисленное исполнительное устройство выполняет целочисленные команды , вычисляет
виртуальные адреса для всех команд загрузки и записи , выполняет целочисленные команды
условного перехода и все другие команды управления . Оно включает в себя регистровый файл
и несколько функциональных устройств, расположенных на четырех ступенях двух параллельных
конвейеров. Первый конвейер содержит сумматор, устройство логических операций, сдвига и
умножения . Второй конвейер содержит сумматор, устройство логических операций и устройство
выполнения команд управления.
Устройство плавающей точки состоит из двух конвейерных исполнительных устройств:
конвейера сложения, который выполняет все команды плавающей точки, за исключением команд
умножения. Конвейер умножения , который выполняет команды умножения с плавающей точкой .
Два специальных конвейера загрузки и один конвейер записи данных позволяют командам
загрузки / записи выполняться параллельно с выполнением операций с плавающей точкой.
Устройство управления памятью выполняет все команды загрузки, записи и операции
синхронизации. Оно содержит полностью ассоциативный 64- строчный буфер преобразования
адресов (DTB), 8 Кбайт кэш - память данных с прямым отображением, файл адресов промахов и
буфер записи . Длина строки в кэш - данных равна 32 байтам .
Команды загрузки обращаются к кэш - данных и возвращают результат в регистровый
файл в случае попадания. При этом задержка составляет два такта. В случае промаха
физические адреса направляются в файл адресов промахов, где они буферизуются и
ожидают завершения обращения к кэш -памяти второго уровня . Команды записи
записывают данные в кэш - данных в случае попадания и всегда помещают данные в
буфер записи , где они ожидают обращения к кэш - памяти второго уровня.
Развитие RISC- архитектуры идет по пути создания многоядерных процессоров
Например процессор POWER4. Кроме двух процессорных ядер в микросхеме Power4
содержатся интегрированные аппаратные средства.
Это порты каналов, напрямую связывающих Power4
с другими процессорами внутри так называемого
"многомикросхемного" модуля (MCM — multi-chip
module), порты каналов связи между различными
модулями МСМ; канал ввода/ вывода (шина GX),
интегрированный контроллер шины оперативной
памяти и кэш третьего уровня.
Процессор содержит два одинаковы ядра. Каждое
из этих ядер имеет свой кэш первого уровня ,
свои исполнительные устройства (EU — executive
unit), конвейеры и т.п. Однако кэш второго уровня
у этих ядер общий . Для доступа к этому кэш со
стороны процессорных ядер применяется
коммутатор CIU (Core Interface Unit).
Каждое ядро имеет по три порта для обращения к CIU (для выборки команд — IF,
загрузки регистров — LD и сохранения данных — ST).
Кэш второго уровня организован в виде трех независимых блоков , каждый со своим
контроллером и портами CIU. Контроллеры кэш второго уровня работают одновременно,
обрабатывая по 32 байта за такт процессора . Эти данные передаются в I-кэш или D- кэш
первого уровня ( кэш - команд или кэш - данных). При сохранении данных процессорами
последние используют порты CIU шириной 8 байт.
Логической частью кэш второго уровня являются также два, так называемых,
некэширующих устройства (NCU — non-caching unit), каждое приписанное к своему
процессору. NCU-устройства отвечают , прежде всего, за выполнение некэшируемых
операций в иерархии памяти. Распределение обработки запросов в кэш второго уровня
между тремя блоками способствует увеличению производительности . Через специальное
устройство — "контроллер фабрики " (FC — Fabric Controller) — данные могут направляться в
кэш, и осуществляется весь ввод / вывод. Кэш третьего уровня реализован как
отдельная микросхема, являясь внешним по отношению к процессорам.

Процессор UltraSPARC III Cu — это 64- разрядная машина с 64- разрядными регистра и
64- разрядным трактом данных, но она может работать с 32- разрядными операндами, а
программное обеспечение, написанное для 32- разрядных версий SPARC изменять не
нужно. Хотя во внутренней архитектуре машины используют 64 разряда, ширина шины
памяти составляет 128 бит .
Кэш команд процессора емкостью 32 Кбайт оперирует 32-байтными строками. Так как большинство
команд UltraSPARC занимают 4 байта, в кэше можно одновременно разместить около 8000
команд. Блок вызова команд подготавливает для выполнения до четырех команд за цикл. В случае
неудачного обращения в кэш - память первого уровня количество вызываемых команд
уменьшается При обнаружении условного перехода происходит обращение к таблице переходов
емкостью 16000 записей. На основе ее содержания принимается решение о вызове следующей
команды или команд расположенной по целевому адресу .
Подготовленные команды поступают в
16- командный буфер команд. Из буфера
команды попадают в блок исполнения
целочисленных операций, блок исполнения
операций с плавающей точкой и блок
загрузки / сохранения. Блок исполнения
целочисленных операций состоит из двух
АЛУ и короткого конвейера для обработки
команд перехода .
Кроме того, здесь есть регистры команд и

временные регистры. Блок исполнения


операций с плавающей точкой состоит из
32 регистров и трех независимых АЛУ,
предназначенных для сложения/ вычитания ,
умножения и деления.
Блок загрузки / сохранения отвечает за обработку разнообразных команд загрузки и сохранения.
Содержащиеся в нем тракты данных обеспечивают соединение с тремя кэшами. Кэш данных
представляет собой традиционную предназначенную для обработки данных 4-входовую кэш - память
первого уровня емкостью 64 Кбайт с длиной строки 32 байт .
Кэш предвыборки емкостью 2 Кбайт нужен по той причине , что на уровне архитектуры команд
UltraSPARC предусмотрены команды упреждающей выборки, которые позволяют компилятору
вызывать слова еще до того, как в них возникнет необходимость. Если компилятор полагает, что
через некоторое время ему потребуется то или иное слово, он запускает команду предвыборки . В
этом случае соответствующая строка с упреждением загружается в кэш, и через несколько команд
обращение к этой строке происходит существенно быстрее если бы она не была загружена.
Кэш записи имеет емкость 2 Кбайта объединяет результаты записи и оптимизирует потребления
ресурсов 256-разрядной шины, ведущей к кэшу второго уровня. Назначение кэша записи состоит в
повышении производительности.
В процессоре также предусмотрена логика управления доступом к памяти. Она состоит из трех
компонентов : системного интерфейса, контроллера кэша второго уровня и контроллера памяти.
Системный интерфейс обеспечивает взаимодействие с памятью по 128-разрядной шине. Через этот
интерфейс проходят все внешние запросы, за исключением запросов к кэшу второго уровня.
Этот интерфейс позволяет подключать к одному модулю памяти сразу несколько процессоров
UltraSPARC, за счет чего формируется мультипроцессор . Контроллер кэша второго уровня. сопряжен
с объединенным кэшем второго уровня, который расположен вне микросхемы процессора .
Объем L2 может составлять 1, 4 или 8 Мбайт. Длина строки зависит от объема кэша ( от
64 байт в кэше объемом 1 Мбайт до 512 байт в кэше объемом 8 Мбайт).
Контроллер памяти преобразует 64- разрядные виртуальные адреса в 43- разрядные физические
адреса . UltraSPARC поддерживает виртуальную память с размерами страницы 8, 64 и 512 Кбайт, а
также 4 Мбайт. Для ускорения процесса преобразования предусмотрены специальные таблицы,
называемые буферами быстрого преобразования (Translation Lookaside Buffers, TLB). Они сравнивают
текущий виртуальный адрес с адресами, по которым производились обращения в недавнем
прошлом. Три такие таблицы обеспечивают гибкое управление размерами страниц данных, а еще
две обрабатывают команды преобразования.

Упрощенная схема конвейера UltraSPARC III Cu


Первая ступень конвейера A (Address generation — формирование адреса ). Здесь определяется
адрес каждой последующей команды , которую предполагается выбрать . Как правило, он совпадает с
адресом следующей команды, однако в некоторых случаях последовательная организация нарушается.
Например, если предыдущая команда является командой спрогнозированного перехода, перехвата
исключения или прерывания, которое необходимо обработать. Так как прогнозирование ветвления за
один цикл невозможно, команда, то непосредственно следующая за условным переходом, выполняется
в любом случае, вне зависимости от целевого объекта перехода.
Исходя из определенного ранее адреса на ступени Р (Preliminary fetch —. предварительная
выборка ) вызываются команды из кэша команд первого уровня ( до четырех за цикл). Для выявления
условных переходов и проверки правильности прогноза производятся обращения к таблице
переходов.
На ступени F (Fetch — выборка ) завершается выборка .команд и их передача в кэш команд.
На ступени В (Branch target — обнаружение объекта перехода ) происходит декодирование
выбранных команд. Если среди них обнаруживаются спрогнозированные переходы, они передаются
обратно на ступень A для непосредственной выборки соответствующих команд.
На ступени I (Instruction group formation — группировка команд) входящие команды сортируются по
группам, в зависимости от того, к каким из шести функциональных блоков они обращаются: к АЛУ1
для выполнения целочисленных операций, или к АЛУ2 для выполнения целочисленных операций; к АЛУ1
для выполнения операций с плавающей точкой и графических операций или к АЛУ2 для выполнения
операций с плавающей точкой и графических операций; к конвейеру переходов; к операциям загрузки
и хранения, а также к специальным операциям.
Существенные различия есть как между АЛУ для выполнения целочисленных операций, так и между
АЛУ для выполнения операций с плавающей точкой и графических операций. В обоих случаях различаются
наборы команд, которые способны выполнять те или иные АЛУ. Сортировка команд по блокам проводится
на ступени I.
На ступени J(Instruction stage grouping — извлечение команды из очереди ) команды подготавливаются к
отправке в блок выполнения во время следующего цикла . В течение одного цикла на ступень R можно
передать до четырех команд. Выбор команд ограничен доступностью функциональных блоков. Например,
одновременно можно вызвать две команды выполнения целочисленной операции, одну команду выполнения
операции с плавающей точкой и одну команду загрузки или сохранения. Однако запустить за один цикл
три команды выполнения целочисленных операций невозможно.
На ступени R (Register — регистр) производится поиск регистров, необходимых для обработки команд
выполнения целочисленных операций. Запросы на предоставление регистров с плавающей точкой
перенаправляются в соответствующий регистровый файл. Здесь же проводятся проверки на предмет
взаимозависимостей. Если необходимый регистр оказывается недоступным из-за его занятости предыдущей
командой, то текущая команда приостанавливается , а все последующие команды — блокируются.
Ступень Е (Execution — выполнение) предназначена для непосредственного выполнения целочисленных
команд. Для выполнения большинства арифметических и логических операций, а также операций сдвига ,
обработкой которых занимаются целочисленные АЛУ, достаточно одного цикла . Сразу по завершении
выполнения команды соответствующим образом обновляется регистровый файл рабочего регистра. Некоторые
сложные целочисленные команды передаются в специальный блок. Что касается команд загрузки и
сохранения, то на данной ступени их выполнение только начинается , но не заканчивается. Операнды для
выполнения команды с плавающей точкой извлекаются из соответствующего регистрового файла. На ступени
Е, помимо обработки команд условного перехода , определяется их направление ( переход/ без перехода ). В
случае неверного прогноза сигнал отправляется обратно на ступень А , и конвейер освобождается.
На ступени С (Cache — кэш ) завершается доступ к кэш - памяти первого уровня Здесь же
определяются результаты команд, предусматривающих чтение данных из памяти (например, команд
загрузки ).
На ступени М (Miss — промах) производится обработка слов , запрошенных , но не найденных в
кэш - памяти первого уровня. Сначала выполняется поиск в кэше второго уровня, а в случае кэш -
промаха осуществляется обращение к памяти, занимающее несколько циклов. Здесь же выполняются
операции знакового расширения и выравнивания для байтов , четвертинок слов и половинок слов ,
найденных в кэше первого уровня. Для операций загрузки с плавающей точкой, у которых в кэше
предвыборки имеет место кэш - попадание , на этом этапе удаетеся получить результаты . По
соображениям синхронизации кэш предвыборки при обработке целочисленных данных не
задействуется.
На ступени W (Write — запись ) результаты извлекаются из специального блока и записываются в
регистровый файл рабо -чего регистра .
На ступени X (eXtend — продленное выполнение) завершается большинство графических команд и
команд с плавающей точкой. Перед формальной пересортировкой результатов, происходящей на
ступени D, результаты этих команд предоставляются последующим командам путем перенаправления
для загрузки.
На ступени T (Trap — перехват ) перехватываются исключения, связанные с целочисленными
командами и командами с плавающей точкой. Именно эта ступень отвечает за перехват исключений
и обработку прерываний. Иными словами, после возникновения исключения или прерывания
состояние машины должно отвечать определенным требованиям ; в частности, все ранее запущенные
команды должны быть завершены, а запуск последующих отменен.
На ступени D состояние целочисленных регистров и регистров с плавающей точкой фиксируется
в соответствующих регистровых файлах. При возникновении исключения или прерывания видимыми
становятся именно эти значения, а не содержимое рабочих регистров. Кроме того , на ступени D
результаты всех завершенных команд сохранения записываются в кэш записи (вместо кэша данных
первого уровня). В конечном итоге строки этого кэша переписываются в кэш второго уровня, без
записи в кэш первого уровня. Эта схема упрощает задачу сборки мультипроцессоров UltraSPARC.

Процессоры архитектуры сверхдлинного командного слова (VLIW)


Дальнейшее совершенствование CISC процессоров приводит к затратам , которые неадекватны
получаемому приросту производительности . Причина этого заключается в недостатках самой
архитектуры этих процессоров, называемой в литературе архитектурой IA-32.
Эта архитектура, ориентированная на двухадресные команды, а современные
высокопроизводительные системы, при выполнении команд загрузка / сохранение , обращаются к
оперативной памяти только в тех случаях, когда нужно поместить операнды в регистры, а все
вычисления выполняются с использованием трехадресных регистровых команд. Однако скорость
работы процессора растет гораздо быстрее, чем скорость работы памяти, и последняя становится
узким местом в повышении производительности системы.
Другим недостатком является то , что команды имеют разную длину, и их трудно декодировать
быстро, в отличие от RISC- команд одинаковой длины и имеющих код операции фиксированной
длины . Команды IA-32 можно разбить на микрооперации типа RISC во время выполнения
программы , что и делается, но это значительно усложняет разработку самого процессора.
Третий недостаток архитектуры IA-32 заключается в небольшом наборе регистров. Из- за столь
малого числа регистров общего назначения постоянно нужно записывать в память промежуточные
результаты. Кроме того, при недостатке регистров требуется переименование регистров в скрытые
регистры. Чтобы избежать частых промахов кэш - памяти, команды приходится выполнять не по
порядку, но выполненные таким образом команды должны записывать результаты в выходные
регистры в строгом порядке. Для всего этого требуется очень сложное аппаратное обеспечение.
Чтобы скорость работы была высокой, нужна сильно конвейеризированная система (12 ступеней ),
но слишком длинный конвейер из - за нерегулярности потока команд, поступающих на него, тоже
не повышает производительность системы. Поэтому необходимы дополнительные меры для
уменьшения его простоев. Кроме того, становится существенным точное предсказание переходов, так
как в конвейер должны попадать только нужные команды. Но даже при низком проценте
неправильных предсказаний производительность системы существенно снижается. Чтобы избежать
проблем с неправильным прогнозированием переходов, процессору приходится осуществлять
спекулятивное выполнение команд со всеми вытекающими отсюда последствиями. Это является пятым
недостатком.
Основными направлениями роста производительности CISC-процессоров были два пути:
увеличение тактовой частоты процессора и повышение количества команд, выполняемых за один
цикл работы процессора.
По первому пути всегда шла Intel. В настоящее время гонка за повышение тактовых частот
процессоров практически подошла к концу.
По второму пути всегда шли в AMD, разрабатывая более совершенные CPU, содержащих
большее число функциональных исполнительных устройств.
Сейчас дальнейший рост производительности осуществляется в первую очередь за счет перехода
к многоядерным процессорам.

Основное направление, в котором пошли разработчики, это повышение параллелизма на уровне


команд, что и стало причиной разработки и производства новых чипов , использующих принципы
сверхдлинного командного слова — VLIW (Very Long Instruction Word). Следует заметить , что
быстродействие VLIW-процессора в большей степени зависит от компилятора, нежели от аппаратуры,
так как здесь эффект от оптимизации последовательности операций превышает результат,
возникающий от повышения частоты.
Работа VLIW-процессора основывается на выявлении параллелизма команд во время
трансляции (компиляции). Компилятор анализирует всю программу в поисках параллельных операций,
определяет те из них, которые могут выполняться параллельно, и " упаковывает" их в " длинные "
команды. После выборки большой команды из памяти, входящие в нее обычные команды
выполняются параллельно.
Схема создания последовательности таких длинных команд показана дальше. Слева на рисунке
изображен порядок следования команд в программе, а справа, представлены скомпонованные
компилятором " длинные " команды , выполняемые параллельно.
Сборка длинных команд компилятором
Реализация VLIW-процессора проста. Он состоит из нескольких функциональных модулей
(сложения, умножения, ветвления и т .д .), подключенных к шине процессора , и нескольких регистров
и блоков кэш - памяти. Процессор VLIW, имеющий схему, приведенную далее может выполнять
восемь операций за один такт и работать при меньшей тактовой частоте намного более
эффективнее, чем существующие суперскалярные процессоры.
Команда процессора содержит восемь операционных полей, каждое из которых выполняет
традиционную трех-операндную RISC-подобную инструкцию.
Новая архитектура получила название IA-64. Архитектура IA-64 — это архитектура типа загрузка /
сохранение с 64- битными адресами и 64- битными регистрами имеющая 128 регистров общего
назначения. Каждый из них содержит дополнительный разряд NaT (Not a Thing), который указывает,
является ли значение в регистре достоверным. Установку этого разряда могут производить команды
исполнения по предположению. Конвейер вычислительного ядра включает 10 ступеней, обрабатывает
команды в порядке их расположения в программе и функционально разделен на 4 блока:
• Блок выборки команд обеспечивает выборку и предвыборку до
6 команд за такт, устанавливает иерархию ветвлений, связывает
буфера и содержит три ступени;
• Блок доставки команд обеспечивает диспетчеризацию до 6 команд
на 9 портах, переименование регистров, управление регистровым
стеком, содержит две ступени;
• Блок доставки операндов обеспечивает связь блока регистров с
памятью и АЛУ. Наблюдение и управление состоянием
регистров, предсказание зависимостей , содержит две ступени;
• Блок исполнения управляет работой нескольких комплектов
однотактных АЛУ и устройств обращения к памяти. Один
комплект содержит целочисленное АЛУ, плавающее АЛУ, АЛУ
ММХ для целочисленных вычислений и SIMD АЛУ для
плавающей точки. Предполагается, что на первых этапах таких
комплектов может быть до четырех. Кроме того блок
исполнения обеспечивает упреждающую выборку данных,
обработку предикатов , выполнение ветвлений, содержит три
ступени.
Все команды имеют фиксированный формат:
• Поле группы операций определяет общий класс команды ( например, целочисленная операция
АЛУ), в поле типа операции указывается конкретная операция ( например, ADD или SUB).
• Далее следуют три поля регистра: два 7-битных поля для указания входных регистров, одно 7- битное
поле для указания выходного регистра и еще одно 6-битное поле для выбора регистра
предиката, используемого для обработки, сокращения и реализации условных переходов.
Большинство команд берут два регистровых операнда, выполняют над ними какую нибудь
операцию и помещают результат в выходной регистр. Для параллельного выполнения различных
операций существует много функциональных блоков, то есть процессор IA-64 похож на большинство
RISC- процессоров.
Новой в IA-64 является идея о пучке связанных команд. Команды поступают группами по три
штуки, каждая такая группа называется пучком. Каждый 128-битный пучок содержит три 41- битные
команды фиксированного формата и 5-битный шаблон.
Пучки могут быть связаны вместе (при этом используется бит конца пучка), поэтому в одном пучке
может присутствовать более трех команд. Формат пучка содержит информацию о том, какие команды могут
выполняться параллельно. В такой ситуации при наличии большого числа регистров компилятор может
выделять блоки команд и сообщать процессору, что эти команды можно выполнять параллельно.
Компилятор должен переупорядочивать команды, проверять, нет ли в них взаимозависимостей , проверять
доступность функциональных блоков и многое другое , то есть делать эти операции вместо аппаратного
обеспечения.
Работа по упорядочиванию и распределению команд RISC передается от аппаратного обеспечения
компилятору. Именно поэтому такая технология называется EPIC (Explicitly Parallel Instruction Computing) или
параллельной обработки команд с явным параллелизмом.
Упорядочивание команд компилятором выгодно по следующим причинам: поскольку всю работу
выполняет компилятор, аппаратное обеспечение можно сильно упростить; для любой программы
распределение должно производиться только один раз ( во время компиляции).
Посмотрим особенности IA-64.
Первой из них является реализация условных переходов. Так как в данной архитектуре формат
любой команды содержит указатель на регистр предиката, то выполнение каждой команды можно
сделать условным. Шестибитное поле указателя выбирает один из 64 1-битных предикатных регистров, а
поэтому оператор "if" может быть скомпилирован в код , который устанавливает один из предикатных
регистров в 1, если условие истинно, или в 0, если условие ложно. Одновременно с этим данное поле
автоматически устанавливает другой предикатный регистр на обратное значение . При использовании
предикации машинные команды , которые формируют операторы "then" и "else" собираются в единый поток
команд, первый из них — с использованием предиката, а второй — с использованием его обратного
значения .
Предикация происходит следующим образом: каждая команда выполняется, и в самом конце
конвейера, когда нужно сохранять результат в выходной регистр, производится проверка , истинно
ли предсказание. Если да, то результаты просто записываются в выходной регистр. Если же
предсказание ложно , то записи в выходной регистр не происходит.
Следующая особенность IA-64 — это наличие спекулятивной загрузки. Если команда LOAD
спекулятивна и оказывается ложной, то она просто останавливается и сообщает, что регистр, с
которым она связана, недействителен . Если этот регистр будет использоваться позднее, то
генерируется исключительное состояние (exception). Компилятор должен перемещать команды LOAD
в более ранние позиции по отношению к другим командам для того ,чтобы они выполнялись
еще до того, как они будут нужны. Так как выполнение этих команд начинается раньше, чем
нужно, они могут завершиться еще до того , как потребуются результаты. Компилятор вставляет
команду CHECK в том месте, где ему нужно получить значение определенного регистра . Если
значение там уже есть, команда CHECK работает как NOP ( нет операции), и выполнение
программы сразу продолжается дальше. Если же значения в регистре еще нет, то следующая
команда должна простаивать.
Следует отметить следующие резервы повышения скорости машины с архитектурой IA-64.
Это современная конвейеризированная трехадресная RISC- система типа загрузка / сохранение.
Во-вторых, компилятор определяет , какие команды могут выполняться одновременно, не вступая
в конфликт, и группирует эти команды в пучки, то есть процессор может просто распределять
пучок без проведения каких-либо проверок . В третьих, предикация позволяет объединять команды
переходов, определяемые оператором "if", устраняя при этом условный переход и
прогнозирование этого перехода . Наконец, спекулятивная загрузка позволяет вызывать операнды
заранее.

Вам также может понравиться