Intel Core: некоторые особенности новой микроархитектуры
АрхивПлатформаВ этом материале описывается ряд новых технологий, реализованных в архитектуре Core, которые позволяют повысить производительность и энергоэффективность микропроцессоров.
Около полугода назад на осеннем Форуме Intel для разработчиков представители этой корпорации формально объявили о намерении оказаться от микроархитектуры NetBurst, используемой в процессорах семейства Pentium 4, в пользу новой, более эффективной микроархитектуры, на которую можно было бы перевести всю линейку продуктов Intel - от мобильных процессоров до серверных чипов. Напомним, микроархитектура NetBurst появилась в 2000 году в первых процессорах Pentium 4 и пришла на смену архитектуре P6, на базе которой были построены процессоры Pentium Pro, Pentium II и Pentium III.
На уже прошедших сессиях IDF 2006 представители Intel поделились некоторыми важными подробностями относительно новой архитектуры. Официальное название этой микроархитектуры - Core (буквально - "ядро"), а ранее она была известна как мобильная архитектура Merom. Другое название Core - NGMA; эта аббревиатура расшифровывается попросту как "микроархитектура нового поколения"). В этой статье рассматриваются лишь отдельные особенности новой микроархитектуры и мы ни в коем случае не претендуем на полноту. Другим значимым компонентам Core будут посвящены отдельные публикации. При подготовке этого материала использовались как материалы корпорации Intel, так и самые различные общедоступные источники.
1. Основные черты Core
В Intel делают особую ставку на микроархитектуру Core, поскольку в самое ближайшее время на неё перейдут не только PC-совместимые настольные ПК и ноутбуки, но и компьютеры Apple, и даже мощные серверы, рассчитанные на операционную систему следующего поколения Windows Vista. Неслучайно при разработке этой универсальной архитектуры ставились задачи максимального увеличения производительности при максимальном снижении энергопотребления - эти требования сегодня предъявляются не только к ноутбукам, но и к настольным машинам, и к серверам.
По формальным признакам Core ближе всего к архитектуре мобильных Pentium M (Banias), однако при этом целый ряд технологий позаимствован и из Pentium 4. В каком-то смысле, перефразируя Ленина, Core можно охарактеризовать как "шаг назад, два шага вперёд": за основу новой архитектуры, как, впрочем, и архитектуры Pentium M, была взята микроархитектура P6, которая за шесть лет забытья не только не потеряла своей актуальности, но и доказала свою перспективность. Разумеется, Core - далеко не механическая копия P6; скорее - это эволюционное развитие отвергнутой некогда архитектуры.
Как известно, разработкой Core (как и Pentium M) занималось израильское отделение Intel, и уже с самого начала работы перед инженерами была поставлена цель: ориентироваться на многоядерные микросхемы. При этом важно было добиться существенного снижения энергопотребления без ущерба для производительности. К счастью, проблемы с размещением многоядерных процессоров в пределах печатных плат привычных размеров не возникало: переход на более тонкие технологические процессы упрощает задачу размещения на одном кристалле нескольких ядер, поскольку, несмотря на рост числа транзисторов, сами эти транзисторы становятся всё меньше и меньше.
Кстати, выпуск многоядерных процессоров обеспечит дальнейшее процветание культа "закона Мура", говорящего о ежегодном удвоении числа транзисторов в микропроцессорах. Всё дело в масштабируемости, которой характеризуется архитектура Core. Если в Pentium 4 производительность можно было повышать, прежде всего, путём увеличения тактовой частоты, то в случае с Core гораздо проще добавить дополнительные ядра, а потом уже - проводить периодические повышения тактовые частот.
Сегодня всё больше микропроцессоров отходят от схемы внеочередного исполнения команд (OOOE) в пользу поочерёдного, появляется всё больше моделей с архитектурой VLIW (с очень длинными инструкциями, предусматривающих несколько параллельно выполняющихся операций), которым требуется многопоточность и оптимизированные компиляторы. Тем не менее, разработчики Core уделили особое внимание именно схеме OOOE, при которой обеспечивается стопроцентно аппаратная оптимизация выполняемого кода и потоков на уровне кристалла. Инженеры Intel взяли все прекрасно себя зарекомендовавшие элементы современных процессоров и объединили их, одновременно обеспечив расширенные вычислительные ресурсы.
Разумеется, существуют ограничения на число параллельно выполняемых инструкций, поэтому, чем больше вычислительные ресурсы, тем больше доступных для исполнения тактов могут остаться невостребованными из-за ограничений в параллелизме на уровне команд (ILP). Нерациональное использование больших ресурсов возможно и из-за латентности памяти, снижающей общую скорость работы системы.
В микроархитектуре Core предусмотрены целенаправленные решения именно этих двух проблем - ограничений в параллелизме инструкций и латентности памяти, - призванные обеспечить максимальную загрузку ядра. В интерфейсном блоке применяются технология Micro-ops fusion, при которой несколько инструкций после декодирования объединяются и отправляются для обработки в конвейер, и технология Macro-fusion, при которой ещё до декодирования несколько команд "сливаются" вместе и обрабатываются как единая инструкция. Кроме того, в интерфейсном блоке имеется модуль предсказаний переходов-ветвлений (BPU), ускоряющий обработку инструкций до их передачи на исполнение. Расширенная шина позволяет большему числу инструкций передаваться на исполнительные блоки за каждый такт. Кроме того, в архитектуре Core было ликвидировано известное "узкое место" блока SSE, присутствовавшее в предыдущих микроархитектурах, что обеспечивает заметно более высокую производительность новых чипов в векторных вычислениях по сравнению с предшественниками.
Одной из характерных особенностей архитектуры P6 была структура портов запуска (issue port), которые в Intel называют "dispatch ports", т.е. "порты диспетчеризации". Эта структура сохранена и в микроархитектуре Core, однако существуют и важные различия в портах запуска и буфере ("станции") резервирования (reservation station или RS) двух этих архитектур.
Чтобы понять происхождение этой структуры портов запуска, стоит обратиться к структурной схеме процессора Pentium Pro - первого чипа на базе архитектуры P6. Два порта из пяти отведены арифметике, а три оставшихся - отвечают за доступ к памяти. Буфер резервирования ядра P6 способен передавать на исполнительные блоки по одной инструкции через каждый порт за один такт, то есть, всего до пяти инструкций за такт.
С развитием архитектуры P6 в процессорах Pentium II и Pentium III дорабатывалось и ядро: были добавлены исполнительные блоки для целочисленных векторных вычислений и векторных расчётов с плавающей запятой. Эти блоки были добавлены на два арифметических порта, что привело к их некоторой перегруженности. Именно из-за этого возникло описанное выше "узкое место", из-за которого возможно снижение производительности векторных вычислений в условиях недостаточной пропускной способности портов. Аналогичной архитектурой обладает и процессор Pentium M на ядре Banias.
2. Исполнительное ядро процессора Core
Помимо существенно расширенного буфера резервации (до 32 записей), в ядре Core реализована новая структура портов: здесь не пять портов, как в ядрах Р6, не четыре порта, как в NetBurst, а уже шесть портов. В отличие от предшественников, в Core арифметическим и логическим инструкциям отданы не два, а три порта, что и позволяет избежать описанного выше "узкого места".
У Core есть три 64-разрядных исполнительных блока для целочисленных вычислений, каждый из которых может исполнять однотактовые 64-битные скалярные целочисленные операции. По всей видимости, здесь, как и в ядре P6 предусмотрен один сложный 64-разрядный блок (CIU) и два простых блока (SIU), выполняющих элементарные действия вроде сложения. Один из SIU делит порт 2 с модулем исполнения переходов (BEU): они способны работать параллельно над выполнением объёдиненных в процессе Macro-fision инструкций.
Способность осуществлять 64-разрядные целочисленные вычисления за один такт впервые появились в процессорах Intel x86 line, и эта возможность ставит чипы с архитектурой Core даже выше серверного процессора IBM PowerPC 970, способного выполнять такие вычисления только за два такта. Более того, поскольку блоки арифметической логики (ALU) расположены на отдельных портах, теоретически чипы Core способны выполнять за один цикл сразу три 64-разрядные целочисленные операции.
В Core используются два исполнительных блока для вычислений с плавающей запятой, способные осуществлять как скалярные, так и векторные арифметические операции. Блок, расположенный на порту 1, отвечает за сложение и другие простые операции в форматах: скалярных - с одинарной (32-бит) и двойной (64-бит) точностью; векторных - с 4х одинарной и 2х двойной точностью. Исполнительный блок на порту 2 осуществляет операции умножения и деления в этих же векторных и скалярных форматах. Два блока векторных вычислений делят те же порты, что и два аналогичных блока скалярных вычислений, поэтому их следует считать двумя едиными линиями, выполняющие как скалярные, так и векторные операции.
Одно из важнейших улучшений в Core - блоки векторных или SIMD-вычислений (т.е. с одним потоком инструкций и несколькими потоками данных). Новая архитектура обеспечивает полноценную 128-битную обработку во всех векторных блоках. Когда Intel впервые добавила поддержку 128-битных векторных вычислений в процессоры семейства Pentium при помощи потоковых SIMD-расширений (SSE), результаты оказались не слишком впечатляющими из-за отсутствия возможности работы с трёхоперандными инструкциями, а также из-за ограничений 64-битной внутренней разрядности обработки данных для арифметики с плавающей запятой и инструкций MMX. Для выполнения 128-битных инструкций в P6 приходилось сначала делить эту инструкцию на две, а затем передавать эту пару на соответствующий исполнительный блок. В результате все 128-битные операции могли выполняться не быстрее, чем за два такта. Этот недостаток унаследовали и Pentium 4, и Pentium M.
В новой архитектуре Core благодаря 128-битной ширине внутренних шин обеспечивается однотактовое исполнение 128-разрядных векторных инструкций. При этом требуется лишь одна микрооперация для трансляции и декодирования каждой 128-битной инструкции. К сожалению, двухоперандное ограничение осталось и в Core, однако серьёзных проблем оно уже не вызывает. Если объединить описанные доработки с увеличением числа исполнительных блоков и расширенной пропускной способностью внутренних шин, можно представить, насколько значительно выросла теоретическая производительность векторных операций.
3. Конвейеры
Пока доступно не слишком много подробной информации об организации вычислительного конвейера в Core, однако, уже известно, что он состоит из 14 ступеней. Для сравнения, столько же ступеней у процессора IBM PowerPC 970, у Pentium 4 на ядре Prescott - 30 ступеней, а у чипов с архитектурой P6 - 12 ступеней. Число ступеней свидетельствует, с одной стороны, о сохранении сильных черт архитектуры Р6, а с другой - об отказе от "гонки мегагерц", свойственной архитектуре NetBurst. Точной информации от Intel о назначении двух дополнительных ступеней пока нет, и мы не станем выдвигать собственных версий.
Поскольку постпроцессор ядра Core тоже имеет гораздо более широкую шину, чем у предшественников, буфер переупорядочивания инструкций (ROB) также расширен до 96 записей. Для сравнения, у Pentium M Banias ROB состоял из 40 записей. Так называемое "окно команд", состоящее из буфера переупорядочивания (ROB) и буфера резервирования (RS), было не только физически расширено, но и "виртуально". Технологии Macro-fusion and micro-ops fusion позволяют отслеживать большее число инструкций меньшими средствами. Именно поэтому можно сказать, что функционально окно команд Core шире, чем просто сумма записей ROB и RS. А наполнение такого окна команд необходимым потоком новых инструкций - весьма нетривиальная задача, с которой, впрочем, вполне справились инженеры Intel.
В интерфейсном блоке установлен новый декодирующий модуль, позволяющий увеличить число инструкций, которые могут быть конвертированы в микрооперации за один цикл. Декодер, использовавшийся в ядре Р6, состоял их двух "быстрых" декодирующих блоков и одного сложного ("медленного") декодирующего блока. "Быстрые" блоки транслируют инструкции x86 в одну микрооперацию (micro-op), из которых и состоит подавляющее большинство инструкций. "Быстрые" декодеры за один такт могут отправлять одну микрооперацию в соответствующий буфер. Сложный декодер отвечает за трансляцию инструкций в две-четыре микрооперации. Таких инструкций немного и они редко используются. Три декодирующих модуля ядра P6 могут оправлять за один такт до шести микроопераций в буфер микроопераций, а декодирующий блок в целом может посылать в буфер переупорядочивания до шести микроопераций за один такт.
Перед конструкторами Core стояла задача повысить скорость декодирования настолько, чтобы она позволяла использовать возросшие вычислительные мощности ядра, Прежде всего, в декодирующий блок был добавлен ещё один "быстрый" модуль, что позволило увеличить число отправляемых в буфер микроопераций до семи и число отправляемых в буфер переупорядочивания - до четырёх. Кроме того, в Core "быстрыми" модулями могут обрабатываться больше типов инструкций, в частности, инструкции памяти и SSE, благодаря чему разработчики приблизились к цели получить одну микрооперацию из каждой инструкции x86.
Среди новых технологий, реализованных в архитектуре Core - уже упомянутая Macro-fusion, позволяющая объединять некоторые типы инструкций x86 перед декодированием, что даёт возможность отправлять их на один декодер для трансляции в одну микрооперацию. Такими инструкциями могут быть, в частности, инструкции сравнения, тестирования и переходов. Любой из четырёх декодеров способен за один такт генерировать не более одной микрооперации с использованием технологии Macro-fusion. Один блок арифметической логики, тем самым, способен выполнять, как минимум, две объединённых инструкции определённого типа одновременно. К тому же, при этом освобождаются исполнительные блоки для других типов инструкций. Таким образом, эта технология позволяет "виртуально" расширить окно команд, выполняя в действительности больше инструкций, чем их формальное количество.
Ещё одна технология, Micro-ops fusion, впервые появившаяся в Pentium M, решает почти те же самые задачи, что и Macro-fusion, но другими средствами: "быстрый" декодирующий модуль получает одну инструкцию x86, которая должна транслироваться в две микрооперации, и выдаёт смешанную пару, которая воспринимается в буфере переупорядочивания как одна запись. После перехода в буфер резервирования две микрооперации обрабатываются отдельно: либо параллельно через два отдельных порта, либо последовательно через один порт, в зависимости от конкретной ситуации. Как правило, такими микрооперациями являются load и store.
Технология Micro-ops fusion, как и Macro-fusion, "виртуально" расширяет окно команд и делает архитектуру Core более энергоэффективной, поскольку большее число операций выполняется меньшими аппаратными средствами.
Модуль предсказания переходов в ядре Core был существенно расширен в целях обеспечения повышенной производительности и энергоэффективности. Модуль состоит из тех же трёх частей, что и аналогичный модуль в процессорах Pentium M (Banias): прямого предсказателя ветвлений (global и bi-modal), непрямого (indirect) и определителя циклов (loop detector). Предсказатели работают на основе информации о недавно исполненных переходах, причём прямой путь, заложенный в самой команде, обеспечивает почти стопроцентную точность предсказаний, в то время как при непрямом пути данные о наиболее часто используемых адресах извлекаются из регистра, что обеспечивает чуть меньшую, но всё равно весьма высокую точность.
Переходы завершения цикла могут быть выполнены лишь однажды - по завершению цикла, поэтому в буфере переходов не сохраняется достаточно статистических данных для того чтобы с точностью предсказать завершение ветвления. Для сведения к минимуму вероятности возникновения подобных ситуаций применяется определитель циклов, отслеживающий исполнение каждого ветвления с целью определить, какое из них удовлетворяет условиям завершения цикла. Соответствующая статистика накапливается, поэтому точность предсказания подобных переходов приближается к ста процентам.
4. Устранение неоднозначности в памяти
Оригинальная технология устранения неоднозначности в памяти (memory disambiguation) призвана сводить к минимуму недостатки процессоров ОООЕ (то есть, со схемой внеочередного исполнения команд). Дело в том, что такие процессоры не могут производить дальнейшие вычисления до тех пор, пока не будут возвращены в основную память или в файл регистра данные о результатах исполнения предыдущих инструкций. Даже если последующая операция никак не зависит от предыдущих, процессор вынужден ожидать сохранения результатов их выполнения.
По некоторым данным, порядка 97 процентов инструкций в окне команд никак не связаны с предшествующими и могут исполняться независимо от них. Тем не менее, в архитектурах Р6 и NetBurst предполагалось, что эти связи существуют, и это предположение вело к неоправданному снижению производительности. Технология устранения неоднозначности как раз и пытается определять подобные ложные связи, что позволяет повысить производительность работы чипа.
Решение проблемы заключается в том, чтобы дать процессору "понять" зависимости между исполняемыми инструкциями. Для этого и применяется технология устранения неоднозначности: при помощи особых алгоритмов предпринимаются попытки предсказания последовательности загрузки последующих инструкций ещё до сохранения предыдущих. В худшем случае операции выполняются, как и раньше, после сохранения, а при удачном исходе предсказания - одновременно с сохранением данных о результатах выполнения предыдущих операций. Разумеется, подобные алгоритмы применимы не во всех ста процентах случаев, но в целом их использование позволит заметно увеличить производительность процессора.
В будущих статьях мы планируем подробно остановиться на прочих особенностях новой архитектуры Core, которая призвана в ближайшие годы стать общей для подавляющего большинства компьютерной техники.