Особенности архитектуры AMD К10

Опубликовано в Компоненты ПК, Процессоры

В этой статье мы подробно рассмотрим особенности архитектуры AMD К10.  На базе данной архитектуры вышло целое семейство новых серверных и настоль­ных микропроцессоров. Процессоры этой архитектуры, производимые по степпингам В2 и ВА, имели ошибку в контроллере памяти (так называемый TLB bug), которая приводила к нестабильной работе системы. Таким образом, первый выход, в свет AMD К10 нельзя назвать гладким.

Особенности архитектуры AMD К10

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

Первые упоминания о микроархитектуре следующего поколения, которая должна была прийти на смену микроархитектуре AMD К8, появились в далеком 2003 году. В частности, на форуме Microprocessor Forum 2003 отмечалось, что новая микро­архитектура будет положена в основу многоядерных процессоров, которые будут работать с тактовыми частотами до 10 ГГц. Позднее, конечно, иллюзии относитель­но заоблачных тактовых частот прошли, а новая микроархитектура стала посте­пенно приобретать все более конкретные очертания. Так, летом 2006 года появились планы по выходу процессоров на ее базе. Правда, тогда новая микроархитектура значилась под кодовым наименованием K8L, и только в феврале 2007 года ей было дано название AMD К10.

Итак, что же нового в микроархитектуре AMD К10? Четырехъядерные процессо­ры на базе новой микроархитектуры имеют площадь кристалла 291 мм2 и содержат порядка 463 млн транзисторов. Они выполняются по 65-нанометровому техпроцессу (SOI) и содержат 11 слоев.

Технология AMD Memory Optimizer

Одно из существенных нововведений в микроархитектуре AMD К10 — это новый контроллер памяти. В процессорах AMD К8 использовался один 128-битный кон­троллер памяти, который можно рассматривать как два спаренных 64-битных контроллера. В микроархитектуре AMD К10 применяются два независимых 64-битных контроллера памяти, что позволяет существенно ускорить доступ к па­мяти.

Чтобы понять, почему использование двух независимых 64-битных контроллеров памяти более эффективно, чем применение одного 128-битного, вспомним, что со­временные модули памяти являются именно 64-битными. Для увеличения пропуск­ной способности подсистемы памяти используется одновременный доступ к двум различным модулям памяти по двум 64-битным каналам (двухканальный режим работы). Это позволяет теоретически в два раза увеличить пропускную способность подсистемы памяти, поскольку за каждый такт работы контроллера памяти можно считывать две порции данных объемом по 64 бита, то есть всего 128 бит.

Однако применение двухканальной схемы работы контроллера памяти имеет и свои нюансы. Проблема заключается в том, что если процессору потребовались 64 бита данных (данные А), хранящиеся по адресу #1, то вместе с ними одновременно будут считаны и 64 бита данных (данные В), хранящихся по соседнему адресу #2 в другом модуле памяти. В операциях линейного чтения больших объемов данных такая ситуация лишь удваивает пропускную способность памяти. Однако может оказаться, что процессору не нужны считанные данные В, а нужны только дан­ные А. В этом случае двухканальный режим работы памяти не позволяет получить выигрыш в производительности и, соответственно, 128-битный контроллер памя­ти будет функционировать с эффективностью одного 64-битного.

Применение двух независимых 64-битных контроллеров памяти, как в микроар­хитектуре AMD К10, позволяет одновременно загружать блоки данных с произ­вольными адресами из различных модулей памяти.

Предположим, что процессору необходимо произвести операцию умножения двух чисел. Первое число — это Data А, которое имеет адрес #1, а второе число — Data D, имеющее адрес #4. Пусть Data А хранится в первом модуле памяти, a Data В — во втором. В случае использования 128-битного контроллера памяти придется сначала загрузить 64 бита данных по адресу #1 (Data А) из первого мо­дуля памяти и одновременно с этим — 64 бита данных по адресу #2 (Data В), которые процессору не нужны. Далее будут загружены 64 бита данных по адресу #3 (Data С), которые также не нужны процессору, и 64 бита данных по адресу #4 (Data D). Как видите, применение 128-битного контроллера памяти в данном случае малоэффек­тивно. Если же используются два независимых 64-битных контроллера памяти, то за один такт загружается 64 бита данных по адресу #1 (Data А) и 64 бита данных по адресу #4 (Data D).

Новая технология доступа к памяти называется AMD Memory Optimizer Tech­nology. Кроме применения двух независимых 64-битных контроллеров памяти вместо одного 128-битного, имеются и другие улучшения контроллера памяти. Так, опти­мизирован алгоритм переупорядочения операций чтения/записи, что позволяет
наиболее эффективно использовать шину памяти. Операции чтения имеют пре­имущество перед операциями записи, а данные, предназначенные для записи, от­кладываются в специальном буфере. Кроме того, контроллер памяти умеет анали­зировать последовательности запросов и делать соответствующую предвыборку.

Ядро процессора

Структурная блок-схема одного ядра процессора на базе микроархитектуры AMD К10 показана на рисунке ниже.

Структурная блок-схема одного ядра процессора на базе микроархитектуры AMD К10

Структурная блок-схема одного ядра процессора на базе микроархитектуры AMD К10

Изучая структурную схему нового ядра и сравнивая ее со схемой легендарного К8, можно заметить, что общих черт у них больше, чем различий.

Собственно, микро­архитектура К10 наследует черты К8, являясь ее логическим развитием. Исполь­зуется все тот же 12-ступенчатый конвейер, как и в микроархитектуре К8.

Однако, несмотря на внешнее сходство, новое ядро процессора все же претерпело существенные изменения. Расскажем обо всем по порядку.

Предвыборка данных и инструкций

Напомним, что исполнение кода процессором начинается с процесса выборки инструкций и данных из кэша L1. Однако для того, чтобы инструкции и данные попали в этот кэш, их нужно предварительно туда загрузить из оперативной памя­ти. Такой процесс, как говорилось ранее, называется предвыборкой данных и ин­струкций из оперативной памяти.

В процессорах с микроархитектурой К8 имеются два блока предвыборки (Fetch Unit): один для предвыборки данных, а другой — для предвыборки инструкций. Блок предвыборки данных производит предвыборку в кэш L2.

В микроархитектуре AMD К10 предвыборка данных осуществляется непосред­ственно в кэш L1, что, по утверждению представителей компании AMD, способ­ствует повышению производительности, несмотря на вероятность засорения кэ­ша L1 ненужными данными.

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

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

Выборка из кэша

В процессорах на базе микроархитектуры К8 инструкции из кэша L1 загружаются блоками длиной 16 байт (128 бит), а в микроархитектуре К10 длина блока увели­чена вдвое и составляет 32 байта (256 бит). При выборке 16-байтного блока ин­струкций за такт процессоры на базе микроархитектуры К8 могут выбирать и со­ответственно отправлять на декодирование до четырех инструкций средней длиной 4 байта.

В принципе, нельзя утверждать, что использование увеличенного вдвое размера блока выборки инструкций в микроархитектуре AMD К10 позволяет выбирать за такт вдвое больше инструкций. Просто в архитектуре AMD К8 длина блока вы­борки инструкций была согласована с возможностями декодера. В архитектуре AMD К10 возможности декодера изменились, в результате чего потребовалось изменить и размер блока выборки, чтобы темп выборки инструкций был сбалан­сирован со скоростью работы декодера.

Предсказание переходов и ветвлений

Предсказание переходов в процессорах на базе микроархитектуры К8 осуществ­ляется по адаптивному алгоритму на основе анализа истории восьми предыдущих переходов.

Основным недостатком механизма предсказания переходов в микроархитектуре К8 было отсутствие предсказания косвенных переходов с динамически чередующимися адресами, то есть переходов, которые производятся по указателю, динамически вычисляемому при выполнении кода программы.

В микроархитектуре AMD К10 предсказание переходов существенно улучшено. Во-первых, появился механизм предсказания косвенных переходов. Во-вторых, оно выполняется на основе анализа 12 предыдущих переходов, что повышает точ­ность предсказания. В-третьих, вдвое (с 12 до 24 элементов) увеличена глубина стека возврата.

Процесс декодирования

После этапа выборки инструкций х86 из кэша L1 в полном соответствии со схемой «классического» процессора наступает этап декодирования (трансляции) в машин­ные команды. Этап декодирования присущ любому современному х86-совмести- мому процессору, имеющему внутреннюю RISC-архитектуру.

Процесс декодирования состоит из двух этапов. На первом этапе выбранные из кэша L1 блоки инструкций длиной 32 байта помещаются в специальный буфер предкодирования Predecode/Pick Buffer. В нем из 32-байтных блоков выделяют­ся отдельные инструкции, которые затем сортируются и распределяются по различным каналам декодера. Декодер транслирует х86-инструкции в простейшие машинные команды (микрооперации), называемые Micro-Ops. Сами х86-команды могут быть переменной длины, а вот длина микроопераций уже фиксиро­ванная.

Инструкции х86 делятся на простые и сложные. Простые инструкции при декоди­ровании представляются с помощью одной-двух микроопераций, а сложные — тре­мя и более микрооперациями. Простые инструкции отсылаются в аппаратный декодер, построенный на логических схемах и называемый DirectPath, а слож­ные — в микропрограммный декодер, называемый Vector Path. Этот декодер пред­ставляет собой своеобразный программный процессор. Он содержит программный код, хранящийся в MIS, на основе которого воспроизводится последовательность микроопераций.

Аппаратный декодер DirectPath является трехканальным и может декодировать за один такт три простые инструкции, если каждая из них транслируется в одну микрооперацию, либо одну простую инструкцию, транслируемую в две микроопе­рации, и одну простую инструкцию, транслируемую в одну микрооперацию, либо две простые инструкции за два такта, если каждая инструкция транслируется в две микрооперации (полторы инструкции за такт). Таким образом, за каждый такт аппаратный декодер DirectPath выдает три микрооперации.

Микропрограммный декодер VectorPath также способен выдавать по три микро­операции за такт при декодировании сложных инструкций. При этом сложные инструкции не могут декодироваться одновременно с простыми, то есть при рабо­те трехканального аппаратного декодера микропрограммный декодер не исполь­зуется, а при декодировании сложных инструкций, наоборот, бездействует аппа­ратный декодер.

Микрооперации, полученные в результате декодирования инструкций в декодерах DirectPath и VectorPath, поступают в Pack Buffer, где они объединяются в группы по три микрооперации. В том случае, когда за один такт в буфер поступает не три, а одна или две микрооперации (в результате задержек с выбором инструкций), группы заполняются пустыми микрооперациями, но так, чтобы в каждой группе было ровно три микрооперации. Далее группы микроинструкций отправляются на исполнение.

Если посмотреть на схему декодера в микроархитектурах К8 и К10, то видимых различий, казалось бы, нет Действительно, принципиальная схема ра­боты декодера осталась без изменений. Разница в данном случае заключается в том, какие инструкции считаются сложными, а какие — простыми, а также в том, как декодируются различные инструкции. Так, в микроархитектуре К8 128-битные SSE-инструкции разбиваются на две микрооперации, а в микроархитектуре К10 большинство SSE-инструкций декодируется в аппаратном декодере как одна мик­рооперация. Кроме того, часть SSE-инструкций, которые в микроархитектуре К8 декодируются через микропрограммный VectorPath-декодер, в микроархитектуре К10 декодируются через аппаратный Direct Path-декодер.

Декодирование команд в микроархитектурах К8 и К10

Декодирование команд в микроархитектурах К8 и К10

Кроме того, в микроархитектуре К10 в декодер добавлен специальный блок, назы­ваемый Sideband Stack Optimizer. Не вникая в подробности, отметим, что он повы­шает эффективность декодирования инструкций работы со стеком и позволяет переупорядочить микрооперации, получаемые в результате декодирования, чтобы они могли выполняться параллельно.

Диспетчеризация и переупорядочение микроопераций

После прохождения декодера микрооперации (по три за каждый такт) поступают в блок управления командами, называемый Instruction Control Unit (ICU). Главная задача ICU заключается в диспетчеризации трех микроопераций за такт по функ­циональным устройствам, то есть ICU распределяет инструкции в зависимости от их назначения. Для этого используется буфер переупорядочения (ROB), который рассчитан на хранение 72 микроопераций (24 линии по три микрооперации).

Каждая группа из трех микроопераций записывается в свою линию. Из буфера переупорядочения микрооперации поступают в очереди планировщиков целочис­ленных (Int. Scheduler) и вещественных (FPU Scheduler) исполнительных устройств в том порядке, в котором они вышли из декодера.

Выполнение микроопераций

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

Блок операций с целыми числами состоит из трех распараллеленных частей. По ме­ре готовности данных планировщик может запускать на исполнение из каждой очереди одну целочисленную операцию в устройство ALU и одну адресную операцию в устройство AGU. Количество одновременных обращений к памяти ограни­чено двумя. Таким образом, за каждый такт может запускаться на исполнение три целочисленные операции, обрабатываемые в устройствах ALU, и две операции с па­мятью, обрабатываемые в устройствах AGU.

Отметим, что в микроархитектуре К8 при выполнении операций с памятью име­ется одно существенное ограничение. Дело в том, что операции обращения к памя­ти должны идти в том виде, в котором они записаны в коде программы, то есть более поздние в программе операции обращения к памяти не могут выполняться перед более ранними. Понятно, что такое ограничение может существенно отра­зится на эффективности выполнения программного кода, поскольку нередко бло­кирует выполнение программы на несколько тактов.

В микроархитектуре К10 такого ограничения не существует, то есть имеется воз­можность выполнения команды обращения к памяти вне очереди.

Как уже отмечалось, для работы с вещественными числами реализованы три функ­циональных устройства FPU: FADD — для вещественного сложения, FMUL — для вещественного умножения и FMISC (он же FSTORE) — для команд сохранения в памяти и вспомогательных операций преобразования.

В микроархитектурах К8 и К10 планировщик для работы с вещественными чис­лами каждый такт может запускать на исполнение по одной операции в каждое функциональное устройство FPU. Подобная реализация блока FPU теоретически позволяет выполнять до трех вещественных операций за такт.

В микроархитектуре К8 устройства FPU являются 64-битными. Векторные 128-битные SSE-команды разбиваются на этапе декодирования на две микроопе­рации, которые производят операции над 64-битными половинами 128-битного операнда и Запускаются на исполнение последовательно в разных тактах.

В микроархитектуре К10 устройства FPU являются 128-битными. Соответственно 128-битные SSE-команды обрабатываются с помощью одной микрооперации, что теоретически увеличивает темп выполнения векторных SSE-команд в два раза по сравнению с микроархитектурой К8.

Технологии энергосбережения

Кроме существенных улучшений в процессе выполнения программного кода, в микроархитектуре AMD К10 предусмотрены и новые технологии энергосбере­жения, позволяющие существенно повысить оптимизированную производитель­ность процессора, то есть производительность в расчет на ватт потребляемой энергии. В частности, в микроархитектуре К10 реализованы такие технологии, как CoolCore, Independent Dynamic Core и Dual Dynamic Power Management (DDPM).

Технология CoolCore дает возможность автоматически выключать те части (цепи) процессора, которые в данный момент не используются. В результате достигается снижение энергопотребления и соответственно тепловыделения процессора.

Технология Independent Dynamic Core позволяет каждому ядру процессора рабо­тать на собственной тактовой частоте, то есть предусмотрено динамическое (в за­висимости от текущей загрузки) и независимое изменение тактовой частоты каждого ядра процессора. В Independent Dynamic Core предусмотрено пять энер­гетических уровней, что дает существенную экономию энергопотребления. Правда, данная технология позволяет динамически изменять только частоту ядра каждого процессора, но не напряжение питания. Напряжение питания всех ядер процессо­ра одинаковое и определяется напряжением питания того ядра, которое функцио­нирует на максимальной тактовой частоте.

Технология Dual Dynamic Power Management (DDPM) подразумевает применение двух различных линий для питания ядер процессора и контроллера памяти. Это позволяет не привязывать частоту работы контроллера памяти к частоте работы ядер процессора. Отметим, что технология DDPM реализуется только при исполь­зовании разъема Socket АМ2+, поскольку в разъемах Socket АМ2 предусмотрена единая линия для питания процессора и контроллера памяти.

Шина HyperTransport 3.0

В новых процессорах AMD для ПК (Phenom FX, Х4, ХЗ и Х2) предусмотрено применение новой шины HyperTransport 3.0 вместо 1.x. Правда, в серверных про­цессорах Opteron на базе микроархитектуры AMD К10 еще некоторое время будет использоваться шина HyperTransport 1.x, но в будущем в них также будет реали­зована поддержка HyperTransport 3.0.

Шина HyperTransport является двунаправленной и служит для обмена данными между процессором и компонентами системы. Первые ее версии работали на час­тоте 800 и 1000 МГц, что обеспечивало пропускную способность 6,4 и 8 Гбайт/с соответственно.

Шина HyperTransport 3.0 имеет динамическую рабочую частоту, которая зависит от тактовой частоты процессора. Связь между тактовой частотой процессора и час­тотой шины HyperTransport определяется коэффициентом пропорциональности ¾. К примеру, если тактовая частота процессора составляет 2 ГГц, то частота шины HyperTransport 3.0 — 1,5 ГГц.

Максимальная частота шины HyperTransport 3.0 равна 2,6 ГГц, что соответствует тактовой частоте процессора 3,5 ГГц.

Кроме более высоких тактовых частот, шина HyperTransport 3.0 поддерживает режим динамической переконфигурации. Например, в процессе работы шина 1×16 HyperTransport может быть виртуально переконфигурирована в 2×8 HyperTransport. Это может пригодиться при использовании с многоядерными процессорами, когда каждому ядру будет отводиться своя шина HyperTransport.