Введение
Два года назад Intel сорвала большой куш, выведя на рынок архитектуру Conroe, которая нашла применение в процессорах Core 2 Duo и Core 2 Quad. Благодаря данному решению компания вернула корону производительности после небольшой потери доверия из-за спорного дизайна Pentium 4 “Prescott”. В то же время Intel объявила весьма амбициозные планы развивать архитектуру своих процессоров ударными темпами, как это происходило в середине 1990-х. Первая фаза плана предусматривала выпуск обновления архитектуры через 12 месяцев после объявления, чтобы получить преимущество от нового техпроцесса. Это и было сделано с выпуском Penryn. А полностью новая архитектура должна была появиться через 24 месяца с кодовым названием Nehalem. Эта архитектура и стала темой данной статьи.
Нажмите на картинку для увеличения.
Архитектура Conroe обеспечивала превосходную производительность и весьма разумное энергопотребление, но она не была идеальна. Собственно, условия, в которых разрабатывалась эта архитектура, тоже не были идеальными. Когда Intel поняла, что процессор Pentium 4 зашёл в тупик, компании пришлось изобретать новую архитектуру в великой спешке – а это не так легко для такой крупной компании, как Intel. Команде инженеров в Хайфе (Израиль), которая до этого отвечала за мобильные архитектуры, была внезапно навязана разработка дизайна для всей новой линейки процессоров Intel. Задача для команды оказалась не такой лёгкой, поскольку именно ей пришлось отвечать за будущее Intel. Учитывая эти условия, с жёсткими временными рамками и давлением, результат, который выдали инженеры Intel, просто великолепен. Но эта ситуация также объясняет, почему команде пришлось пойти на некоторые компромиссы.
Хотя перед нами была серьёзная переработка Pentium M, архитектура Conroe всё же в какой-то степени предала свою мобильную основу. С одной стороны, архитектура не была достаточно модульной. Ей было необходимо закрыть всю линейку процессоров Intel, от ноутбуков до серверов. Но на практике в каждом случае мы получали практически идентичный чип; разница была только в размере памяти L2. Архитектура была явно разработана для двуядерных процессоров, и переход на четырёхъядерные CPU потребовал такой же трюк, какой Intel сделала для первых двуядерных CPU – два кристалла в одной упаковке. Наличие FSB повредило разработке конфигураций с несколькими процессорами, поскольку она оставалась “узким местом” по доступу к памяти. Наконец, маленький подарок: одна из новых функций, введённых в архитектуре Conroe, а именно слияние макроопераций, позволяющая соединять две инструкции x86 в одну, не работала в 64-битном режиме, стандартном режиме для серверов.
Эти компромиссы были понятны два года назад, но сегодня Intel уже не может их оправдать – особенно перед лицом конкуренции со стороны AMD и процессоров Opteron, которые до сих пор весьма привлекательны для корпоративных окружений. С Nehalem Intel было необходимо устранить свои слабые места, разработав модульную архитектуру, которая может адаптироваться для нужд всех трёх основных рынков: мобильного, настольного и серверного.
Nehalem: обзор
Честно говоря, сложно делать обзор архитектуры, подобной Nehalem, которая изначально была разработана модульной. Инженеры Intel хотели создать набор базовых “кирпичей, которые можно собирать как блоки конструктора Lego, чтобы создавать разные версии архитектуры.
Нажмите на картинку для увеличения.
Впрочем, в то же время вполне реально рассмотреть флагмана новой архитектуры – high-end версию, которая будет использоваться в серверах и производительных рабочих станциях. На первый взгляд, спецификации очень напоминают архитектуру Barcelona (K10) от AMD. То есть перед нами “родной” четырёхъядерный процессор, который использует три уровня кэш-памяти, встроенный контроллер памяти, а также высокопроизводительную систему интерфейсов “точка-точка” для связи с периферией и другими CPU в многопроцессорной конфигурации. Это доказывает, что технологические решения AMD были не такими плохими, но пострадали из-за технической реализации, которая не была достаточно хорошо адаптирована для текущего дизайна.
Нажмите на картинку для увеличения.
Но Intel не только обновила свою архитектуру, взяв у конкурента интересные инновации. С бюджетом более 700 млн. транзисторов (731 млн., если быть точным), инженеры смогли серьёзно улучшить основные характеристики исполнительного ядра, добавив в то же время новую функциональность. Например, поддержка многопоточности (simultaneous multi-threading, SMT), которая впервые появилась в Pentium 4 “Northwood” под названием Hyper-Threading, вновь вернулась. Поскольку физических ядер на кристалле четыре, некоторые версии Nehalem, которые используют два ядра в одной упаковке, смогут выполнять до 16 потоков одновременно. Изменения на первый взгляд кажутся простыми, но, как мы увидим позже, они привели к серьёзным переменам на разных уровнях конвейера; многие буферы пришлось изменить, чтобы данный режим не влиял на производительность. Как уже случалось с каждой последней архитектурой на протяжении последних лет, Intel добавила к Nehalem новые инструкции SSE. Архитектура поддерживает набор SSE 4.2, некоторые компоненты которого были, как может показаться, взяты из микроархитектуры AMD K10.
Теперь, когда вы знаете ключевые особенности новой архитектуры, настало время рассмотреть её более детально, начиная с первых ступеней конвейера – часть, которая отвечает за считывание инструкций из памяти и подготовку их для выполнения.
Нажмите на картинку для увеличения.
Считывание и декодирование инструкций
В отличие от перемен, которые произошли при переходе от микроархитектур с Core на Core 2, Intel не очень сильно переделала переднюю часть конвейера Nehalem. Здесь есть те же самые четыре блока декодирования, которые появились вместе с Conroe – три простых и один сложный. По-прежнему поддерживается функция слияния макроопераций (macro-ops fusion), обеспечивается теоретическая максимальная пропускная способность 4+1 инструкций x86 за такт.
Нажмите на картинку для увеличения.
На первый взгляд никаких революционных изменений не произошло, однако нужно обратить внимание на детали. Как мы уже не раз упоминали, повышение числа исполнительных блоков – очень неэффективный способ поднять производительность. Накладные расходы при этом очень велики, а прирост всё больше срезается с каждым добавлением. Поэтому вместо добавления новых блоков декодирования, инженеры сконцентрировали своё внимание на оптимизации существующих.
Начнём с того, что была добавлена поддержка слияния макроопераций (macro-ops fusion) для 64-битного режима, что вполне оправданно для архитектуры, подобной Nehalem, и не скрывает амбиций по проникновению на серверный сегмент рынка. Но инженеры на этом не остановились. Если архитектура Conroe могла выполнять слияние только весьма ограниченного набора инструкций, архитектура Nehalem поддерживает большее число вариантов, то есть слияние макроопераций может выполняться чаще.
Ещё одна новая функция, представленная с Conroe, тоже была улучшена: Loop Stream Detector. За этим названием скрывается буфер, содержащий несколько инструкций (18 инструкций x86 в архитектуре Core 2). Когда процессор определяет цикл, он отключает некоторые части конвейера. Поскольку цикл подразумевает выполнение одинаковых инструкций указанное число раз, вряд ли имеет смысл выполнять предсказание ветвлений или забирать инструкции из кэша L1 при каждой итерации цикла. Поэтому Loop Stream Detector работает как небольшая кэш-память, которая “замыкает” первые ступени конвейера в подобных ситуациях. При реализации этой техники получается двоякий прирост: снижается энергопотребление, поскольку процессор не работает над бесполезными задачами, а также увеличивается производительность путём снижения нагрузки на кэш инструкций L1.
Нажмите на картинку для увеличения.
С архитектурой Nehalem Intel улучшила функциональность Loop Stream Detector. Начнём с того, что буфер был увеличен – теперь он вмещает 28 инструкций. Но, более того, изменилось его расположение в конвейере. В Conroe буфер располагался как раз за ступенью выборки инструкций (instruction fetch). Теперь же буфер находится после ступени декодирования; такое расположение позволило отключать большую часть конвейера. В Nehalem Loop Stream Detector хранятся уже не инструкции x86, а микрооперации. В данном отношении технология чем-то напоминает концепцию кэша с отслеживаниями (trace cache) у Pentium 4. Нас не удивляет, что в Nehalem можно найти ряд инноваций, появившихся с архитектурой NetBurst, поскольку команда в Хиллсборо (Hillsboro), отвечающая за Nehalem, занималась и проектом Pentium 4. Однако если Pentium 4 использовал кэш с отслеживаниями эксклюзивно, поскольку он мог рассчитывать только на один декодер в случае промаха кэша, Nehalem выигрывает от мощи четырёх декодеров, хотя Loop Stream Detector можно назвать только дополнительной оптимизацией для некоторых ситуаций. В любом случае, перед нами лучшее из обоих миров.
Предсказание ветвлений
Последнее улучшение в передней части конвейера касается предсказания ветвлений. Эффективность алгоритмов предсказания ветвлений критична для архитектур, где используется высокий уровень параллелизма инструкций. Ветвления разрывают параллелизм, поскольку необходимо ждать результат предыдущей инструкции, прежде чем продолжить выполнение потока инструкций. Предсказание ветвлений прогнозирует, будет взята ветвь или нет, и если ветвь будет взята, то быстро вычисляет дальнейший адрес для продолжения выполнения. Для этого не требуется каких-либо сложных техник; всё что нужно – массив ветвлений, так называемый Branch Target Buffer (BTB), который сохраняет результаты ветвлений по мере продолжения выполнения кода (взята ветвь или нет, а также целевой адрес). К массиву прилагается алгоритм определения результата следующего ветвления.
Intel не обеспечила деталей по поводу алгоритма, используемого в новых блоках предсказания ветвлений, но широко известно, что теперь есть два уровня предсказаний. Первый уровень не изменился с архитектуры Conroe, но был добавлен новый уровень с медленным доступом, который позволяет хранить большую историю ветвлений. По информации Intel, эта конфигурация улучшает предсказание ветвлений в некоторых приложениях, которые используют массивные участки кода, таких как базы данных – ещё одно свидетельство ориентации Nehalem на серверы. Другое улучшение касается Return Stack Buffer, который хранит адрес возврата функций, когда они вызываются. В некоторых случаях этот буфер может переполняться, что приводит к ошибочным предсказаниям. Чтобы ограничить такую возможность, AMD увеличила его размер до 24 записей, а в Intel Nehalem появилась система переименования для этого буфера.
Возвращение Hyper-Threading
Итак, первые ступени конвейера были не очень сильно изменены. То же самое касается и замыкающих ступеней. Здесь используются такие же исполнительные блоки, что и в самых последних процессорах Core, но, опять же, инженеры вновь поработали над их более эффективным использованием.
Нажмите на картинку для увеличения.
С Nehalem вернулась технология Hyper-Threading. Впервые она появилась в версии Northwood архитектуры Intel NetBurst. Технология Hyper-Threading, в миру вне-Intel известная как Simultaneous Multi-Threading (SMT), позволяет использовать параллелизм на уровне потоков, чтобы оптимизировать нагрузку исполнительных блоков ядра, в результате чего на уровне приложений одно физическое ядро превращается в два виртуальных.
Чтобы поддерживать параллельное выполнение потоков, некоторые ресурсы, такие как регистры, должны быть продублированы. Другие ресурсы можно совместно использовать двумя потоками, сюда входит вся логика внеочередного выполнения (буфер изменения порядка инструкций/instruction reorder buffer, исполнительные блоки и кэш). Внедрение SMT было обусловлено простым наблюдением: чем “шире” (больше исполнительных блоков) и “глубже” (больше ступеней конвейера) становятся процессоры, тем сложнее получать достаточную степень параллелизма для загрузки исполнительных блоков на каждом такте. Если Pentium 4 был очень “глубоким”, конвейер превысил 20 ступеней, у Nehalem он очень “широкий”. У процессора доступно шесть исполнительных блоков, которые способны одновременно выполнять три операции работы с памятью и три операции вычисления. Если движок выполнения не сможет обеспечить параллелизм инструкций на должном уровне, с загрузкой всех блоков, в конвейере появляются так называемые “пузырьки” – холостые такты.
Чтобы преодолеть эту проблему, SMT пытается обеспечить параллелизм инструкций из двух потоков, а не из одного, с целью максимально уменьшить число холостых тактов. Этот подход оказывается очень эффективным, когда два потока связаны с заданиями разной природы. С другой стороны, если два потока выполняют, например, интенсивные вычисления, это лишь увеличит нагрузку на те же самые вычислительные блоки, которые будут бороться между собой за доступ к кэшу. Вряд ли стоит лишний раз говорить, что SMT в данной ситуации имеет мало интереса и может даже негативно повлиять на производительность.
Реализация SMT
Впрочем, в большинстве ситуаций влияние SMT на производительность положительное, а себестоимость технологии по ресурсам невысокая, что и объясняет её возвращение. Но программистам следует быть внимательными, поскольку в случае Nehalem не все потоки создаются одинаковыми. Чтобы помочь в нелёгком деле, Intel обеспечивает способ точно определить топологию процессора (число физических и логических процессоров), а программисты могут использовать механизм привязки ОС (affinity), позволяющий привязать поток к виртуальному ядру. Подобное решение вряд ли застанет врасплох игровых разработчиков, поскольку очень схоже осуществляется программирование под процессор Xenon (используется в Xbox 360). Но, в отличие от приставок, где у программистов есть доступ на очень низком уровне, на ПК присутствует планировщик потоков ОС, который способен сказать своё последнее слово.
Так как SMT сильнее нагружает внеочередной исполнительный движок, Intel увеличила размер некоторых встроенных буферов, чтобы они не превратились в “узкое место”. Так, буфер изменения порядка команд (reorder buffer), который отслеживает все выполняемые инструкции, был увеличен с 96 записей у Core 2 до 128 записей у Nehalem. На практике, поскольку буфер статически распределён, чтобы ни один из потоков не смог монополизировать все ресурсы, его размер уменьшен до 64 записей для каждого потока в SMT. Вполне понятно, что в случае выполнения одного потока обеспечивается доступ ко всем записям, то есть потенциально устранены специфические случаи, в которых Nehalem дал бы меньшую производительность, чем предшественник.
Станция резервации (reservation station), которая отвечает за привязку инструкций к разным исполнительным блокам, тоже была увеличена с 32 до 36 записей. Но, в отличие от буфера изменения порядка команд, здесь распределение уже динамическое, поэтом поток может использовать больше или меньше записей как функцию его потребностей.
Два других буфера тоже были изменены: буфер загрузки (load buffer) и буфер хранения (store buffer). Первый получил 48 записей против 32 у Conroe, а второй – 32 вместо 20. Здесь, опять же, распределение ресурсов между потоками статическое.
Ещё одно последствие возвращения SMT: производительность инструкций синхронизации потоков была улучшена (по словам Intel).
SSE 4.2 и энергопотребление
С архитектурой Nehalem Intel не смогла устоять перед искушением расширить и так уже длинный список инструкций SSE. Nehalem поддерживает SSE 4.2, то есть все инструкции, которые присутствовали у Penryn (SSE4.1) плюс ещё семь. Большинство инструкций связаны с обработкой строк символов, и одно из предназначений, по словам Intel, заключается в ускорении обработки XML-файлов.
Две инструкции нацелены на специфические приложения; команда POPCNT, появившаяся в Barcelona, используется для подсчёта числа ненулевых битов в регистре. По информации Intel, эта инструкция очень полезна в приложениях распознавания голоса и секвенирования ДНК. Последняя инструкция, CRC32, используется для ускорения расчёта кода обнаружения ошибок.
Энергопотребление под контролем
Вновь и вновь Intel говорит, что для всех потенциальных инноваций в одной из новых архитектур, инженеры взвешивали увеличение производительности с изменением энергопотребления – они хорошо выучили уроки по Pentium 4. С архитектурой Nehalem инженеры пошли ещё дальше с развитием технологий ограничения энергопотребления. Теперь у процессора есть собственный микроконтроллер Power Control Unit, который постоянно отслеживает температуру и энергопотребление ядер, и даже может полностью их отключать, если ядра не используются. Благодаря этой технологии энергопотребление неиспользуемых ядер близко к нулю, в то время как до Nehalem были потери, связанные с токами утечки.
Нажмите на картинку для увеличения.
Intel реализовала довольно оригинальную технологию под названием режима Turbo. Если процессор работает ниже стандартного теплового пакета, например, режим Turbo повышает частоту используемых ядер, вместе с тем оставаясь в пределах теплового пакета.
Нажмите на картинку для увеличения.
Нажмите на картинку для увеличения.
Обратите внимание, что, как и в случае процессора Atom, кэши L1 и L2 у Nehalem используют по восемь транзисторов на ячейку вместо привычных шести, что снижает энергопотребление за счёт несколько большей площади кристалла.
Соединения QuickPath
Хотя архитектура Core была очень эффективной, некоторые детали дизайна начали показывать свой возраст, и первой среди них является шина Front Side Bus (FSB). Эта шина, соединяющая процессор с северным мостом, была очевидным анахронизмом в остальном современной архитектуры. Самые главные недостатки были более всего заметны в многопроцессорных конфигурациях, когда архитектура с трудом справлялась с увеличением нагрузок. Процессорам приходилось совместно использовать эту шину не только для доступа в память, но и для обеспечения когерентности данных, находящихся в соответствующей кэш-памяти.
В данной ситуации поток транзакций по шине быстро приводил к насыщению. Долгое время Intel обходила эту проблему просто переходом на более скоростную шину или на большую кэш-память, но настало время исправить причину этой проблемы, полностью переработав механизм общения процессоров с памятью и другими компонентами.
Нажмите на картинку для увеличения.
Решение, выбранное Intel под названием QuickPath Interconnect (QPI), не является чем-то новым; оно представляет собой встроенный контроллер памяти и очень быструю последовательную шину “точка-точка”. Подобная технология была представлена пять лет назад в процессорах AMD, но на самом деле она ещё старше. Подобные принципы, которые заметны в продуктах AMD и теперь Intel, представляют собой результат работы, проделанной десять лет назад инженерами DEC во время разработки Alpha 21364 (EV7). Поскольку многие бывшие инженеры DEC перешли в компанию из Санта-Клары, неудивительно, что подобные принципы выплыли в последней архитектуре Intel.
С технической точки зрения интерфейс QPI является двунаправленным с двумя 20-битными шинами, по одной на каждое направление, из которых 16 зарезервировано под данные, а оставшиеся четыре – под функции исправления ошибок или служебную информацию протокола. Это даёт максимальную скорость 6,4 GT/s (млрд. передач в секунду) или полезную пропускную способность 12,8 Гбайт/с, как на чтение, так и на передачу. Для сравнения, FSB на самых современных процессорах Intel работает с максимальной тактовой частотой 400 МГц, при этом для передачи адресов требуется два такта (200 MT/s), а данные передаются в режиме QDR, с пропускной способностью 1,6 GT/s. При 64-битной ширине FSB даёт суммарную пропускную способность 12,8 Гбайт/с, но она доступна только для чтения или записи.
Поэтому интерфейс QPI даёт пропускную способность вплоть до двух раз выше, если запись и чтение сбалансированы должным образом. В теоретической ситуации, когда есть только операции чтения или записи, пропускная способность будет идентична FSB. Но следует помнить, что шина FSB использовалась как для доступа к памяти, так и для передачи всех данных на периферию или между процессорами. В случае Nehalem, интерфейс QPI исключительно предназначается для передачи данных на периферию, а за работу с памятью отвечает интегрированный в процессор контроллер. Связь между несколькими CPU в многосокетной конфигурации осуществляется ещё одним интерфейсом QPI. Даже в самой тяжёлой ситуации QPI должен показать лучшую производительность, чем FSB.
Как мы видим, Nehalem был разработан с учётом гибкой и масштабируемой архитектуры, поэтому число доступных интерфейсов QPI меняется в зависимости от ориентации на тот или иной сегмент рынка – от одного интерфейса для связи с чипсетом в односокетных конфигурациях до целых четырёх для четырёхсокетных серверов. Это позволяет создавать полносвязные четырёхпроцессорные системы, когда каждый процессор может получать доступ к любой области памяти через один хоп QPI, поскольку каждый процессор напрямую подключён к трём остальным.
Встроенный контроллер памяти
Кажется, что Intel в этом отношении догоняет AMD. Но, как часто бывает, когда гигант что-то делает, то и шаг вперёд получается гигантским. Если у Barcelona используется два 64-битных контроллера памяти DDR2, топовая конфигурация Intel включает целых три контроллера памяти DDR3. Если установить память DDR3-1333, которую Nehalem тоже будет поддерживать, это даст пропускную способность до 32 Гбайт/с в некоторых конфигурациях. Но преимущество встроенного контроллера памяти кроется не только в пропускной способности. Он существенно снижает задержки доступа к памяти, что не менее важно, учитывая, что каждый доступ стоит несколько сотен тактов. В контексте настольного использования снижение задержек встроенного контроллера памяти можно приветствовать, однако полное преимущество от более масштабируемой архитектуры будет заметно в многосокетных серверных конфигурациях. Раньше при добавлении CPU доступная пропускная способность оставалась прежней, однако теперь каждый новый дополнительный процессор увеличивает пропускную способность, поскольку каждый CPU обладает собственной памятью.
Нажмите на картинку для увеличения.
Конечно, чудес ожидать не следует. Перед нами конфигурация Non Uniform Memory Access (NUMA), то есть доступ к памяти будет обходиться по тем или иным накладным расценкам, в зависимости от того, где данные располагаются в памяти. Понятно, что доступ к локальной памяти будет производиться с самыми низкими задержками и самой высокой пропускной способностью, поскольку доступ к удалённой памяти происходит через промежуточный интерфейс QPI, снижающий производительность.
Нажмите на картинку для увеличения.
Влияние на производительность предсказать сложно, поскольку всё зависит от приложения и операционной системы. Intel утверждает, что падение производительности при удалённом доступе по задержкам составляет около 70%, а пропускная способность снижается в два раза по сравнению с локальным доступом. По информации Intel, даже при удалённом доступе через интерфейс QPI, задержки будут ниже, чем на предыдущих поколениях процессоров, где контроллер находился на северном мосту. Однако это касается только серверных приложений, которые уже довольно долгое время разрабатываются с учётом конфигураций NUMA.
Трёхуровневая иерархия кэша
Иерархия памяти в Conroe была очень простой; Intel сконцентрировалась на производительности общего кэша L2, который стал лучшим решением для архитектуры, которая нацеливалась, главным образом, на двуядерные конфигурации. Но в случае с Nehalem инженеры начали с нуля и пришли к такому же заключению, что и конкуренты: общий кэш L2 не очень хорошо подходит для “родной” четырёхъядерной архитектуры. Разные ядра могут слишком часто “вымывать” данные, необходимые другим ядрам, что приведёт к слишком многим проблемам с внутренними шинами и арбитражем, пытаясь обеспечить все четыре ядра достаточной пропускной способностью с сохранением задержек на достаточно низком уровне. Чтобы решить эти проблемы, инженеры оснастили каждое ядро собственным кэшем L2. Поскольку он выделен на каждое ядро и относительно мал (256 кбайт), получилось обеспечить кэш очень высокой производительностью; в частности, задержки существенно улучшились по сравнению с Penryn – с 15 тактов до, примерно, 10 тактов.
Затем есть огромная кэш-память третьего уровня (8 Мбайт), отвечающая за связь между ядрами. На первый взгляд архитектура кэша Nehalem напоминает Barcelona, но работа кэша третьего уровня очень отличается от AMD – она инклюзивная для всех нижних уровней иерархии кэша. Это означает, что если ядро попытается получить доступ к данным, и они отсутствуют в кэше L3, то нет необходимости искать данные в собственных кэшах других ядер – там их нет. Напротив, если данные присутствуют, четыре бита, связанные с каждой строчкой кэш-памяти (один бит на ядро) показывают, могут ли данные потенциально присутствовать (потенциально, но без гарантии) в нижнем кэше другого ядра, и если да, то в каком.
Эта техника весьма эффективна для обеспечения когерентности персональных кэшей каждого ядра, поскольку она уменьшает потребность в обмене информацией между ядрами. Есть, конечно, недостаток в виде потери части кэш-памяти на данные, присутствующие в кэшах других уровней. Впрочем, не всё так страшно, поскольку кэши L1 и L2 относительно маленькие по сравнению с кэшем L3 – все данные кэшей L1 и L2 занимают, максимум, 1,25 Мбайт в кэше L3 из доступных 8 Мбайт. Как и в случае Barcelona, кэш третьего уровня работает на других частотах по сравнению с самим чипом. Следовательно, задержка доступа на данном уровне может меняться, но она должна составлять около 40 тактов.
Единственные разочарования в новой иерархии кэша Nehalem связаны с кэшем L1. Пропускная способность кэша инструкций не была увеличена – по-прежнему 16 байт на такт по сравнению с 32 у Barcelona. Это может создать “узкое место” в серверно-ориентированной архитектуре, поскольку 64-битные инструкции крупнее, чем 32-битные, тем более что у Nehalem на один декодер больше, чем у Barcelona, что сильнее нагружает кэш. Что касается кэша данных, его задержка была увеличена до четырёх тактов по сравнению с тремя у Conroe, облегчая работу на высоких тактовых частотах. Но закончим мы на положительной новости: инженеры Intel увеличили число промахов кэша данных L1, которые архитектура может обрабатывать параллельно.
TLB
Уже многие годы процессоры работают не с физическими адресами памяти, а с виртуальными. Среди других преимуществ такой подход позволяет выделять программе больше памяти, чем есть в компьютере, сохраняя только необходимые на данный момент данные в физической памяти, а всё остальное – на жёстком диске. Это означает, что каждый доступ к памяти виртуальный адрес нужно переводить в физический адрес, и для сохранения соответствия приходится использовать огромную таблицу. Проблема в том, что эта таблица получается столь большой, что на чипе её хранить уже не получается – она размещается в основной памяти, причём её можно даже сбрасывать на жёсткий диск (часть таблицы может отсутствовать в памяти, будучи сброшенной на HDD).
Если для каждой операции работы с памятью требовался бы такой этап перевода адресов, то всё работало бы слишком медленно. Поэтому инженеры вернулись к принципу физической адресации, добавив небольшую кэш-память напрямую на процессор, которая хранит соответствие для нескольких недавно запрошенных адресов. Кэш-память называется Translation Lookaside Buffer (TLB). Intel полностью переделала TLB в новой архитектуре. До сих пор Core 2 использовал TLB первого уровня очень маленького размера (16 записей), но очень быстрый и только для загрузок, а также больший кэш TLB второго уровня (256 записей), который отвечал за загрузки, отсутствующие в TLB L1, а также и записи.
Nehalem теперь оснастился полноценным двухуровневым TLB: кэш TLB первого уровня разделён для данных и инструкций. Кэш TLB L1 для данных может хранить 64 записи для маленьких страниц (4K) или 32 записи для больших страниц (2M/4M), а кэш TLB L1 для инструкций может хранить 128 записей для маленьких страниц (как и в случае Core2), а также семь для крупных. Второй уровень состоит из унифицированного кэша, который может хранить до 512 записей и работает только с маленькими страницами. Цель такого улучшения заключается в увеличении производительности приложений, которые используют большие массивы данных. Как и в случае двухуровневой системы предсказания ветвлений, перед нами ещё одно свидетельство серверной ориентации архитектуры.
Давайте на время вернёмся к SMT, поскольку эта технология тоже влияет на TLB. Кэш L1 TLB для данных и TLB L2 динамически распределяются между двумя потоками. Напротив, кэш L1 TLB для инструкций статически распределяется для малых страниц, а выделенный для больших страниц полностью копируется – это вполне понятно, учитывая его малый размер (семь записей на поток).
Доступ к памяти и предварительная выборка
Оптимизированный невыровненный доступ к памяти (Unaligned Memory Access)
В архитектуре Core доступ к памяти приводил к ряду ограничений по производительности. Процессор был оптимизирован для доступа к адресам памяти, выровненным по 64-байтным границам, то есть по размеру одной строчки кэша. Для невыровненных данных доступ был не только медленный, но и выполнение невыровненных инструкций считывания или записи было более накладным, чем в случае выровненных инструкций, независимо от реального выравнивания данных памяти. Причина заключалось в том, что эти инструкции приводили к генерации нескольких микроопераций на декодерах, что снижало пропускную способность с данными типами инструкций. В итоге компиляторы избегали генерировать инструкции подобного типа, подставляя вместо них последовательность инструкций, которые менее накладны.
Так, чтение из памяти, при котором происходил перехлёст двух строчек кэша, замедлялось примерно на 12 тактов, по сравнению с 10 тактами для записи. Инженеры Intel оптимизировали подобный тип обращений, чтобы он выполнялся быстрее. Начнём с того, что теперь нет падения производительности при использовании невыровненных инструкций чтения/записи в случаях, когда данные выровнены в памяти. В других случаях Intel тоже оптимизировала доступ, снизив падение производительности по сравнению с архитектурой Core.
Больше блоков предварительной выборки с более эффективной работой
В архитектуре Conroe Intel особенно гордилась аппаратными блоками предсказания. Как вы знаете, блок предсказания – это механизм, который следит за характером доступа к памяти и пытается предсказать, какие данные потребуются через несколько тактов. Цель заключается в том, чтобы упреждающим образом загрузить данные в кэш, где они будут располагаться ближе к процессору, и вместе с тем максимально использовать доступную пропускную способность тогда, когда процессору она не нужна.
Данная технология даёт замечательные результаты с большинством настольных приложений, но в серверной среде она часто приводила к потере производительности. Есть несколько причин подобной неэффективности. Во-первых, доступы к памяти часто сложнее предсказать в серверных приложениях. Доступ к базе данных, например, отнюдь не линейный – если в памяти запрашивается какой-либо элемент данных, то это не значит, что следующим будет соседний элемент. Это ограничивает эффективность блока предварительной выборки. Но основной проблемой была пропускная способность памяти в многосокетных конфигурациях. Как мы уже говорили раньше, она уже была “узким местом” для нескольких процессоров, но, помимо этого, блоки предварительной выборки приводили к дополнительной нагрузке на этом уровне. Если микропроцессор не выполняет доступ к памяти, то включались блоки предварительной выборки, пытаясь использовать пропускную способность, по их предположению, свободную. Однако блоки не могли знать, нужна ли эта пропускная способность другому процессору. Это означало, что блоки предварительной выборки могли “отбирать” у процессора пропускную способность, которая и так была “узким местом” в таких конфигурациях. Чтобы решить эту проблему, Intel не нашла ничего лучше, как отключить блоки предварительной выборки в таких ситуациях – вряд ли самое оптимальное решение.
Как утверждает Intel, эта проблема уже решена, однако компания не даёт никаких деталей по поводу работы новых механизмов предварительной выборки. Всё, что компания говорит: теперь не нужно отключать блоки для серверных конфигураций. Впрочем, даже Intel ничего не изменила, преимущества от новой организации памяти и, вследствие этого, большая пропускная способность должны нивелировать негативное влияние блоков предварительной выборки.
Заключение
Conroe стал серьёзным фундаментом для новых процессоров, и Nehalem построен как раз на нём. Здесь используется такая же эффективная архитектура, но теперь она намного более модульная и масштабируемая, что должно гарантировать успех в разных рыночных сегментах. Мы не говорим о том, что Nehalem революционизировал архитектуру Core, но новый процессор революционизировал платформу Intel, которая теперь стала достойным соответствием для AMD по дизайну, а по реализации Intel успешно обошла конкурента.
Нажмите на картинку для увеличения.
Со всеми улучшениями, сделанными на данном этапе (интегрированный контроллер памяти, QPI), неудивительно видеть, что изменения исполнительного ядра не такие значительные. Но возвращение Hyper-Threading можно считать серьёзной новостью, да и ряд небольших оптимизаций тоже должны обеспечить заметный прирост производительности по сравнению с Penryn на равных частотах.
Вполне очевидно, что самый серьёзный прирост будет в тех ситуациях, где основным “узким местом” была оперативная память. Если вы прочитали статью целиком, то наверняка заметили, что именно на эту область инженеры Intel уделили максимум внимания. Кроме добавления встроенного контроллера памяти, который, без сомнения, даст наибольший прирост касательно операций доступа к данным, есть и множество других улучшений, как крупных, так и мелких – новая архитектура кэша и TLB, невыровненный доступ к памяти и блоки предварительной выборки.
Учитывая всю теоретическую информацию, мы с нетерпением ждём, как улучшения отразятся на реальных приложениях после выхода новой архитектуры. Мы посвятим этому несколько статей, так что оставайтесь с нами!