Особенности архитектуры AMD К10
На базе данной архитектуры вышло целое семейство новых серверных и настольных микропроцессоров. Процессоры этой архитектуры, производимые по степпингам В2 и ВА, имели ошибку в контроллере памяти (так называемый TLB bug), которая приводила к нестабильной работе системы. Таким образом, первый выход, в свет 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 Technology. Кроме применения двух независимых 64-битных контроллеров памяти вместо одного 128-битного, имеются и другие улучшения контроллера памяти. Так, оптимизирован алгоритм переупорядочения операций чтения/записи, что позволяет
наиболее эффективно использовать шину памяти. Операции чтения имеют преимущество перед операциями записи, а данные, предназначенные для записи, откладываются в специальном буфере. Кроме того, контроллер памяти умеет анализировать последовательности запросов и делать соответствующую предвыборку.
Ядро процессора
Структурная блок-схема одного ядра процессора на базе микроархитектуры 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
Кроме того, в микроархитектуре К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.
