Intel IA-64

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 13:34, 12 января 2019.
Intel Itanium Architecture
Дизайнер HP and Intel
Биты 64-bit
Представлен 2001
Дизайн EPIC
Тип Register-Register
Порядок байтов Selectable
Регистры
Общее назначение 128; 64 1-bit predicate registers
FPU (Floating Point Unit) 128
Архитектура Intel Itanium

IA-64 (Intel Architecture-64, также называемый Intel Itanium Аrchitecture) — 64-битная аппаратная платформа: микропроцессорная архитектура и соответствующая архитектура набора команд, разработанная совместно компаниями Intel и Hewlett Packard. Реализована в микропроцессорах Itanium и Itanium 2.

Основана на VLIW или, в терминах Intel, EPIC (сокр. от англ. Explicity Parallel Instruction Computing, вычисления с явной параллельностью инструкций).

Несовместима с архитектурой X86. Изначально предлагалась и в качестве платформы для домашних компьютеров, но после выпуска фирмой AMD 64-битной архитектуры AMD64, сохранившей совместимость с X86, актуальность использования платформы IA-64 где-либо, кроме серверов, пропала, несмотря на то, что в конце 2001 года для IA-64 была выпущена специальная версия Windows XP 64-bit for IA-64. Также на архитектуру IA-64 портирована операционная система OpenVMS, принадлежащая HP.

История

Разработка: 1989–2000

В 1989 году HP начал беспокоиться тем, что множество сокращенных вычислений (RISC) архитектуры приближаются к пределу обработки в одной инструкции за такт. И исследователи Intel и HP исследовали опции архитектуры ЭВМ для будущих проектов и отдельно начали исследовать новую концепцию, известную как очень длинное командное слово (VLIW), которые вышли из исследования Йельским университетом в начале 1980-х. VLIW - понятие архитектуры ЭВМ (как RISC и CISC), где единственное командное слово содержит многоадресные команды, закодированные в одном очень длинном командном слове, чтобы упростить процессор к выполнению многоадресных команд в каждом такте. Типичные реализации VLIW полагаются в большой степени на сложные компиляторы, чтобы определить во время компиляции, какие инструкции могут быть выполнены одновременно и надлежащее планирование этих инструкций для выполнения, а также помочь предсказать направление отраслевых операций. Значение этого подхода состоит в том, чтобы сделать больше полезной работы в меньшем количестве тактовых циклов и упростить планирование команд процессора и аппаратные требования предсказания ветвлений, теоретически снижая сложность и стоимость процессора и снижения потребления энергии.

За это время HP начал верить, что это уже не рентабельно для индивидуальных корпоративных систем компаний, таких как он сам развивать запатентованные микропроцессоры и Intel также исследовал несколько архитектурных вариантов выхода за пределы X86 ISA, чтобы адресовать высококачественный сервер предприятия и требования высокоэффективных вычислений (HPC). Таким образом, Intel и HP сотрудничали в 1994, чтобы разработать ISA IA-64, используя изменение концепций проекта VLIW, которые Intel назвал вычислениями с заданным параллелизмом команд (EPIC). Целью компании Intel было использовать опыт уже разработанные в их начале VLIW работы вместе со своими собственными HP разработать линию объем продукции, ориентированных на высокопроизводительных серверов корпоративного класса и систем высокоэффективных вычислений (HPC), которые могли быть проданы всем производителям укомплектованного оборудования (OEMs), в то время как компания HP хотела иметь возможность купить стандартные процессоры, построенные с использованием тома Intel и передовые технологии процесса, которые имели более высокую производительность и более экономически эффективными, чем их текущие процессоры PA-RISC. Поскольку получающимися продуктами был бы InInteltel (HP будет одним из многих клиентов), и чтобы достигнуть объемов, необходимых для успешной производственной линии, продукты Itanium потребовались бы, чтобы удовлетворять потребности более широкой клиентской базы и что программные приложения, ОС и средства разработки будут доступны для этих клиентов. Это требует, чтобы продукты на базе Itanium быть разработаны, документированы и изготовлены, и имеют качество и поддержку в соответствии с остальной частью продукции Intel. Таким образом, Intel взяла на себя инициативу по дизайну микроархитектуры, продуктизации (упаковки, тестирования и всех других шагов), индустрии программного обеспечения и операционной системы (Linux, позволяющий и Windows NT) и маркетинга. В рамках процесса определения и маркетинга компании Intel они занимаются широкий спектр корпоративных OEM-партнеров, программного обеспечения и поставщиков ОС, а также конечных потребителей, чтобы понять их требования и гарантировать, что они нашли свое отражение в семействе продуктов таким образом, чтобы удовлетворить потребности широкого круга клиентов и конечных пользователей. HP сделал существенный вклад в определение ISA, микроархитектуру Merced/Itanium и Itanium 2, но ответственностью за продуктизацию был Intel. Исходной целью для поставки первого продукта семьи Itanium (под кодовым названием Мерседа) был 1998. Маркетинг товаров Intel и отраслевые усилия по обязательству были существенными и достигнутыми победами проекта с большинством корпоративных серверов OEM-партнеров, включая те, которые основаны на процессорах RISC, в то время отраслевые аналитики предсказывали, что IA-64 будет доминировать на серверах, рабочих станциях и высокопроизводительных настольных компьютерах, и в конечном счете вытеснит RISC и архитектуру сложных вычислений системы команд (CISC) для всех приложений общего назначения. Compaq и Silicon Graphics решили отказаться от дальнейшего развития архитектуры Alpha и MIPS соответственно в пользу перехода на IA-64.

К 1997 году стало очевидно, что архитектуру IA-64 и компилятор было намного более трудно реализовать, чем первоначально предполагалось, и поставка процессоров Itanium начала уменьшаться. Так как Itanium был самым первым процессором EPIC, усилия по разработке столкнулись с более неожиданными проблемами, чем команда привыкла.

Несколько групп разрабатывали операционные системы для архитектуры, включая Microsoft Windows, Linux и варианты UNIX, такие как HP-UX, Solaris, Tru64 UNIX и Monterey/64 (последние три были отменены прежде, чем достигнуть рынка). В 1999 году Intel привело формирование промышленного консорциума с открытым исходным кодом для порта Linux для IA-64, которую они назвали "Триллиум" (а позднее переименованный "Trillian" из-за проблем товарного знака), который был во главе с Intel и включал Caldera Systems, CERN, Cygnus Solutions, Hewlett-Packard, IBM, Red Hat, SGI, SuSE, TurboLinux и VA Linux Systems. В результате, работающий IA-64 Linux был поставлен досрочно и был первой ОС для запуска на новых процессорах Itanium.

Intel объявил официальное название процессора, Itanium, 4 октября 1999 года. В течение нескольких часов, название Itanic был придуман на телеконференции Usenet, ссылаясь на Титаник, на "непотопляемый" океанский лайнер, который затонул в 1912 году.

Itanium (Merced): 2001

К тому времени, когда Itanium был выпущен в июне 2001, его производительность не превосходила конкурирующие процессоры RISC и CISC.

Признавая, что отсутствие программного обеспечения может быть серьезной проблемой для будущего, Intel сделал тысячи этих ранних систем, доступных для независимых поставщиков программного обеспечения (ISV), чтобы стимулировать развитие. HP и Intel принесли процессор следующего поколения Itanium 2 на рынок через год.

Itanium 2: 2002–2010

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

В 2003 году AMD выпустила Opteron, который реализовал свою собственную 64-разрядную архитектуру (x86-64). Opteron получил быстрое распространение в пространстве корпоративных серверов, поскольку он обеспечивает легкое обновление с X86. Intel отреагировала путем внедрения x86-64 в его Xeon микропроцессоров в 2004 году.

В ноябре 2005 года крупнейшие производители серверов на базе Itanium присоединились к Intel и многим поставщикам программного обеспечения, чтобы сформировать альянс Itanium Solutions, чтобы продвинуть архитектуру и ускорить портирование программного обеспечения.

В 2006 Intel поставил Montecito (проданный как ряд Itanium 2 9000), двухъядерный процессор, который примерно удвоил производительность и уменьшил потребление энергии приблизительно на 20 процентов.

Itanium 9300 (Tukwila): 2010

Процессор серии Itanium 9300, под кодовым названием Tukwila, был выпущен 8 февраля 2010 года с большей производительностью и объемом памяти. Tukwila первоначально был намечен для выпуска в 2007 году.

Устройство использует процесс на 65 нм, включает в себя от двух до четырех ядер, до 24 Мбайт на кристалле кэш-памяти, технологию гиперпоточности и интегрированные контроллеры памяти. Он реализует коррекцию двойного устройства данных (DDDC), которая помогает исправить ошибки памяти. Tukwila также реализует Intel QuickPath Interconnect (QPI), чтобы заменить Itanium, основанную на шине архитектуру. У него есть пиковая межпроцессорная пропускная способность 96 Гбайт/с и пиковая пропускная способность памяти 34 Гбайт/с. С QuickPath процессор интегрировал контроллеры памяти и интерфейсы памяти напрямую, используя интерфейсы QPI, чтобы непосредственно соединиться с другими процессорами и концентраторами ввода-вывода. QuickPath также используется на процессорах Intel с использованием микроархитектуры Nehalem, что делает его вероятным, что Tukwila и Nehalem будут иметь возможность использовать одни и те же наборы микросхем. Tukwila включает в себя четыре контроллера памяти, каждый из которых поддерживает несколько модулей DIMM DDR3 через отдельный контроллер памяти, так же, как Nehalem на базе Xeon процессор под кодовым названием Beckton.

Itanium 9500 (Poulson): 2012

Серийный процессор Itanium 9500, под кодовым названием Poulson, является продолжением процессора Tukwila имеет восемь ядер, имеет 12-широкий выпуск архитектуры, улучшения многопоточности и новые инструкции, чтобы использовать в своих интересах параллелизм, особенно в области виртуализации. Размер Poulson L3 кэша составляет 32 Мбайта. L2 размер кэша составляет 6 Мб, 512 I Кбайт, 256 D КБ на каждое ядро. Размер кристалла составляет 544 мм ², меньше, чем его предшественник Tukwila (698.75 мм ²).

Архитектура

Intel экстенсивно задокументировал набор команд и микроархитектуру процессоров Itanium и техническое нажатие обеспечило обзоры. Архитектура была переименована несколько раз в течение своей истории. HP первоначально назвал его PA-WideWord. Intel позже назвал его IA-64, а затем Itanium Processor Architecture (IPA), прежде чем остановиться на архитектуре Intel Itanium, но до сих пор широко упоминается как IA-64.

Это 64-битный регистр богатой явно параллельной архитектурой. Слово базовых данных составляет 64 бита, с байтовой адресацией. Логическое адресное пространство составляет 264 байт. Архитектура реализует предикацию, спекуляции и предсказание перехода. Он использует аппаратный механизм переименования регистра, а не простую работу с окнами регистра для передачи параметров. Тот же самый механизм также используется для обеспечения параллельного выполнения циклов. Спекуляция, прогнозирование, предикация и переименование находятся под контролем компилятора: каждое командное слово включает в себя дополнительные биты для этого. Такой подход является отличительной чертой архитектуры.

Архитектура реализует 128 целочисленных регистров, 128 регистров с плавающей точкой, 64 одноразрядных предиката и восемь регистров разветвления. Регистры с плавающей точкой 82 бита длиной, чтобы сохранить точность для промежуточных результатов.

Выполнение команды

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

Группы модулей выполнения включают:

  • Шесть ALUs общего назначения, два целочисленных модуля, один модуль сдвига
  • Четыре блока кэш-памяти данных
  • Шесть мультимедийных модулей, два параллельных модуля сдвига, одна параллель умножается, подсчет одной популяции
  • Два 82-разрядных с плавающей точкой умножаются – накапливают модули, два с плавающей точкой SIMD умножаются – накапливают модули (две 32-разрядных операции каждый)
  • Три модуля ответвления

Компилятор может часто группировать инструкции в наборы шесть, который может выполниться одновременно. Так как модули с плавающей точкой реализуют умножение – накапливают работу, единственная инструкция с плавающей точкой может выполнить работу двух инструкций, когда приложение требует умножения сопровождаемого добавлением: это очень распространено в научной обработке. Когда это происходит, процессор может выполнить четыре FLOPs за цикл. Например, у Itanium на 800 МГц была теоретическая оценка 3.2 GFLOPS, и самый быстрый Itanium 2, на уровне 1.67 ГГц, был оценен на уровне 6.67 GFLOPS.

Архитектура памяти

С 2002 по 2006 год, процессоры Itanium 2 совместно использовал общую иерархию кэша. У них было 16 КБ кэш команд 1-го уровня и 16 Кбайт кэш-памяти данных 1-го уровня. Кэш L2 был объединен (и инструкция и данные) и составляет 256 Кбайт. Кэш-память 3-го уровня также была единой и разнообразной в размере от 1,5 МБ до 24 МБ. 256 кэш КБ L2 содержит достаточную логику, чтобы обработать семафорные операции, не нарушая основное арифметико-логическое устройство (ALU).

К оперативной памяти получают доступ через шину к чипсету вне кристалла. Шину Itanium 2 первоначально вызвали шиной McKinley, но теперь обычно упоминается как шина Itanium. Скорость шины постоянно увеличивалась с новыми выпусками процессора. Передачи шины 2×128 биты за такт, таким образом, 200 МГц шина McKinley передала 6.4 Гбайт/с, и шина Montecito на 533 МГц, передают 17.056 Гбайт/с.

Архитектурные изменения

У процессоров Itanium, выпущенных до 2006, была аппаратная поддержка для архитектуры IA-32, чтобы разрешить поддержку устаревших серверных приложений, но производительность для кода IA-32 была намного хуже, чем для собственного кода и также хуже, чем производительность одновременных X86 процессоров. В 2005 году Intel разработала IA-32 Execution Layer (IA-32 EL), программный эмулятор, который обеспечивает более высокую производительность. С Montecito, Intel поэтому устранил аппаратную поддержку для кода IA-32.

В 2006 году с выпуском Montecito, Intel сделала ряд усовершенствований базовой архитектуры процессора, включая:

  • Аппаратная многопоточность: Каждое ядро процессора поддерживает контекст для двух потоков выполнения. Когда потеря скорости потока во время доступа к памяти, другой поток может выполниться. Intel вызывает эту "крупную многопоточность", чтобы отличить его от "технологии гиперпоточности" Intel, интегрированный в некоторый X86 и x86-64 микропроцессоры.
  • Аппаратная поддержка для виртуализации: Intel добавил Технологию Виртуализации Intel (Intel VT-i), который обеспечивает, аппаратные средства помогают для базовых функций виртуализации. Виртуализация позволяет программному обеспечению "гипервизор", чтобы выполнить многократные экземпляры операционной системы на процессоре одновременно.
  • Улучшения кэша: Montecito добавил разделение кэш L2, который включал специальный кэш L2 на 1 Мбайт для инструкций. Исходный кэш L2 на 256 Кбайт был преобразован в специальный кэш данных. Montecito также включал до 12 Мбайт на на кристалле кэш-памяти L3[Источник 1].

Для компаний Intel и Hewlett-Packard не существует "проблемы 2000 года" — для них это год новых возможностей. В конце 1999 года Intel планирует представить Merced — первый процессор, построенный с использованием архитектуры нового поколения, совместно разработанной двумя компаниями. Хотя эта 64-разрядная архитектура основана на многолетних исследованиях Intel, HP, других компаний и университетов, она радикально отличается от всего, что было до сих пор представлено на рынке. Достигнет эта архитектура успеха или нет, одно очевидно уже сейчас: она изменит всю компьютерную индустрию.

Эта архитектура, известная под названием Intel Architecture-64 (IA-64), полностью "порывает с прошлым". IA-64 не является как 64-разрядным расширением 32-разрядной архитектуры X86 компании Intel, так и переработкой 64-разрядной архитектуры PA-RISC компании HP. IA-64 представляет собой нечто абсолютно новое — передовую архитектуру, использующую длинные слова команд (long instruction words — LIW), предикаты команд (instruction predication), устранение ветвлений (branch elimination), предварительную загрузку данных (speculative loading) и другие ухищрения для того, чтобы "извлечь больше параллелизма" из кода программ.

Несмотря на то, что Intel и HP обещали добиться обратной совместимости с существующим программным обеспечением, работающим на процессорах архитектур х86 и PA-RISC, они до сих пор не разглашают, каким образом это будет сделано. На самом деле обеспечить такую совместимость совсем не просто; достаточно вспомнить гораздо менее кардинальный переход с 16-разрядной на 32-разрядную архитектуру х86, продолжавшийся 12 лет и до сих пор не завершённый.

По поводу совместимости, стоит заметить, что но в Merced на самом деле существует два режима декодирования команд VLIW и старый CISC. Т.е. программы переключаются в необходимый режим исполнения. В архитектуре X86 были добавлен ряд команд для перехода в новый режим, а также для передачи данных. В IA-64 такие команды есть изначально. Так что теперь ОС будут содержать и 64-х разрядную часть на IA-64 и старую 32-х разрядную.

Правда, переход к архитектуре IA-64 в ближайшее время вряд ли затронет большинство пользователей, поскольку Intel заявила, что Merced разрабатывается для серверов и рабочих станций класса high-end, а не для компьютеров среднего уровня. Фактически, компания заявила, что IA-64 не заменит х86 в ближайшем будущем. Похоже на то, что Intel и другие поставщики продолжат разрабатывать чипы х86.

Перед тем, как углубиться в технические детали, попробуем понять, почему Intel и HP рискнули пойти на столь кардинальные перемены. Причина сводится к следующему: они считают, что как CISC, так и RISC-архитектуры исчерпали себя.

Небольшой экскурс в прошлое. Архитектура X86 компании IntelCISC архитектура, появившаяся в 1978 году. В те времена процессоры представляли собой скалярные устройства (то есть могли в каждый момент времени выполнять только одну команду), при этом конвейеров практически не было. Процессоры содержали десятки тысяч транзисторов. PA-RISC компании HP была разработана в 1986 году, когда технология суперскалярных (с возможностью выполнения нескольких команд одновременно) конвейеров только начала развиваться. Процессоры содержали сотни тысяч транзисторов. В конце 90-х наиболее совершенные процессоры содержат миллионы транзисторов. К моменту начала выпуска Merced компания Intel планирует перейти на 0.18-микронную технологию вместо нынешней 0.25-микронной. Уже первые чипы архитектуры IA-64 будут содержать десятки миллионов транзисторов. В дальнейших модификациях их число увеличится до сотен миллионов.

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

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

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

Говоря о том, что CISC- и RISC-архитектуры исчерпали себя, Intel и HP имеют в виду обе эти проблемы. В двух пространных интервью журналу BYTE они раскрыли некоторые детали архитектуры IA-64.

Команды в формате IA-64 упакованы по три в 128-битный пакет для быстрейшей обработки. Обычно это называют "LIW encoding". (Русский аналог подобрать сложно. Наиболее адекватно, на мой взгляд, перевести как "кодирование в длинные слова команд".) Однако компания Intel избегает такого названия, заявляя, что с ним связаны "негативные ассоциации" (negative connotation). По той же причине Intel не любит называть сами команды RISC-подобными (RISC-like), даже несмотря на то, что они имеют фиксированную длину и предположительно оптимизированы для исполнения за один такт в ядре, не нуждающемся в микрокоде. Intel предпочитает называть свою новую LIW-технологию Explicitly Parallel Instruction Computing или EPIC (Вычисления с Явной Параллельностью Инструкций, где "явной" означае явно указанной при трансляции). В любом случае формат команд IA-64 не имеет ничего общего с X86. Команды X86 могут иметь длину от 8 до 108 бит, и процессор должен последовательно декодировать каждую команду после определения её границ.

Каждый 128-битный пакет содержит шаблон (template) длиной в несколько бит, помещаемый в него компилятором, который указывает процессору, какие из команд могут выполняться параллельно. Теперь процессору не нужно будет анализировать поток команд в процессе выполнения для выявления "скрытого параллелизма". Вместо этого наличие параллелизма определяет компилятор и помещает информацию в код программы. Каждая команда (как для целочисленных вычислений, так и для вычислений с плавающей точкой) содержит три 7-битных поля регистра общего назначения (РОН). Из этого следует, что процессоры архитектуры IA-64 содержат 128 целочисленных РОН и 128 регистров для вычислений с плавающей точкой. Все они доступны программисту и являются регистрами с произвольным доступом (programmer-visible random-access registers). По сравнению с процессорами X86, у которых всего восемь целочисленных РОН и стек глубины 8 для вычислений с плавающей точкой, IA-64 намного "шире" и, соответственно, будет намного реже простаивать из-за "нехватки регистров".

Компиляторы для IA-64 будут использовать технологию "отмеченных команд" (predication) для устранения потерь производительности из-за неправильно предсказанных переходов и необходимости пропуска участков кода после ветвлений. Когда процессор встречает "отмеченное" ветвление в процессе выполнения программы, он начинает одновременно выполнять все ветви. После того, как будет определена "истинная" ветвь, процессор сохраняет необходимые результаты и сбрасывает остальные. Компиляторы для IA-64 будут также просматривать исходный код с целью поиска команд, использующих данные из памяти. Найдя такую команду, они будут добавлять пару команд - команду предварительной загрузки (speculative loading) и проверки загрузки (speculative check). Во время выполнения программы первая из команд загружает данные в память до того, как они понадобятся программе. Вторая команда проверяет, успешно ли произошла загрузка, перед тем, как разрешить программе использовать эти данные. Предварительная загрузка позволяет уменьшить потери производительности из-за задержек при доступе к памяти, а также повысить параллелизм.

Из всего вышесказанного следует, что компиляторы для процессоров архитектуры IA-64 должны быть намного "умнее" и лучше знать микроархитектуру процессора, код для которого они вырабатывают. Существующие чипы, в том числе и RISC-процессоры, производят гораздо больше оптимизации на этапе выполнения программ, даже при использовании оптимизирующих компиляторов. IA-64 перекладывает практически всю работу по оптимизации потока команд на компилятор. Таким образом, программы, скомпилированные для одного поколения процессоров архитектуры IA-64, на процессорах следующего поколения без перекомпиляции могут выполняться неэффективно. Это ставит перед поставщиками нелёгкую задачу по выпуску нескольких версий исполняемых файлов для достижения максимальной производительности.

Другим не очень приятным следствием будет увеличение размеров кода, так как команды IA-64 длиннее, чем 32-битные RISC-команды (порядка 40 бит). Компиляция при этом будет занимать больше времени, поскольку IA-64, как уже было сказано, требует от компилятора гораздо больше действий. Intel и HP заявили, что уже работают совместно с поставщиками средств разработки над переработкой этих программных продуктов.

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

Обычно компилятор транслирует оператор ветвления (например, IF-THEN-ELSE) в блоки машинного кода, расположенные последовательно в потоке. В зависимости от условий ветвления процессор выполняет один из этих блоков и перескакивает через остальные. Современные процессоры стараются предсказать результат вычисления условий ветвления и предварительно выполняют предсказанный блок. При этом в случае ошибки много тактов тратится впустую. Сами блоки зачастую весьма малы — две или три команды, — а ветвления встречаются в коде в среднем каждые шесть команд. Такая структура кода делает крайне сложным его параллельное выполнение.

Когда компилятор для IA-64 находит оператор ветвления в исходном коде, он исследует ветвление, определяя, стоит ли его "отмечать". Если такое решение принято, компилятор помечает все команды, относящиеся к одному пути ветвления, уникальным идентификатором, называемым предикатом (predicate). Например, путь, соответствующий значению условия ветвления TRUE, помечается предикатом Р1, а каждая команда пути, соответствующего значению условия ветвления FALSE — предикатом Р2. Система команд IA-64 определяет для каждой команды 6-битное поле для хранения этого предиката. Таким образом, одновременно могут быть использованы 64 различных предиката. После того, как команды "отмечены", компилятор определяет, какие из них могут выполняться параллельно. Это опять требует от компилятора знания архитектуры конкретного процессора, поскольку различные чипы архитектуры IA-64 могут иметь различное число и тип функциональных узлов. Кроме того, компилятор, естественно, должен учитывать зависимости в данных (две команды, одна из которых использует результат другой, не могут выполняться параллельно). Поскольку каждый путь ветвления заведомо не зависит от других, какое-то "количество параллелизма" почти всегда будет найдено.

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

После этого компилятор транслирует исходный код в машинный и упаковывает команды в 128-битные пакеты. Шаблон пакета (bundle's template field) указывает не только на то, какие команды в пакете могут выполняться независимо, но и какие команды из следующего пакета могут выполняться параллельно. Команды в пакетах не обязательно должны быть расположены в том же порядке, что и в машинном коде, и могут принадлежать к различным путям ветвления. Компилятор может также помещать в один пакет зависимые и независимые команды, поскольку возможность параллельного выполнения определяется шаблоном пакета. В отличие от некоторых ранее существовавших архитектур со сверхдлинными словами команд (VLIW), IA-64 не добавляет команд "нет операции" (NOPS) для дополнения пакетов.

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

Разумеется, в какой-то момент процессор наконец вычислит значение условия ветвления в нашем операторе IF-THEN-ELSE. Предположим, оно равно TRUE, следовательно, правильный путь отмечен предикатом Р1. 6-битному полю предиката соответствует набор из 64 предикатных регистров (predicate registers) Р0-Р63 длиной 1 бит. Процессор записывает 1 в регистр Р1 и 0 во все остальные.

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

Технология "отмеченных команд" существенно снижает негативное влияние ветвлений на машинном уровне. В то же время, если компилятор не "отметил" ветвление, IA-64 действует практически так же, как и современные процессоры: пытается предсказать путь ветвления и т.д. Испытания показали, что описанная технология позволяет устранить более половины ветвлений в типичной программе, и, следовательно, уменьшить более чем в два раза число возможных ошибок в предсказаниях.

Другой ключевой особенностью IA-64 является предварительная загрузка данных. Она позволяет не только загружать данные из памяти до того, как они понадобятся программе, но и генерировать исключение только в случае, если загрузка прошла неудачно. Цель предварительной загрузки — разделить собственно загрузку и использование данных, что позволяет избежать простоя процессора. Как и в технологии "отмеченных команд" здесь также сочетается оптимизация на этапе компиляции и на этапе выполнения.

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

На этапе выполнения процессор сначала обнаруживает команду предварительной загрузки и, соответственно, пытается загрузить данные из памяти. Иногда попытка оказывается неудачной - например, команда, требующая данные, находится после ветвления, условия которого ещё не вычислены. "Обычный" процессор тут же генерирует исключение. IA-64 откладывает генерацию исключения до того момента, когда встретит соответствующую команду проверки загрузки. Но к этому времени условия ветвления, вызывавшего исключение, уже будут вычислены. Если команда, инициировавшая предварительную загрузку, относится к неверному пути, загрузка признается неудачной и генерируется исключение. Если же путь верен, то исключение вообще не генерируется. Таким образом, предварительная загрузка в архитектуре IA-64 работает аналогично структуре типа TRY-CATCH.

Возможность располагать команду предварительной загрузки до ветвления очень существенна, так как позволяет загружать данные задолго до момента использования (напомню, что в среднем каждая шестая команда является командой ветвления).

В 80-е годы некоторые разработчики RISC-процессоров высмеивали CISC-архитектуру и предрекали скорую погибель семейству X86. Но технологии и бизнес — разные вещи. Несмотря на технологические преимущества RISC-архитектуры, огромные ресурсы корпорации Intel и господство операционных систем DОS и Windows привели к тому, что процессоры архитектуры X86 остаются конкурентоспособными до сих пор. Теперь уже Intel заявляет, что RISC- архитектура устарела. Не совершает ли корпорация той же ошибки? В любом случае, до выхода в свет первого процессора архитектуры IA-64 остаётся ещё два года, и у конкурентов есть время принять ответные меры.[Источник 2]

Источники

  1. IA-64 // Википедия [2002–2018]. Дата изменения: 12.05.2018. URL: https://en.wikipedia.org/wiki/IA-64 (Дата обращения:11.06.2018).
  2. Архитектура IA64 // iXBT [1997–2018]. Дата изменения: 16.02.1998. URL: https://www.ixbt.com/cpu/ia64.html (Дата обращения: 11.06.2018).