На рынке высокопроизводительных универсальных микропроцессоров осталось всего три основных игрока – компании IBM, AMD и Intel. Наиболее распространенная 64-разрядная архитектура, x86-64/EM64T, уже не уступает – а то и превосходит – по производительности IBM Power6/Power6+ (табл. 1), при том что стоимость компьютеров на платформе IBM гораздо выше. Поэтому появление микроархитектуры Intel Nehalem и процессоров на ее базе, вышедших в лидеры производительности, стало определяющим событием для всего компьютерного рынка.
В Nehalem инженеры Intel отказались от применявшейся ранее общей шины FSB и присоединилась к более эффективному решению со встроенным в процессор контроллером оперативной памяти; подобный подход использован и в процессорах IBM и AMD. В Nehalem появилась также последовательная «шина» Quick Path Interconnect (QPI), на идейном уровне аналогичная поддерживаемому в AMD Opteron решению – шине HyperTransport. В результате архитектурные преимущества Opteron в построении многопроцессорных серверов, позволившие AMD за последние пять-шесть лет существенно увеличить свою долю на рынке, были нивелированы.
Профессиональный анализ микроархитектуры Nehalem и производительности процессоров на ее базе начался еще до официального выхода этих процессоров на рынок [1]. Nehalem используется в процессорах как для настольных систем (Сore i7), так и для серверов (Xeon 5500). Микроархитектура этих процессоров едина.
Микроархитектура Nehalem
Современная микроархитектура х86-процессоров Intel строится по модульному принципу и может «собираться» подобно Лего [2]. По сравнению с предыдущей микроархитектурой Core 2, самые грандиозные перемены в Nehalem обусловлены появлением QPI и встроенного контроллера памяти. Общая длина конвейера по сравнению с Core 2 возросла всего на две стадии, до 16 стадий [3].
Фронтальная часть Nehalem. По сравнению с Сore 2 фронтальная часть процессора, как и большинство других блоков микроархитектуры, коренным изменениям не подвергалась. Как и прежде, предусмотрено три простых декодера (для x86-команд, декодируемых в одну микрооперацию) и один сложный (декодирует как простые, так и сложные команды), что дает темп декодирования в четыре микрооперации за такт. Повысилась пропускная способность встроенной памяти с микрооперациями для команд, декодируемых более чем в четыре микрооперации: эта пропускная способность также равна четырем микрооперациям за такт.
На стадии декодирования поддерживается и объединение микроопераций (micro fusion), и объединение макроопераций (macro fusion), как и в Core2 [2, 3]. Объединение макроопераций в Nehalem сильно усовершенствовано: во-первых, оно стало доступно в 64-разрядном режиме (ранее оно было ограничено 32-разрядным режимом); во-вторых, оно стало включать больше комбинаций команды сравнения CMP и перехода (теперь с JL/JNGE, JGE/JNL, JLE/JNG, JG/JNLE). Декодирование и выполнение такого макрообъединения как единой команды повышает производительность.
Усовершенствован блок Loop Sream Detector, распознающий циклы и позволяющий отключать некоторые блоки конвейера. Блок перенесен по конвейеру вперед – за стадию декодирования, что позволяет отключить три предыдущих блока конвейера – предсказания переходов, выборки и декодирования. Loop Stream Detector содержит теперь декодированные команды (его емкость возросла с 18 команд х86 до 28 микроопераций) и напоминает Trace Cache в архитектуре Pentium 4 NetBurst.
Предсказание переходов, традиционное направление совершенствования микроархитектуры современных процессоров, стало существенно точнее. Предсказание теперь двухуровневое, а общий размер таблиц предыстории увеличен [2]. Целью инженеров Intel при этом было увеличение производительности на объемных кодах, таких, например, как управление базами данных.
Для буфера стека адресов возврата (Return Stack Buffer, RSB), используемого для предсказания адресов возврата из процедур, стала использоваться техника переименования, аналогичная известной технике переименования регистров и позволяющая во многих случаях избегать «повреждения» RSB при исполнении на спекулятивно выбранном пути [4].
Исполнительная часть конвейера. В этом компоненте микроархитектура Nehalem также близка к Core 2. Она основана на применении спекулятивного внеочередного выполнении микроопераций, для которых используется общий планировщик RS (Reservation Station) для всех функциональных исполнительных устройств. RS может выдавать на выполнение до шести микроопераций за такт, в том числе три операции с оперативной памятью – одна загрузка регистра (L), одна запись данных (ST) и одна запись адреса – плюс три вычислительные операции. Однако за такт может завершаться до четырех микроопераций, поэтому суперскалярные архитектуры Core2 и Nehalem имеют «ширину» до четырех микроопераций (для сравнения, в Opteron – только три).
Увеличена емкость буфера Reorder Buffer (ROB), определяющая число всех одновременно выполняемых микроопераций – с 96 до 128; емкость RS возросла с 32 до 36 строк, емкость буфера L – с 32 до 48, буфера ST – с 20 до 32 [4]. Cоответственно возрос внутренний параллелизм. С другой стороны, в режиме НТ (Hyper-Threading, см. ниже) нагрузка на исполнительную часть конвейера повышается. При этом, в отличие от RS, буфера L/ST и ROB между двумя нитями распределяются статически.
Ряд усовершенствований Nehalem связан с системой команд. Во-первых, появились более эффективные примитивы синхронизации нитей и были уменьшены задержки синхронизации. Во-вторых, дальнейшее расширение получило подмножество команд SSE4 – теперь SSE4.2. Оно включает, в частности, четыре новые команды – PCMPESTRI/M и PCMPISTRI/M для работы с цепочками символов. Это усовершенствование сделано в расчете на приобретающие все большую актуальность трудоемкие задачи XML-обработки.
Кроме того, появилась команда CRC32 (подсчет 32-разрядной циклической суммы для бита/слова/двойного слова/квадрослова) и подсчета числа единиц (POPCNT). Любопытно, что аналогичная команда имелась еще в легендарном советском компьютере БЭСМ-6. Эта операция эффективно применяется в задачах распознавания голоса и последовательностей в ДНК. Приведем также данные о задержках выполнения некоторых типовых команд. Для простых целочисленных операций она равна одному такту, для умножения – три такта; для сложения с плавающей запятой двойной точности – три такта, аналогичного умножения с плавающей запятой – пять тактов. Команды конвейеризированы, поэтому пропускная способность равна одному такту.
После некоторого перерыва в Nehalem на новом уровне возродилась технология Hyper-Threading (в BIOS для Nehalem часто используется более общий термин - Simultaneous Multi-Threading). Увеличение в Nehalem емкости кэша, пропускной способности способность оперативной памяти и емкости других структур данных сделали HT более эффективной.
НТ обеспечивает поддержку одновременного выполнения ядром Nehalem двух нитей, то есть каждое ядро логически представляется в виде двух логических ядер (процессоров). В условиях, когда многие приложения не могут достаточно полно задействовать ресурсы ядра Nehalem (в том числе исполнительные устройства) и не обеспечивают достаточного параллелизма при выполнении кодов процесса, НТ является недорогим (в смысле дополнительной логики на микросхеме) путем повышения производительности за счет параллелизма на уровне ядра.
В новой реинкарнации НТ заметно поднимает производительность на ряде приложений, в том числе на тестах с базами данных – Oracle 10g, Microsoft SQL Server [5]. Для HPC-приложений НТ обычно отключают. Исключением могут быть приложения, производительность которых ограничивается обращениями в память.
Структура кэш-памяти и TLB. В Nehalem кэш претерпел существенные изменения. Он стал трехуровневым (табл. 2), и изменилась схема обеспечения когерентности кэша.
Все три уровня кэша используют строку длиной 64 байта и технику обратной записи. Кэши второго и третьего уровней содержат и команды, и данные. Первый и второй уровни кэша – свои для каждого ядра, кэш третьего уровня разделяется всеми четырьмя ядрами. Заложены технические возможности увеличения в будущем емкости этого кэша.
По сравнению с Core2, в кэше данных первого уровня обеспечена поддержка большего числа параллельно обрабатываемых промахов. Программистам следует обратить внимание на то, что загрузка регистра стоит целых четыре такта (против трех ранее; Opteron также имеет задержку три такта), ее необходимо «скрывать» другими командами. Величины задержек разных кэшей приведены в табл. 2. Наши измерения на тестах lmbench им соответствуют; для третьего уровня задержка колебалась в диапазоне 35-38 тактов.
В Opteron Shanghai в расчете на один такт пропускная способность кэша команд первого уровня вдвое больше – 32 байт против 16 в Nehalem.
Кроме того, емкость кэша второго уровня в четырехъядерных Opteron в два раза выше – 512 Кбайт. Зато емкость кэша третьего уровня выше в Nehalem – 8 Мбайт против 6 Мбайт в Shanghai. (Теоретически можно найти приложение, где структура кэш-памяти Opteron выгоднее – скажем, если рабочее множество страниц локализуется в 512 Кбайт, но плохо локализуется в 256 Кбайт.)
В отличие от Opteron, иерархия кэша в Nehalem является инклюзивной, то есть строки данных первого и второго уровней присутствуют также в третьем уровне. По сравнению с эксклюзивной схемой в Opteron у такого подхода есть свои достоинства и недостатки.
В случае промаха в кэшах первого, второго и затем в общем кэше третьего уровня в эксклюзивной схеме требуется проверка кэшей первого и второго уровней трех других ядер данного процессора, в то время как в инклюзивной схеме промах в кэша третьего уровня сразу означает необходимость обращения в память. Таким образом, задержки в инклюзивной схеме при этом ниже. Минусом инклюзивной схемы является потенциально меньшая эффективная емкость кэша. Однако 8 Мбайт для кэша третьего уровня выглядят вполне достаточно.
В случае попадания в кэш третьего уровня (при промахах на первом и втором уровнях) cитуация сложнее. В инклюзивной схеме после обнаружения попадания для поддержки когерентности необходима еще проверка кэшей первого и второго уровней других ядер на предмет наличия там строки с таким же адресом памяти. Для уменьшения вызываемой этим задержки в строке кэша третьего уровня в Nehalem добавлен набор битов core valid – по одному на каждое из четырех ядер. Проверка строк кэшей первого и второго уровней других ядер нужна, только если для этих ядер бит core valid в строке кэша третьего уровня равен 1 [4]. Используемый ранее Intel протокол MESI в Nehalem был расширен путем включения нового состояния – Forwarded [6]. Этот протокол получил название MESIF. Однако в MESIF нет оптимизации за счет состояния Owner, как в используемом в Opteron протоколе MOESI [7].
Буферы быстрой переадресации TLB в Nehalem также усовершенствованы. Доработки были направлены на повышение эффективности работы с приложениями, автивно использующими память большой емкости.
B Nehalem возрос размер D-TLB кэша первого уровня – до 64 строк для страниц емкостью 4 Кбайт; TLB содержит еще 32 строки для больших страниц (емкостью 2/4 Мбайт). I-TLB кэша первого уровня имеет емкость 128 строк (по 64 строки на каждую нить в HT) для стандартных страниц и 7 строк – для больших страниц. TLB второго уровня емкостью 512 строк для стандартных страниц служит и для команд, и для данных. D-TLB первого уровня и TLB второго уровня динамически разделяются между нитями. Промах в D-TLB первого уровня при попадании в TLB второго уровня дает задержку всего семь тактов [3].
QPI и контроллер оперативной памяти. В Nehalem инженеры Intel отказались от контроллера памяти в северном мосте MCH в пользу более эффективного варианта – интегрированного в процессор контроллера памяти (IMC), что обеспечивает масштабирование пропускной способности оперативной памяти с числом процессоров в системе. Преимуществом IMC является, в частности, уменьшение задержек, которые в современных вариантах DDR и так возрастают (в FB-DIMM задержки могут быть еще выше). В поддерживаемой IMC технологии DDR3 типовые задержки CAS составляют семь-девять тактов (в DDR2 – обычно пять-шесть тактов), причем в более надежных буферизованных DIMM они выше, чем в небуферизованных. IMC работает с DIMM обоих типов.
Каждый IMC поддерживает по три канала DDR3-800, DDR3-1066 или DDR3-1333. Встроенный характер IMC делает двухпроцессорные серверы с Xeon 55XX не SMP-, а ccNUMA-cистемами, как Opteron. Для DDR3-1333 задержка обращения в удаленную память, подсоединенную к IMC в другом процессоре, составляет ~90 нс (это даже меньше, чем ~100 нс в Harpertown c FSB1600) против 60 нс для локальной оперативной памяти. Пропускная способность удаленной оперативной памяти примерно в полтора раза ниже локальной (наши замеры на тестах stream для одного процесса дали 32-34% падения пропускной способности).
В IMC реализованы продвинутые возможности предварительной выборки и при необходимости проводится агрессивное переупорядочение запросов в память, что позволяет скрывать задержки. Ранее аппаратура предварительной выборки была оптимизирована для работы с данными на границе 64 байт; IMC эффективно работает и с невыровненными данными. При случайном обращении в память (скажем, при работе с базами данных) такую выборку рекомендовалось отключать, хотя для HPC-приложений она могла давать выигрыш. В IMC такого отключения делать не надо. В Nehalem каждое ядро отрабатывает параллельно до 10 промахов по данным в кэше и до 16 транзакций в оперативную память одновременно может выполняться в расщепленном режиме; для сравнения, в Core2 эти показатели равны 8 и 14 соответственно [2, 4, 8].
Применение DIMM DDR3 c Nehalem имеет целый ряд тонкостей [9]. Так, в случае подсоединения по два модуля DIMM на канал пропускная способность снижается на одну ступень – например, с 1333 до 1066, а при подсоединении большего числа модулей – до 800. Несимметричные по заселенности каналов оперативной памяти конфигурации также приводят к понижению пропускной способности, даже если модули расположены на всех каналах памяти. Дающие наивысшую производительность небуферизованные модули DIMM могут применяться только по одному на канал.
Чтобы получить пиковую пропускную способность канала, надо число передач в секунду умножить на 8 (ширину канала в байтах), то есть для DDR3-800/1066/1333 получается соответственно 6,4/8,5/10,7 Гбайт/с. В расчете на процессорный разъем это число надо умножить на 3 (число каналов). В Opteron Shanghai, для сравнения, IMC поддерживает DDR2-800 (пропускная способность 6,4 Гбайт/с) и всего два канала на процессор.
Для обеспечения когерентности кэшей и памяти в многопроцессорных серверах с Xeon 55XX и для работы с внешними устройствами в Nehalem применяется последовательное межсоединение типа «точка-точка», QPI. Cтарое его название – СSI (Common System Interface). Это двунаправленноые каналы, где в каждом направлении за такт передается 20 бит (2 байт плюс 4 бит на детектирование ошибок и поддержание протокола работы). В QPI используется дифференциальная сигнальная схема и пакетная передача данных. Размер пакета составляет 80 бит: 64 бит данных плюс CRC, биты flow control и т.п.; на передачу пакета может уходить от 4 до 16 тактов. QPI обеспечивает 6,4 млрд передач в секунду, то есть имеет пиковую пропускную способность 12,8 Гбайт/с, или 25,6 Гбайт/с при двунаправленной передаче [8].
Доступные сегодня модели Xeon 5500, позволяющие строить двухпроцессорные системы, имеют по два канала QPI на процессор. Один из QPI при этом для ввода/вывода, второй – для межпроцессорного общения. Пиковая пропускная способность FSB у Intel ранее также достигла 12,8 Гбайт/с. Но QPI допускает одновременную обработку транзакций на запись и чтение, а FSB – только чтение или только запись. Даже если обрабатываются только транзакции в одном направлении, применение QPI обеспечивает большую пропускную способность, чем FSB: в отличие от FSB, QPI не пропускают через себя идущий через IMC трафик оперативной памяти (если не считать межпроцессорных обменов для обеспечения когерентности кэшей).
Реализация Nehalem. Ограниченный объем статьи не позволяет рассмотреть еще ряд интересных особенностей микроархитектуры Nehalem. Упомянем только новые средства EPT (Extended Page Table), способствующие повышению производительности модных ныне средств виртуализации – за счет уменьшения числа переходов между виртуальными машинами и уменьшения задержек таких переходов примерно в полтора раза [3, 4].
Процессоры Xeon/Nehalem содержат 751 млн транзисторов (у Shanghai – 758 млн) при площади 263 кв. мм (против 258 кв. мм у Shanghai) и изготавливаются по КМОП-технологии с типоразмером 45 нм с использованием диэлектрика с большой диэлектрической проницаемостью [6]. Диапазон поддерживаемых тактовых частот составляет от 1,8 до 3,33 ГГц, максимальное расчетное тепловыделение ТDP (Thermal Design Power) – в зависмости от модели процессора – от 60 Вт до 130 Вт; значение TDP для середины линейки – 80 Вт.
Для уменьшения тепловыделения Nehalem имеет даже специальный встроенный микроконтроллер Power Control Unit, который следит за температурой и использованием электропитания ядрами. Отдельные ядра могут быть отключены полностью, при этом потребление им электропитания будет близко к нулю. Естественно, имеются средства автоматического понижения частоты при более низкой нагрузке и другие известные ранее средства. В HPC-приложениях эти возможности обычно не используются и отключаются на уровне операционной системы, чтобы не понижать производительность. А в BIOS лучше отключить возможность понижения энергопотребления QPI путем перехода в состояния L0s и L1.
В Nehalem реализована и противоположная возможность – если процессор при работе не перегревается, возможно временное повышение частоты отдельных ядер выше официально декларированной (так называемый «турборежим»).
Для двухпроцессорных систем Intel предлагает набор микросхем i5520 (Tylersburg), чья основная задача – поддержка каналов PCI-E v.2.0 (более старые устройства поддерживаются традиционными микросхемами ICH9/10). В типичной конструкции одна микросхема 5520 подсоединяется к двум каналам QPI, по одному на процессор, однако при необходимости достижения высокой производительности ввода/вывода к каждому процессору может подсоединяться своя микросхема 5520 [6].
Тестирование производительности
Уже из данных табл. 1 видно значительное превосходство Nehalem над конкурентами по производительности для разных типов рабочей нагрузки1.
Похоже, в последнее время AMD больше уделяет внимание показателю «производительность в расчете на ватт». Однако на тестах SPECpower_ssj2008 X5570/2,93 ГГц на восьми ядрах показал результат 1877 SSJ-операций на ватт, а Opteron 2377 EE/2,3 ГГц – 1379.
Имеются многочисленные данные, показывающие лидерство Nehalem в приложениях – как настольных, так и серверных. Из области ERP/OLTP можно упомянуть, например, тесты SAP SD (двухуровневые), Oracle Charbench, Dell DVD Store и др. , показывающие преимущество Opteron над Shanghai. Большие преимущества в производительности были показаны, кажется, для большинства известных программных комплексов в области HPC – для Fluent 6 (СFD), LS-Dyna (моделирование столкновений автомобилей), Schlumberger Eclipse (для задач нефтедобычи) и др., а также Linpack HPC [6]. Однако cреди задач молекулярного моделирования данные для Nehalem нам известны только для программного комплекса VASP. Ниже в статье приведены некоторые полученные автором результаты для наиболее развитого коммерческого комплекса программ Gaussian2.
Наши измерения производительности выполнены на сервере с двумя Xeon 5520 (измеренная частота 2,26 ГГц) с серверной платой Supermicro X8DTI и памятью DDR3-1066 (по одному модулю DIMM/2Гбайт на каждый из шести каналов). Использовались компиляторы gcc/gfortran –4.3.3, Intel Fortran Professional 11.0.038 и библиотека MKL из его состава, которые работали под управлением последней версии 64-разрядной операционной системы OpenSuSE Linux 11.1 с ядром 2.6.27. Использовалась та же методика тестирования, что и в наших тестах Opteron Barcelona.
В процессе тестирования была обнаружена ошибка ядер OpenSuSE 11 при работе с Nehalem из-за неверного определения размеров таблицы SRAT (в ней описывается конфигурация процессоров и присоединенной к ним памяти). Эта ошибка найдена и в ряде других дистрибутивов Linux и проявляется в виде неверного содержимого каталога /sys/devices/system/node. В результате неправильно работают средства NUMA-распределения оперативной памяти и процессоров. Полученные от разработчиков OpenSuSE заплаты позволили исправить проблему, но это произошло уже при подготовке статьи к печати.
Следствием данной ошибки является понижение производительности на (в первую очередь распараллеленных) тестах, где производительность лимитируется интенсивной работой с оперативной памятью. К ним относятся, в частности, распараллеленные в OpenMP тесты stream, измеряющие пропускную способность памяти. В табл. 3 результаты для stream приведены с исправленным ядром.
Было найдено, что пропускная способность памяти в Nehalem выше, чем у Opteron, даже в случае, когда используются модули DDR, имеющей одинаковую пропускную способность. Кроме того, обеспечивается существенное масштабирование пропускной способности памяти с числом ядер в процессоре и нитей OpenMP – до 27-28 Гбайт/с c DDR3-1066 на восьми ядрах и восьми нитях (до 37-39 Гбайт/с – для DDR3-1333). Для перехода от одного к двум ядрам масштабирование идеально, а при переходе от четырех к восьми ядрам пропускная способность памяти изменяется лишь немного – очевидно, из-за конкуренции по доступу нитей в оперативную память.
В табл. 4 представлены результаты наших измерений для микротестов Linpack и умножения матриц с плавающей запятой с двойной точностью (dgemm). Эти результаты интересно сопоставить с полученными для процессора Barcelona. Достигаемый процент от пиковой производительности для последовательных тестов выше в Nehalem. Если нормировать производительность Linpack на единицу тактовой частоты, то Nehalem оказывается эффективнее, чем Barcelona. Однако ускорение при распараллеливании Linpack (n=1000) для Opteron 2350 было выше. Падение эффективности распараллеливания на восьми ядрах в этих тестах было зафиксировано и для Opteron (на MKL и acml).
В табл. 5 приведены достигнутые нами ускорения при распараллеливании различных методов квантовой химии (CIS, MP2 и DFT) в Gaussian с совместным применением средств распраллеливания OpenMP и Linda. Время расчета оказалось меньше, чем в Opteron 2350 (кроме метода DFT, что можно объяснить оптимизацией кода под одноядерные модели Opteron), и получено хорошее масштабирование производительности, близкое к данным для Opteron.
Литература
-
H.O. Bugge, An evaluation of Intel’s Core i7 architecture using a comparative approach. Comp. Sci. - Research&Development, Vol. 23, No. 3-4 (2009), p. 203-209.
-
F. Abi-Chahla, Intel Core i7 (Nehalem): Architecture By AMD? www.tomshardware.com.
-
Intel 64 and IA-32 Architectures Optimization Reference Manual. Order Number: 248966-018, Intel Corp., March 2009.
-
R. Singhal, Inside Intel Next Generation Nehalem Microarchitecture. Intel Corp., IDF, 2008.
-
J.D. Gelas, Everything you need to know about Intel’s new architceture. www.anandtech.com.
-
D. Kanter, The Common System Interface: Intel’s Future Interconnect. 2007, www.realworldtech.com/page.cfm?ArticleID=RWT082807020032&p=5.
-
D. Kanter, Inside Nehalem: Intel’s Future Processor and System, www.realworldtech.com.
-
Nehalem and Memory Configurations., http://www.delltechcenter.com/page/04-08-2009+-+Nehalem+and+Memory+Configurations
-
M.J. Frisch, G.W. Trucks et al. Gaussian-03, Revision C.02. Gaussian, Inc., Wallingford CT, 2004.
Михаил Кузьминский (kus@free.net) – старший научный сотрудник учреждения РАН «Институт органической химии им. Н.Д. Зелинского» (Москва).
Таблица 1. Некоторые результаты тестов SPEC (пиковые/базовые значения)
Таблица 2. Иерархия кэш-памяти в Nehalem
Таблица 3. Некоторые результаты на тестах STREAM, Мбайт/с
Таблица 4. Производительность на микротестах Linpack и dgemm
Таблица 5. Ускорение при распараллеливании на Gaussian-03 с E5520/Nehalem
Четырехъядерные процессоры Barcelona
Все универсальные высокопроизводительные серверные микропроцессоры имеют ряд общих черт -- не стал исключением и четырехъядерный процессор AMD Opteron 2350 (Barcelona).
http://www.osp.ru/os/2008/09/5714215
1 Возможность применения автоматического распараллеливания компилятором для последовательных кодов, допускаемая тестами SPECcpu2006, с точки зрения автора, неестественна и делает результаты сопоставления разных процессоров не совсем четкими, однако преимущество Intel все равно очевидно. – Прим. автора.
2 Нами использована двоичная версия, оптимизированная несколько лет назад для одноядерных процессоров Opteron [10]. – Прим. автора.