Курсовая работа: Архитектура и производительность серверных ЦП
Сегодня центральные процессоры (ЦП) — неотъемлемая часть современной компьютерной техники, но так было не всегда. Первые «серверы» в современном понимании (мэйнфреймы) не имели ЦП как таковых. Вычислительные функции в них выполняли неспециализированные наборы системной логики (стандартные микросхемы и прочие полупроводниковые компоненты). Однако по мере развития компьютерных технологий появилась возможность создавать все более сложные микросхемы, в том числе специализированные — процессоры.
Когда появились первые персональные компьютеры и начали быстро расти их продажи (в 1970-1980-х годах), рынок серверного оборудования серьезно изменился: наметились тенденции взаимопроникновения технологий и архитектур из сегмента серверной техники в сегмент персональных компьютеров, и наоборот. Не стали исключением и ЦП: некоторые серверные модели после незначительной модернизации стали использоваться в персональных компьютерах, а ЦП, изначально разработанные для массового рынка, проникали на рынок серверов и суперкомпьютеров. Наиболее очевидная причина этого — экономический фактор: параллельная разработка двух или более процессорных архитектур может оказаться непосильной даже для довольно крупной компании, а конечная стоимость обоих решений будет значительной, что неминуемо ухудшит конкурентные возможности конечной продукции на рынке. Хотя процессорные архитектуры, ориентированные исключительно на серверы и суперкомпьютеры, до сих пор существуют, более распространены «универсальные» процессорные ядра, пригодные как для массового, так и для серверного рынка.
Общая архитектура ЦП
Функциональные устройства ЦП
Любой ЦП независимо от его предназначения располагает рядом функциональных устройств (ФУ): блоками целочисленных вычислений (Integer Execution Unit, E-box, арифметико-логическое устройство), обработки адресов (Address Translation Unit, A-box), контроллером системной шины (System Bus Controller, B-box), декодером команд (Instruction Decoding Unit, I-box). Для проведения вычислений и хранения промежуточных результатов используется так называемый файл регистров (их может быть несколько), состоящий из фиксированного количества записей определенной длины (регистров). Практически во всех современных ЦП реализованы и средства предсказания направления условных переходов. С начала 1990-х гг. общепринятой стала практика внедрения в ядро ЦП блока вещественных вычислений (Floating-Point Unit, F-box). Если дизайн определенной аппаратной платформы предполагал использование кэш-памяти с прямым доступом, то в ЦП вводился блок взаимодействия с кэш-памятью (Cache Memory Interface Unit, C-box). В современных ЦП нередко также реализованы контроллеры памяти, периферийных шин и т. д.
Набор команд ЦП
В зависимости от представления команд процессоры принято делить на RISC (Reduced Instruction Set Computing, вычисления при помощи ограниченного набора команд) и CISC (Complex Instruction Set Computing, вычисления при помощи расширенного набора команд). В настоящее время «чистокровных» представителей того или иного семейства встретить все труднее — у большинства ЦП есть черты обеих архитектур.
Архитектура RISC появилась как попытка избавиться от недостатков, присущих CISC-процессорам. В 1970-х гг. были проведены исследования, которые показали, что около 20% всех команд CISC-процессора занимают при выполнении около 80% всего процессорного времени, а остальные 80% команд — оставшиеся 20%, т. с. налицо явный дисбаланс — некоторые команды остаются практически невостребованными. В то же время каждая дополнительная команда в наборе увеличивает стоимость ЦП, поскольку для ее выполнения в процессоре должны быть соответствующие исполнительные блоки. Возникла идея свести набор команд к минимуму, зафиксировать их длину для удобства декодирования, а непосредственный доступ к памяти (загрузку данных в регистры ЦП из памяти и копирование из регистров в память) разрешить лишь некоторым из них. Это позволило получить компактное ядро ЦП, способное работать на более высоких частотах при неизменных проектных нормах.
Естественно, что и у RISC, и у CISC есть свои достоинства. RISC обеспечивает эффективную суперскалярность (параллельность) вычислений функциональными устройствами ЦП и большее количество выполненных команд в расчете на один такт ЦП. CISC предполагает более эффективную работу ЦП при небольшом числе функциональных устройств и наличии не более чем одного конвейера в расчете на функциональное устройство (при увеличении количества конвейеров прирост производительности оказывается небольшим из-за ограничений, налагаемых декодером команд).
ЦП архитектуры х86: CISC или RISC?
Процессоры архитектуры х86 изначально имели CISC-архитектуру, но со временем стали приобретать свойства RISC. Ядра этих ЦП претерпели кардинальные изменения: они стали проектироваться во многом по принципам RISC, но в то же время для сохранения совместимости с существующим программным обеспечением снаружи в ЦП все так же поступали обычные команды CISC. Для того чтобы такая модель ЦП оказалась работоспособной, требуется обязательное внутреннее преобразование CISC-команд в одну или несколько RISC-команд, непосредственно выполняющихся ядром ЦП.
Такой подход помог улучшить суперскалярность вычислений (когда команды разного рода одновременно обрабатываются на разных конвейерах ФУ) и облегчить их конвейеризацию в целом, но не избавил архитектуру от всех недостатков, главный из которых — неудобство параллельного декодирования команд CISC, имеющих разную длину: невозможно определить начало следующей команды до завершения декодирования предыдущей.
Первым из ЦП архитектуры х86, спроектированным с RISC-ядром, стал уже забытый Nx586 компании NexGen, представленный в марте 1994 г. В ноябре 1995 г. появился Pentium Pro компании Intel, а в марте 1996-го — AMD К5, построенный на базе модернизированной фирменной архитектуры 29К.
CISC-процессоры архитектуры х86 еще некоторое время выпускались, преимущественно Intel (Pentium и Pentium MMX) и Cyrix (6x86 и 6х86МХ/6х86МП), но дни их были сочтены. В последующие годы архитектура Intel P6, в основу которой лег вышеупомянутый Pentium Pro, продолжала экстенсивно развиваться, а позже ее сменила архитектура NetBurst.
В апреле 1997 г. AMD выпустила Кб, основанный на RISC-ядре Nx686 (NexGen была поглощена AMD в начале 1996 г.), и развивала этот модельный ряд до 2000 г., невзирая на отставание в производительности от архитектуры Intel P6. В апреле 1999 г. AMD представила новый ЦП К7, получивший официальное название Athlon, и успешно продолжает развивать его архитектуру и по сей день — ядро К8 (Athlon 64, Athlon 64 FX, Opteron) представляет собой эволюционное развитие ядра К7. Подводя итоги вышесказанному, можно сделать вывод, что ЦП архитектуры х86 перестали быть CISC, но и RISC в полном понимании не стали (подобный переход не обеспечит сохранения обратной совместимости с существующим программным обеспечением), поэтому их можно классифицировать как псевдо-RISC.
Концепция VLIW
Интересная разновидность подхода RISC — концепция VLIW (Very Long Instruction Word), известная также как EPIC (Explicitly Parallel Instruction Computing, вычисления с явной параллельностью). Ее суть — эффективное распределение нагрузки методом «примитивный ЦП — умный компилятор»: ЦП располагает большим количеством конвейеров функциональных устройств, работающих параллельно, а всю работу по формированию эффективного потока команд выполняет компилятор. Соответственно, алгоритмы и блоки внеочередного выполнения (out-of-order execution) не используются совсем. Декодер ЦП производит выборку из потока «связок» команд, а планировщик направляет их в очереди на нужные функциональные устройства.
Наиболее известные представители этого подхода — процессоры Crusoe и Transmeta Efficeon, а также Intel Itanium и Itanium 2.
Кэш-память в ЦП
Статическая и динамическая память
В каждом современном ЦП предусмотрено некоторое количество статической памяти, работающей на частоте ядра. Именно статической, поскольку использование динамической памяти в этих целях представляется крайне нерациональным.
Одна ячейка статической памяти состоит из шести транзисторов и двух резисторов (для техпроцессов с проектными нормами до 0,5 мкм могли быть использованы только четыре транзистора на одну ячейку, с дополнительным слоем поликремния и с более жесткими ограничениями по максимальной тактовой частоте), в то время как аналогичная структура динамической памяти состоит из одного транзистора и одного конденсатора. Быстродействие статической памяти намного выше (емкость, используемая в динамической памяти, имеет определенную скорость зарядки до требуемого уровня, определяющую «частотный потолок»), но из-за большего количества составляющих элементов она существенно дороже в производстве и отличается более высоким энергопотреблением. Битовое значение ячейки статической памяти характеризуется состоянием затворов транзисторов, а динамической — уровнем заряда конденсатора. Так как конденсаторы имеют свойство с течением времени разряжаться, то для поддержания их состояния требуется регулярная перезарядка (для современных микросхем динамической памяти — приблизительно 15 раз в секунду). Кроме того, при операции чтения из ячейки динамической памяти конденсатор разряжается, т. е. ячейка утрачивает свой первоначальный заряд, а следовательно должна быть перезаряжена.
Очевидно, что статическая память используется там, где требуется максимальное быстродействие (регистры ЦП, кэш-память, локальная память сигнального процессора), а динамическая — там, где приоритетом является объем, а не скорость чтения-записи (оперативная память, буферы периферийных устройств).
Причины внедрения кэш-памяти
Явная необходимость в кэш-памяти при проектировании массовых ЦП проявилась в начале 1990-х гг., когда тактовые частоты ЦП значительно превысили частоты системных шин, и, в частности, шины памяти. В настоящее время частоты серверных ЦП достигают почти 4 ГГц, а оперативной памяти, массово применяемой в серверах, — только 400 МГц (200 МГц с удвоением благодаря передаче по обоим фронтам сигнала). В этой ситуации при прямом обращении к памяти функциональные устройства ЦП значительную часть времени простаивают, ожидая доставки данных. В какой-то мере проблемы быстродействия оперативной памяти могут быть решены увеличением разрядности шины памяти, но даже в серверах младшего уровня нередко встречается 8-16 гнезд для модулей памяти, поэтому такое решение усложняет дизайн системной платы. Проложить же 256- или даже 512-бит шину к расположенной внутри кристалла ЦП кэш-памяти сравнительно несложно. Таким образом, эффективной альтернативы кэш-памяти в современных высокопроизводительных системах не существует.
Иерархическая модель кэш-памяти
Как правило, кэш-память имеет многоуровневую архитектуру. Например, в компьютере с 32 Кбайт внутренней (в ядре ЦП) и 1 Мбайт внешней (в корпусе ЦП или на системной плате) кэш-памяти первая будет считаться кэш-памятью 1-го уровня (L1), а вторая — кэш-памятью 2-го уровня (L2). В современных серверных системах количество уровней кэш-памяти может доходить до четырех, хотя наиболее часто используется двух- или трехуровневая схема.
В некоторых процессорных архитектурах кэш-память 1-го уровня разделена на кэш команд (Irstruction Cache, I-cache) и кэш данных (Data Cache, D-cache), причем необязательно одинаковых размеров. С точки зрения схемотехники проще и дешевле проектировать раздельные I-cache и D-cache: выборку команд проводит 1-bох, а выборку данных — Е-box и F-box, хотя в обоих случаях задействуются А-box и С-box. Все эти блоки велики, и обеспечить им одновременный и быстрый доступ к одному кэшу проблематично. Кроме того, это неизбежно потребовало бы увеличения количества портов доступа, что также усложняет задачу проектирования.
Так как I-cache и D-cache должны обеспечивать очень низкие задержки при доступе (это справедливо для любого кэша L1), приходится жертвовать их объемом — обычно он составляет от 16 до 32 Кбайт. Ведь чем меньше размер кэша, тем легче добиться низких задержек при доступе.
Кэш-память 2-го уровня, как правило, унифицирована, т. е. может содержать как команды, так и данные. Если она встроена в ядро ЦП, то говорят о S-cache (Secondary Cache, вторичный кэш), в противном случае — о B-cache (Backup Cache, резервный кэш). В современных серверных ЦП объем S-cache составляет от одного до нескольких мегабайт, a B-cache — до 64 Мбайт. Если дизайн ЦП предусматривает наличие встроенной кэш-памяти 3-го уровня, то ее именуют T-cache (Ternary Cache, третичный кэш). Как правило, каждый последующий уровень кэш-памяти медленнее, но больше предыдущего по объему. Если в системе присутствует B-cache (как последний уровень модели кэш-памяти), то он может контролироваться как ЦП, так и набором системной логики.
Если в момент выполнения некоторой команды в регистрах не окажется данных для нее, то они будут затребованы из ближайшего уровня кэш-памяти, т. е. из D-cache. В случае их отсутствия в D-Cache запрос направляется в S-cache и т. д. В худшем случае данные будут доставлены непосредственно из памяти. Впрочем, возможен и еще более печальный вариант, когда подсистема управления виртуальной памятью операционной системы (ОС) успевает вытеснить их в файл подкачки на жесткий диск. В случае доставки из оперативной памяти потери времени на получение нужных данных могут составлять от десятков до сотен тактов ЦП, а в случае нахождения данных на жестком диске речь уже может идти о миллионах тактов.
Ассоциативность кэш-памяти
Одна из фундаментальных характеристик кэш-памяти — уровень ассоциативности — отображает ее логическую сегментацию. Дело в том, что последовательный перебор всех строк кэша в поисках необходимых данных потребовал бы десятков тактов и свел бы на нет весь выигрыш от использования встроенной в ЦП памяти. Поэтому ячейки ОЗУ жестко привязываются к строкам кэш-памяти (в каждой строке могут быть данные из фиксированного набора адресов), что значительно сокращает время поиска. С каждой ячейкой ОЗУ может быть связано более одной строки кэш-памяти: например, n-канальная ассоциативность (n-way set associative) обозначает, что информация по некоторому адресу оперативной памяти может храниться в n мест кэш-памяти.
Выбор места может проводиться по различным алгоритмам, среди которых чаще всего используются принципы замещения LRU (Least Recently Used, замещается запись, запрошенная в последний раз наиболее давно) и LFU (Least Frequently Used, запись, наименее часто запрашиваемая), хотя существуют и модификации этих принципов. Например, полностью ассоциативная кэшпамять (fully associative), в которой информация, находящаяся по произвольному адресу в оперативной памяти, может быть размещена в произвольной строке. Другой вариант — прямое отображение (direct mapping), при котором информация, которая находится по произвольному адресу в оперативной памяти, может быть размещена только в одном месте кэш-памяти. Естественно, этот вариант обеспечивает наибольшее быстродействие, так как при проверке наличия информации контроллеру придется «заглянуть» лишь в одну строку кэша, но и наименее эффективен, поскольку при записи контроллер не будет выбирать «оптимальное» место. При одинаковом объеме кэша схема с полной ассоциативностью будет наименее быстрой, но наиболее эффективной.
Полностью ассоциативный кэш встречается на практике, но, как правило, у него очень небольшой объем. Например, в ЦП Cyrix 6x86 использовалось 256 байт такого кэша для команд перед унифицированным 16-или 64-Кбайт кэшем L1. Часто полноассоциативную схему применяют при проектировании TLB (о них будет рассказано ниже), кэшей адресов переходов, буферов чтения-записи и т. д. Как правило, уровни ассоциативности I-cache и D-cache довольно низки (до четырех каналов) — их увеличение нецелесообразно, поскольку приводит к увеличению задержек доступа и в итоге негативно отражается на производительности. В качестве некоторой компенсации увеличивают ассоциативность S-cache (обычно до 16 каналов), так как задержки при доступе к этому кэшу неважны. Например, согласно результатам исследований часто используемых целочисленных задач, у Intel Pentium III 16 Кбайт четырехканального D-cache было достаточно для покрытия около 93% запросов, а 16-Кбайт четырехканального I-cache — 99% запросов.
Размер строки и тега кэш-памяти
Немаловажная характеристика кэш-памяти — размер строки. Как правило, на одну строку полагается одна запись адреса (так называемый тег), которая указывает, какому адресу в оперативной памяти соответствует данная линия. Очевидно, что нумерация отдельных байтов нецелесообразна, поскольку в этом случае объем служебной информации в кэше в несколько раз превысит объем самих данных. Поэтому один тег обычно полагается на одну строку, размер которой обычно 32 или 64 байта (реально существующий максимум 1024 байта), и эквивалентен четырем (иногда восьми) разрядностям системной шины данных. Кроме того, каждая строка кэш-памяти сопровождается некоторой информацией для обеспечения отказоустойчивости: одним или несколькими битами контроля четности (parity) или восемью и более байтами обнаружения и коррекции ошибок (ЕСС, Error Checking and Correcting), хотя в массовых решениях часто не используют ни того, ни другого.
Размер тега кэш-памяти зависит от трех основных факторов: объема кэш-памяти, максимального кэшируемого объема оперативной памяти, а также ассоциативности кэш-памяти. Математически этот размер рассчитывается по формуле
Smg — размер одного тега кэш-памяти, в битах; Smem — максимальный кэшируемый объем оперативной памяти, в байтах; Scache — объем кэш-памяти, в байтах; А — ассоциативность кэш-памяти, в каналах.
Отсюда следует, что для системы с 1-Гбайт оперативной памятью и 1-Мбайт кэш-памятью с двухканальной ассоциативностью потребуется 11 бит для каждого тега. Примечательно, что собственно размер строки кэш-памяти никак не влияет на размер тега, но обратно пропорционально влияет на количество тегов. Следует понимать, что размер строки кэш-памяти не имеет смысла делать меньше разрядности системной шины данных, но многократное увеличение размера приведет к чрезмерному засорению кэш-памяти ненужной информацией и излишней нагрузке на системную шину и шину памяти. Кроме того, максимально кэшируемый объем кэш-памяти не обязан соответствовать максимально возможному устанавливаемому объему оперативной памяти в системе. Если возникнет ситуация, когда оперативной памяти окажется больше, чем может быть кэшировано, то в кэш-памяти будет присутствовать информация только из нижнего сегмента оперативной памяти. Именно такой была ситуация с платформой Socket7/Super7. Наборы микросхем для этой платформы позволяли использовать большие объемы оперативной памяти (от 256 Мбайт до 1 Гбайт), в то время как кэшируемый объем часто был ограничен первыми 64 Мбайт (речь идет о B-cache, находящемся на системной плате) по причине использования дешевых 8-бит микросхем теговой SRAM (2 бита из которых резервировалось под указатели действительности и измененности строки). Это приводило к ощутимому падению производительности.
Какая информация содержится в тегах кэш-памяти? Это информация об адресах, но как можно точно отобразить расположение строки кэш-памяти на всем пространстве кэшируемого объема оперативной памяти, используя столь незначительное количество адресных битов? Это понятие является фундаментальным в понимании принципов функционирования кэш-памяти.
Рассмотрим предыдущий пример, с 11-бит тегами. Учитывая логическое сегментирование благодаря двухканальной ассоциативности, можно рассматривать данную кэш-память как состоящую из двух независимых сегментов по 512 Кбайт каждый. Представим оперативную память как состоящую из «страниц» по 512 Кбайт каждая — их будет соответственно 2048 штук. Далее, log2 (2048) - 11 (основание логарифма равно 2, так как возможны только два логических состояния каждого бита). Это означает, что фактически тег — не номер отдельной строки кэш-памяти, а номер «страницы» памяти, на которую отображается та или иная строка. Другими словами, в пределах «страницы» сохраняется прямое соответствие ее «строк» с соответствующими строками кэш-памяти, т. е. п-я строка кэш-памяти соответствует п-й «строке» данной «страницы» оперативной памяти.
Рассмотрим механизм работы кэш-памяти разных видов ассоциативности. Допустим, имеется абстрактная модель с восемью строками кэш-памяти и 64 эквивалентными строками оперативной памяти. Требуется поместить в кэш строку 9 оперативной памяти (заметим, что все строки нумеруются от нуля и по возрастающей). В модели с прямым отображением эта строка может занять только одно место: 9 mod 8 = 1 (вычисление остатка от деления нацело), т. е. место строки 1. Если взять модель с двухканалыюй ассоциативностью, то эта строка может занять одно из двух мест: 9 mod 4=1, т. е. строку 1 любого канала (сегмента). Полноассоциативная модель предоставляет свободу для размещения, и данная строка может занять место любой из восьми имеющихся. Другими словами, фактически имеется 8 каналов, каждый из которых состоит из 1 строки.
Ни одна из вышеуказанных моделей не позволит, разумеется, поместить в кэш больше строк, чем он физически в состоянии разместить, они лишь предлагают различные варианты, различающиеся балансом эффективности использования кэша и скорости доступа к нему.
Типы подключения кэш-памяти
Количество портов чтения-записи кэш-памяти — показатель того, сколько одновременных операций чтения-записи может быть обработано. Хотя жестких требований и нет, определенное соответствие набору функциональных устройств ЦП должно прослеживаться, так как отсутствие свободного порта во время исполнения команды приведет к вынужденному простою.
Существует два основных способа подключения кэш-памяти к ЦП для чтения: сквозной и побочный (Look-Through и Look-Aside). Суть первого в том, что при необходимости данные сначала запрашиваются у контроллера кэш-памяти самого высокого уровня, который проверяет состояние подключенных тегов и возвращает либо нужную информацию, либо отрицательный ответ, и в этом случае запрос перенаправляется в более низкий уровень иерархии кэш-памяти или в оперативную память. При реализации второго способа чтения запрос одновременно направляется как кэш-контроллеру самого высокого уровня, так и остальным кэш-контроллерам и контроллеру оперативной памяти. Недостаток первого способа очевиден: при отсутствии информации в кэше высокого уровня приходится повторять запрос, и время простоя ЦП увеличивается. Недостаток второго подхода — высокая избыточность операций и, как следствие, «засорение» внутренних шин ЦП и системной шины ненужной информацией. Логично предположить, что если для кэшей L1 оптимальна сквозная схема, то для T-cache или B-cache побочная схема может оказаться более выгодной. Для S-cache выбор неоднозначен.
Различают также локальный и удаленный кэш. Локальным называют кэш, находящийся либо в ядре ЦП, либо на той же кремниевой подложке или в корпусе ЦП, удаленным — размещенный на системной плате. Соответственно локальным кэшем управляет контроллер в ядре ЦП, а удаленным — НМС системной платы. Локальный кэш с точки зрения быстродействия предпочтительнее, так как интерфейс к удаленному кэшу обычно мультиплексируется с системной шиной. С одной стороны, когда другой ЦП захватывает общую системную шину или какой-либо периферийный контроллер обращается к памяти напрямую, удаленный кэш может оказаться временно недоступным. С другой — такой кэш легче использовать в многопроцессорных системах.
Существуют два распространенных способа записи в кэш: сквозной (Write-Through) и обратной (Write-Back) записи. В первом случае информация одновременно сохраняется как в текущий, так и в более низкий уровень иерархии кэш-памяти (или прямо в оперативную память при отсутствии такового). Во втором — данные сохраняются только в текущем уровне кэш-памяти, при этом возникает ситуация, когда информация в кэше и оперативной памяти различается, причем последняя становится устаревшей. Для того чтобы при сбросе кэша информация не была необратимо потеряна, к каждой строке кэша добавляется «грязный» бит (dirty bit, иначе известный как modified). Он нужен для обозначения того, соответствует ли информация в кэше информации в оперативной памяти, и следует ли ее записать в память при сбросе кэша.
Также следует упомянуть способ резервирования записи (write allocation). При записи данных в оперативную память часто возникает ситуация, когда записываемые данные могут скоро понадобиться, и тогда их придется довольно долго подгружать. Резервирование записи позволяет частично решить эту проблему: данные записываются не в оперативную память, а в кэш. Строка кэша, вместо которой записываются данные, полностью выгружается в оперативную память. Так как вновь записанных данных обычно недостаточно для формирования полной строки кэша, из оперативной памяти запрашивается недостающая информация. Когда она получена, новая строка записывается, и тег обновляется. Определенных преимуществ или недостатков такой подход не имеет — иногда это может дать незначительный прирост производительности, но также и привести к засорению кэша ненужной информацией.
TLB как разновидность кэш-памяти
Почти все современные ЦП обладают TLB (Translation Look-aside Buffers, вспомогательные буфера преобразования). Своим существованием они обязаны тому факту, что ЦП в работе используют преимущественно виртуальные адреса оперативной памяти, в то время как контроллеры оперативной и кэш-памяти работают преимущественно с реальными адресами. Для того чтобы не вычислять при каждом обращении к памяти реальный адрес из виртуального, в ЦП присутствуют таблицы соответствия виртуальных адресов страниц памяти реальным. Как правило, их объем невелик (от единиц до сотен записей), но этого вполне достаточно, поскольку часто запрашиваемые данные или команды обычно хорошо локализуются в пределах страницы памяти размером 4 или 8 Кбайт.
Что же происходит, если запрашиваемого реального адреса какой-либо страницы не находится в TLB? A-box ЦП отрабатывает специальный вызов (exception trap), на который ОС должна адекватно отреагировать, т. е. произвести поиск нужной страницы в своих таблицах подсистемы виртуальной памяти. Если в процессе поиска окажется, что указанная страница находится в файле или разделе подкачки, то она должна незамедлительно быть оттуда считана в оперативную память. В итоге А-box ЦП получит реальный адрес нужной страницы памяти и процесс пойдет своим путем.
Стоит также заметить, что единой схемы адресации записей кэш-памяти не существует. Поэтому в зависимости от иерархического расположения и целевого назначения данной структуры кэш памяти, а также идей построения определенного ЦП может использоваться выборочно как реальная, так и виртуальная адресация записей, или даже гибридная схема (реальное тегирование с виртуальной индексацией), что предполагает и соответствующую организацию структуры TLB.
Многопроцессорность
Причины появления многопроцессорных систем
В настоящее время предельная производительность системы определяется мощностью ЦП и подсистемы памяти (контроллера памяти, который может быть встроен как в набор микросхем, так и непосредственно в процессор). Поэтому наиболее эффективное масштабирование по производительности обеспечивают именно многопроцессорные системы. Хотя кластерные решения, объединяющие несколько вычислительных узлов, как правило, при пересчете на один ЦП оказываются дешевле, но из-за накладных расходов на организацию их взаимодействия удельная производительность многопроцессорных машин все же заметно выше. Кроме того, использование многопроцессорных серверов позволяет минимизировать дублирование вспомогательных подсистем вычислительной машины — контроллеров ввода-вывода, дисковых массивов и т. п.
Нельзя не отметить и конструктивные преимущества многопроцессорных серверов: они обеспечивают максимальную удельную производительность при пересчете не только на один ЦП, но и на единицу объема, что в серверных платформах весьма важно.
Благодаря указанным преимуществам многопроцессорные платформы пользуются популярностью практически во всех сегментах серверного рынка. Двух- и четырехпроцессорные серверы младшего и среднего уровня имеют хорошее соотношение цена/производительность, и с точки зрения организации охлаждения они ненамного сложнее однопроцессорных. Решения с восемью и более процессорами имеют более сложную архитектуру, но и позволяют добиться максимальной производительности и надежности.
Топологии многопроцессорных систем
Типы многопроцессорных систем различаются прежде всего подходом к организации системной шины, связывающей, как и в однопроцессорных системах, ЦП и НМС. В настоящее время наиболее распространены три варианта архитектуры многопроцессорных систем:
общая шина (shared bus);
звездообразная топология (star topology), или топология «точка—точка» (point-to-point topology);
коммутируемая топология (switch-based topology). Наиболее простая — топология общей шины.
Как следует из названия, все ЦП в системе подключаются последовательно к общей системной шине и соответственно вынуждены делить между собой ее полосу пропускания. Этим определяются как преимущества, так и недостатки этой архитектуры. Одновременно с экономией на количестве проводников и общей стоимости разработки возникает проблема пропускной способности системной шины, который столь существенен, что при большом количестве ЦП (начиная с восьми) такая топология просто неприменима, так как задержки при обращении к памяти слишком велики из-за очереди на обращение к шине. Компенсацией недостаточной пропускной способности системной шины может служить добавление значительных локальных объемов кэш-памяти к каждому ЦП. Общая шина наиболее оправданна в системах с двумя процессорами. В четырехпроцессорных системах объемы кэш-памяти каждого ЦП приходится увеличивать в 2-4 раза, что приводит к существенному росту стоимости конечной системы.
В звездообразной топологии каждый ЦП располагает выделенной системной шиной, а поэтому отсутствует необходимость в разделении доступа. Системные шины всех ЦП подключаются непосредственно к набору микросхем. Хотя такая архитектура и позволяет минимизировать зависимость производительности ЦП от пропускной способности системной шины, но налагает очень высокие требования на НМС и системную плату в целом, усложняя их проектирование и увеличивая стоимость производства. Тем не менее и этот подход не позволяет подключить большое количество ЦП — звездообразная топология применяется, как правило, в системах с двумя или четырьмя процессорами.
Довольно интересный пример звездообразной топологии — четырехпроцессорные серверы Fujitsu PRIME-POWER 450. В их основу положен принцип скоростного универсального коммутатора, работающего на тактовой частоте 220 МГц, который и выполняет все основные функции набора микросхем. К нему по выделенным 128-бит 220-МГц шинам (110 МГц с применением технологии DDR) подключаются ЦП SPARC64 V с тактовой частотой 2 ГГц и выше. Далее к нему же подключаются два контроллера оперативной памяти (DDR SDRAM 110 МГц), каждый из которых располагает своим 128-бит каналом данных, и два моста шины PCI — по 110-МГц 64-бит каналам. Эта схема обеспечивает скоростной обмен данными между всеми узлами, но добавление, например, еще четырех ЦП и двух контроллеров оперативной памяти потребует серьезной перепроектировки коммутатора.
У систем с коммутируемой топологией нет проблем масштабируемости, свойственных вышеперечисленным шинным архитектурам. В этой архитектуре ЦП подключаются не к НМС (который может отсутствовать), а к коммутатору, соединенному с другими коммутаторами. Механизм подключения может быть как простым (широкая общая шина), так и иерархическим (древовидная иерархическая структура). На основании такой топологии можно проектировать системы с большим количеством ЦП (до 1024).
Рассмотрим коммутируемую топологию на примере 16-процессорных серверов HP AlphaServer GS160. В основе архитектуры лежит так называемый Quad Building Block (QBB), содержащий четыре ЦП Alpha 21264B (EV68C) с тактовой частотой до 1,22 ГГц, до 16 Мбайт B-cache на каждый ЦП, четыре модуля регистровой SDRAM ЕСС общим объемом до 32 Гбайт, два модуля стабилизатора питания, два 64-бит 33-МГц РСI-интерфейса, собственно коммутатор и интерфейс GlobalPort для связи с другими коммутаторами.
Четыре таких QBB объединяют в двухуровневую древовидную структуру через главный коммутатор, находящийся на отдельном модуле и обеспечивающий пропускную способность между двумя отдельно взятыми QBB по 1,75 Гбайт/с в каждом направлении.
Особняком стоят системы, в которых контроллер оперативной памяти, а часто и контроллеры периферийных шин интегрированы в ядро ЦП, а поэтому необходимость в системной шине отпадает. Такие системы строятся по NUMA-архитектуре, о которой пойдет речь дальше. Их можно рассматривать как представителей коммутируемой топологии.
Доступ к памяти в многопроцессорных системах
Независимо от количества ЦП в системе и топологии системной шины, им придется разделять доступ к общему пространству оперативной памяти, за исключением случаев, когда используется сегментирование аппаратных ресурсов некоторого сервера или суперкомпьютера для запуска нескольких копий ОС. В настоящее время существуют три типа доступа к оперативной памяти в многопроцессорных системах:
классический SMP (Symmetrical Multi-Processing, симметричная многопроцессорность);
распределенный SMP (distributed SMP);
NUMA (Non-Uniform Memory Access, неоднородный доступ к памяти).
Первоначальная модель симметричней многопроцессорности, теперь называемая классической, предусматривала, что все ЦП в системе имеют доступ к физически единому пространству оперативной памяти, обслуживаемому специальным контроллером. Все ЦП равнозначны по уровню прав доступа, какие-либо механизмы приоритетности отсутствуют, системная логика обрабатывает запросы в порядке поступления, и только на нее возложены все функции по работе с оперативной памятью. Соответственно задержки при доступе к памяти одинаковы для всех ЦП при обращении к любой области памяти. Это наиболее простая модель организации доступа к памяти в многопроцессорных системах, но не самая производительная и не позволяющая подключать большое количество ЦП из-за объективных проектировочных ограничений.
Принцип распределенной многопроцессорности предполагает формирование из имеющихся в системе ЦП логических групп, каждая из которых располагает своим (локальным) объемом оперативной памяти. Естественно, что для обеспечения целостности и нормального функционирования всего пространства оперативной памяти эти логические группы должны быть как-то связаны между собой. Задержки при доступе к памяти будут соответственно различны в зависимости от того, происходит обращение к локальной или удаленной области памяти.
Следует понимать, что, несмотря на некоторое сходство, распределенная SMP — не частный случай коммутируемой архитектуры: в последней могут быть реализованы как SMP, так и NUMA. Например, в вычислительном комплексе Intel Profusion восемь ЦП Intel Xeon разделены на две группы по четыре ЦП и связаны коммутатором, к которому подключается НМС с контроллером оперативной памяти. Таким образом, при обращении к памяти все процессоры равноправны и Intel Profusion представляет собой классическую SMP-систему. А вот описанный выше сервер HP AlphaServer GS160 спроектирован по принципу распределенной многопроцессорности.
Принцип неоднородного доступа (NUMA) состоит в явном разделении на локальную и удаленную память для каждого ЦП. Так как главный недостаток коммутируемой архитектуры — относительно низкая скорость обмена информацией между коммутаторами, возникла идея интегрировать контроллер памяти в ядро ЦП. Модули оперативной памяти в этом случае подключаются напрямую к ЦП (без НМС). В многопроцессорной системе такому ЦП придется запрашивать информацию из оперативной памяти других ЦП и отвечать на их запросы. Модель памяти называется неоднородной, потому что скорость доставки данных из локальной оперативной памяти ЦП будет значительно выше,, чем из оперативной памяти, подключенной к другому ЦП, причем разница будет все более ощутимой с увеличением количества ЦП в системе.
Модели с распределенной многопроцессорностью и неоднородным доступом позволяют создавать более масштабируемые решения, чем классическая SMP. Однако они предъявляют некоторые специфические требования к ОС, которая должна оптимизировать загрузку процессоров таким образом, чтобы процесс, выполняемый на одном ЦП, как можно реже использовал информацию, находящуюся в локальной оперативной памяти другого ЦП.
Современные серверные процессоры
Intel Xeon
Сегодня наиболее распространенные серверные ЦП — семейство Intel Xeon с архитектурой NetBurst, выполненные по технологии Hyper-Threading (все современные), совместимые по набору команд с другими ЦП архитектуры х86. Фактически это серверные версии соответствующих ЦП семейства Pentium 4, отличающиеся возможностью работы в многопроцессорном режиме и корпусом Socket 604 (ранее Socket 603). В семейство входят два типа процессоров: Xeon DP (Dual Processor) и Xeon MP (Multi Processor). Как следует из названий, Xeon DP может быть использован максимум в двухпроцессорных конфигурациях, а Xeon МР — в четырехпроцессорных. Впрочем, с помощью технологий, подобных Intel Profusion, указанные ограничения могут быть преодолены. Все ЦП рассчитаны на системы с топологией общей шины. В настоящее время существенных отличий между Xeon DP и Xeon MP не наблюдается, различаются только частоты системной шины: 200 и 166 МГц соответственно.
Архитектура NetBurst обеспечивает очень высокие тактовые частоты благодаря длинным конвейерам основных ФУ — 20 стадий целочисленных конвейеров для ЦП, изготавливаемых по 180-нм и 130-нм проектным нормам и 31 стадия для ЦП, выполненных по 90-нм техпроцессу (в обоих случаях не считая стадий декодирования). Так как все ЦП архитектуры NetBurst (Xeon, Pentium 4 и Celeron) имеют общую функциональную логику, незначительно изменяемую при переходе на новые проектные нормы, то все те недостатки, присущие ядрам ЦП Pentium 4 (Willamette, Northwood, Prescott), свойственны и модельному ряду Xeon. Известно, что для достижения стабильной работы на высоких частотах конвейерам NetBurst часто приходится отрабатывать «холостые» такты для синхронизации соседних стадий. Кроме того, большая длина конвейера делает его более чувствительным к ошибкам при предсказании условных переходов, так как больше времени уходит на сброс и перезаполнение конвейера.
Декодер х86-команд не синхронизирован с конвейерами ФУ и производит выборку (в том числе и упреждающую) в кэш микрокоманд (trace cache) со скоростью одна команда х86 за такт. Это оказывается эффективным при многократном исполнении одного и того же кода с достаточной временной локализацией (нет необходимости декодировать команды многократно), хотя упреждающее декодирование может засорять кэш. Согласно данным Intel, размер этого кэша 12 288 микрокоманд. Данные о длине микрокоманд в документации не представлены, но, по некоторым данным, она составляет до 10 байт в зависимости от версии ядра. Если же учесть, что после декодирования одна команда х86 преобразовывается обычно в две-три внутренние микрокоманды, то кэша микрокоманд хватит для хранения 4—6 тыс. х86-команд.
Ядро NetBurst имеет Е-box, состоящий из трех конвейеров (два для выполнения простых микрокоманд и один для обработки сложных и редко используемых). При этом два «простых» конвейера входят в состав так называемого Rapid Execution Engine, работающего на удвоенной частоте ядра.
А-box также состоит из трех конвейеров (один обрабатывает микрокоманды загрузки целочисленных данных, один — сохранения целочисленных данных и один — загрузки/сохранения/перемещения вещественных данных). Оба адресных конвейера по работе над целочисленными данными также являются частью Rapid Execution Engine. F-box представлен одним универсальным конвейером, предназначенным для проведения расчетных операций над командами из наборов х87, ММХ и SSE. Обслуживают перечисленные конвейеры шесть планировщиков, осуществляющих выборку из кэша микрокоманд и помещающих их в соответствующие очереди. Каждый планировщик обслуживает отдельный конвейер: по одному на каждый «быстрый» целочисленный, один — на комплексный целочисленный, один — на оба целочисленных адресных, один — на вещественный адресный и один — на вещественный конвейер. Вполне естественно, что оба планировщика, обслуживающих целочисленные конвейеры, — часть Rapid Execution Engine, в отличие от обслуживающего целочисленные адресные конвейеры — он работает на частоте ядра ЦП. Для увеличения производительности целочисленных конвейеров файл их регистров работает на удвоенной частоте ядра ЦП.
Благодаря тому что оба «простых» конвейера Е-bох работают на удвоенной частоте ядра ЦП, многие простые операции (сложение, вычитание, логические операторы) теоретически могут быть выполнены за половину такта. Однако следует учитывать, что эти конвейеры работают с 16-бит операндами, поэтому на 32-бит операции тратится полный такт (сначала обрабатываются младшие 16 бит, а затем старшие 16). Впрочем, предусмотрен режим back-to-back, при котором одновременно на одном конвейере будет рассчитываться младшая часть результата, а на другом — старшая. Таким образом, теоретическая возможность выполнения полной операции в пределах полутакта сохраняется.
В то же время некоторые операции, например, смещения (shifts), выполняются за четыре такта, так как проходят по относительно медленному «сложному» конвейеру. Необходимо отметить, что в ЦП, изготавливаемых по 130-нм проектным нормам, смещения обрабатываются на «простых» конвейерах.
Перечисленные особенности привели к тому, что первые ЦП- семейства Intel Xeon нередко уступали по производительности процессорам семейства Pentium III, хотя и работали на более высокой тактовой частоте. Частично решить эту проблему позволила перекомпиляция программной базы с оптимизацией под архитектуру Net-Burst. В настоящее время, разумеется, сравнивать ЦП архитектуры Р6 и NetBurst неправомерно — частота и производительность процессоров семейства Xeon выросли до высочайшего уровня, и, кроме того, эти ЦП имеют гораздо большие функциональные возможности.
Одно из преимуществ архитектуры NetBurst — широкая (256 бит, не включая биты ЕСС) шина данных между D-cache и S-cache (для которого Intel использует название Advanced Transfer Cache). Поскольку D-cache мал и работает в режиме сквозной записи, то именно S-cache является основным кэшем архитектуры NetBurst. Особенно важен низкий уровень задержек при обращении к нему: девять тактов, в том числе два на доступ к D-cache, так как S-cache подключен по схеме look-through. Впоследствии, при проектировании ядер для 90-нм проектных норм, задержки доступа значительно увеличились — 15 тактов, в том числе четыре на доступ к D-cache. Это отразилось на производительности, причем довольно часто среди ЦП с равной частотой, изготовленных по 130-и 90-нм технологическому процессу, мощнее оказывалась именно первая версия. Стоит отметить, что при доступе к D-cache со стороны вещественного конвейера А-Ьох задержки еще более высоки: девять тактов для 180- и 130-нм ЦП и 12 тактов для 90-нм ЦП.
Таким образом, S-cache оказывает огромное влияние на производительность ЦП Xeon. Он является включающим (inclusive), т. е. содержит полную копию содержимого D-cache. К тому же именно в S-cache хранится тело исполняемого процесса и, если учесть высокие тактовые частоты, на достижение которых архитектура была изначально ориентирована, становится очевидно, что увеличение размера S-cache неминуемо приведет к росту производительности на большинстве задач. Именно поэтому при переходе на новые проектные нормы его размер неизменно увеличивался (с 256 Кбайт у Foster до 2 Мбайт у Irwindale).
Кроме того, в некоторых моделях Xeon используется T-cache, также интегрированный в ядро, но гораздо более медленный (асинхронный) по сравнению с S-cache. Он тоже включающий относительно S-cache. Его основная задача — снизить частоту обращений к оперативной памяти, что очень важно, учитывая топологию общей шины.
Еще одной интересной особенностью архитектуры стала технология Hyper-Threading, позволяющая организовать два логических ЦП на основе одного физического. Своим существованием эта технология обязана тому, что в современных ЦП при исполнении кода какого-либо приложения многие ФУ простаивают, и их можно использовать для обработки второго потока. Для успешной реализации такого подхода требуется некоторая доработка декодера команд и наличие дополнительного набора основных регистров, а также совместимость программных средств — ОС и компилятора. Для работы второму логическому ЦП выделяется половина физических кэшей: D-cache, S-cache и T-cache (если имеется), вследствие чего включение Hyper-Threading при использовании приложений, не совместимых с. этой технологией, приводит к некоторому падению производительности. При использовании перекомпилированных (с оптимизацией под Hyper-Threading) приложений наблюдается некоторый рост производительности, величина которого зависит от специфики решаемых задач.
С переходом на 90-нм проектные нормы существенного роста тактовой частоты ЦП Intel Xcon не произошло — рубеж в 4 ГГц все еще не взят. Хотя более высокочастотные версии ЦП на том же техпроцессе и были заявлены, но их выпуск может и не состояться, так как недавно был анонсирован двухъядерный Pentium 4 Extreme Edition 840 (Smithfield) с тактовой частотой 3,2 ГГц. Ожидается, что на его ядре будут выпущены процессоры Xeon DP (Dempsey) и Xeon МР (Paxville).
AMD Opteron
Процессоры семейства Opteron стали заметным шагом компании AMD на серверном рынке. Их предшественниками были ЦП семейства Athlon MP, которые хотя и пользовались определенной популярностью (благодаря использованию архитектуры «точка—точка», предоставлявшей каждому ЦП полноценную системную шину), не могли быть использованы для создания систем более чем с двумя процессорами.
ЦП семейства Opteron построены на ядре К8 (AMD64), как и процессоры Athlon 64, и имеют некоторые особенности, необходимые для работы в многопроцессорных системах. ЦП Opteron оснащаются встроенным двухканальным контроллером регистровой DDR SDRAM со 128-бит шиной памяти (не включая 16 бит для ЕСС), этот контроллер позволяет применять модули памяти с частотой до 200 МГц.
Opteron совместимы с 64-бит расширениями, что, в отличие от рынка ПК, для серверных платформ очень важно. Уже довольно продолжительное время некоторые черты 32-бит архитектуры х86 препятствовали проникновению процессоров х86 в сегмент серверов среднего уровня. Причина проста: недостаток адресного пространства — 32-бит процессор может адресовать лишь 4 Гбайт ОЗУ. Такой объем адресного пространства в настоящее время не может считаться достаточным даже для некоторых серверов младшего уровня.
С выпуском ЦП Pentium Pro в 1995 г. компания Intel попробовала решить эту проблему с помощью технологии РАЕ36 (Page Address Extension, расширение страничной адресации), позволявшей расширить адресное пространство до 64 Гбайт путем использования дополнительного 4-бит сегментного регистра. Но работа с оперативной памятью в таком режиме значительно снижала производительность (в некоторых ситуациях почти вдвое). 64-бит адресация решает эту проблему без какого-либо ущерба для производительности.
Теоретически Opteron-системы относятся к архитектуре NUMA: в каждом процессоре для связи с соседними ЦП и периферией предусмотрено от одной до трех высокоскоростных двунаправленных шин HyperTrans-port. Однако на практике разница в задержках при обращении к локальной и удаленной памяти невелика — всего примерно 30% (в то время как в классических NUMA-системах она достигает сотен процентов), что позволяет компании AMD говорить о SUMO-архитектуре (существенно однородная архитектура памяти).
AMD делит ЦП семейства Opteron на три группы:
Opteron lxx, для однопроцессорных серверов;
Opteron 2xx, для двухпроцессорных серверов;
Opteron 8xx, для четырех- и восьмипроцессорных серверов.
Для связи с другими ЦП в многопроцессорной конфигурации и набором микросхем используются скоростные шины HyperTransport — процессоры Opteron оснащены тремя такими шинами. Шина HyperTransport — это двунаправленная последовательная шина, состоящая из 16 каналов и работающая на частоте 800 МГц. Пропускная способность шины в синхронном режиме составляет 3,2 Гбайт/с благодаря использованию технологии DDR. Шина HyperTransport может работать в синхронном (когерентном) и асинхронном режимах. Первый предназначен для связи с другими ЦП, второй — для связи с периферийным контроллером. Фактически ядра ЦП Opteron всех серий идентичны, но в ЦП серии 8хх активированы все три шины HyperTransport, в серии 2хх — только две, а в серии lxx — одна.
По сравнению с предыдущим поколением ЦП Athlon МР дизайн ядра Opteron конструктивно изменился. Кроме уже упомянутого встроенного контроллера оперативной памяти, шин HyperTransport и средств AMD64, были реализованы и менее масштабные доработки. Например, длины целочисленных и вещественных конвейеров увеличены на две стадии, с 10 до 12ис 15 до 17 соответственно. Это было вызвано в основном необходимостью переработки механизма декодирования команд, хотя количество декодеров осталось неизменным и равным трем. При декодировании наиболее простые и часто используемые CISC-команды х86 преобразуются аппаратной логикой ЦП в одну или две внутренние микрокоманды, которые затем группируются и направляются на ФУ. Сложные и нечасто используемые команды преобразуются программной логикой ЦП, основанной на загружаемом при инициализации ЦП микрокоде, что требует существенно больше времени и большего количества внутренних микрокоманд в расчете на одну декодируемую. Примечательно, что именно благодаря наличию программируемой части удалось легко дополнить ЦП Athlon XP и Athlon MP с ядром Palomino средствами SSE.
Кроме того, большее количество команд декодируется аппаратной логикой. Это относится прежде всего к операциям с вещественными числами — наборам команд SSE и SSE2. Число целочисленных команд, обрабатываемых программной логикой, сократилось на 8%, а вещественных — на 28%. Количество конвейеров ФУ осталось неизменным: по три на Е-Ьох, А-box и F-box. Последний, как и прежде, обрабатывав SIMD-команды, поступающие в виде наборов команд ММХ, Extended ММХ, 3DNow!, Extended 3DNow!, SSE и SSE2 (процессоры, изготовленные по 90-нм проектным нормам, начиная с ядра версии Е, совместимы и с SSE3). Необходимо отметить, что поскольку внутренняя разрядность вещественных конвейеров не изменилась (она равна 64 бит), то оптимизированный под SSE, SSE2 или SSE3 код не дает практически никакого выигрыша в производительности по сравнению с 3DNow! или Extended 3DNow!. Одна команда, оперирующая 128-бит векторизированными данными (состоящими из четырех слов одинарной точности или двух двойной), будет неминуемо разложена на две команды, оперирующие 64-бит векторизованными (два слова двойной точности) или скалярными данными (одно слово двойной точности). Они будут обработаны в порядке очереди, т. е. в два прохода.
Следует отметить и модернизированный блок С-bох: основные характеристики I-cache, D-cache и S-cache не изменились, и размер линии остался равным 64 байт, но узкая 64-бит шина к S-cache была заменена на две однонаправленные 64-бит шины. Доступ к S-cache (в том числе три такта для доступа к D-cache) занимает 11 тактов, а максимальная задержка составляет 16 тактов (в ситуации, когда строку D-cache, на место которой записывается новая строка из S-cache, необходимо записать в S-cache, но victim buffer, служащий в подобных ситуациях временным хранилищем, переполнен). Емкость таблицы истории переходов возросла с 4 до 16 Кбайт.
Благодаря высокой производительности, удачной архитектуре, хорошей масштабируемости, совместимости с 64-бит расширениями и отсутствию падения производительности при исполнении 32-бит кода ЦП семейства Opteron были благоприятно восприняты на рынке. Серверы на основе этих ЦП успешно выпускаются IBM, Sun, Fujitsu Siemens, HP и другими компаниями. Вслед за дебютом двухъядерного Athlon 64 Х2 (с ядром Toledo, Manchester) ожидается выход серверов на основе двухъядерных Opteron x65, х70 и х75 (ядра Egypt, Italy и Denmark).
Intel Itanium
Совсем недавно процессоры семейства Intel Itanium позиционировали в качестве единственно возможного преемника устаревающей архитектуры х86, как архитектуру post-RISC, способную оставить позади все существующие традиционные RISC-архитектуры, о которых пойдет речь дальше. Однако архитектура х86 до сих пор не сходит со сцены и пользуется огромной популярностью. Не способствует массовому распространению ЦП семейства Itanium соотношение цена/производительность. Тем не менее эти процессоры пользуются определенным успехом и востребованы на рынке серверов среднего уровня.
История семейства Itanium уходит корнями в 1992-93 гг., когда после отказа Роберту Палмеру (Robert Palmer), главному исполнительному менеджеру компании DEC, в сотрудничестве по продвижению и разработке 64-бит RISC-процессоров Alpha Эндрю Гроув (Andrew Grove), главный исполнительный менеджер компании Intel, инициировал создание стратегического альянса с Hewlett-Packard для совместной разработки и продвижения собственной 64-бит RISC-архитектуры. Одновременно Intel продолжила развивать модельный ряд ЦП архитектуры х86, выпустив процессоры 486 и Pentium. Со своей стороны, Hewlett-Packard работала над фирменными процессорами PA-RISC.
Первый процессор Itanium (кодовое название Merced) появился лишь в 1999 г. — компания Intel начала поставки ЦП своим крупнейшим партнерам. Столь длительная задержка выпуска (первая информация о ядре Merced появилась еще в 1997 г.) была связана в основном с технологическими причинами: нестабильностью работы на проектной тактовой частоте 800 МГц. Официальный анонс нового семейства состоялся лишь в июле 2001 г.
Системы предоставлялись для ознакомительных целей и отладки программного обеспечения, чтобы обеспечить более благоприятную встречу следующему представителю семейства — процессору с ядром McKinley, официально представленному под именем Itanium 2 в июле 2002 г. Позже появились обновленные версии ядра — Madison в июле 2003 г. и Deerfield в сентябре того же года.
64-бит процессоры семейства Itanium выполнены по архитектуре VLIW, которая ориентирована на повышение количества выполняемых команд в расчете на один такт ЦП. После декодирования команды, упакованные в 16-байт пакеты по три в каждом, направляются на ФУ процессора. Декодеры в состоянии обрабатывать до шести команд за один такт ЦП. Планировщик ЦП сравнительно примитивен: вся работа по созданию оптимального потока команд возлагается на программные средства, т. е. на компиляторы и оптимизаторы, хотя иногда планировщик может несколько скорректировать поток команд.
Количество имеющихся конвейеров впечатляет: четыре в Е-box, два двойной и два одинарной точности в F-box, два в А-box, четыре в блоке SIMD-команд и три в блоке обработки условных переходов. Соответственно используется очень большое число регистров: 128 целочисленных, 128 вещественных и 72 специальных временных. Суть применения последних состоит в том, что при обработке условного перехода логика ЦП рассчитывает сразу обе ветви и хранит результаты во временных регистрах до тех пор, пока не будет достоверно известно, какая из ветвей окажется верной, тогда нужные результаты будут сразу же перенесены в основные регистры. После декодирования пакеты команд попадают в так называемый «буфер разъединения» (decoupling buffer), емкость которого составляет восемь пакетов, оттуда каждая отдельная команда направляется в один из девяти доступных конвейерных портов. Длина конвейеров — 10 стадий у Merced, а у McKinley и последователей она сокращена до восьми. Применяется техника переименования регистров, дополненная «складированием» и «ротацией» регистров.
Все ЦП семейства Itanium имеют три уровня кэш-памяти. Merced располагает 16-Кбайт I-cache с четырехканальной ассоциативностью, 16-Кбайт двухпортовым D-cache с четырехканальной ассоциативностью и сквозной записью, 96-Кбайт S-cachc с шестиканалыюй ассоциативностью и обратной записью. Также подключается внешний B-cache с четырехканальной ассоциативностью и обратной записью объемом 2 или 4 Мбайт. I-cache полностью конвейеризирован и в состоянии поставлять 32 байт команд (два пакета) за один такт ЦП, он дополнен полноассоциативным TLB на 64 записи. Задержки при чтении (load-to-use latency) из I-cache и D-cache всего два такта. Размер строки I-cache и D-cache — 32 байт, a S-cache и B-cache — 64 байт. D-cache располагает TLB на 32 записи, a S-cache — на 96 записей. Ширина шины данных к S-cache 256 бит. B-cache подключается к ядру ЦП через 128-бит шину данных, работающую на частоте ядра ЦП. Частота системной шины 133 МГц (с использованием технологии DDR — 266 МГц), а ширина канала данных 64 бит (с дополнительными битами для ЕСС или parity). Теоретическая максимальная скорость обмена данными по шине 2,1 Гбайт/с.
Ядро McKinley — это эволюционное развитие ядра Merced. Количество конвейеров А-box удвоено (четыре). Размер строки I-cache и D-cache увеличен до 64 байт, кроме того, D-cache стал четырехпортовым (по два порта для чтения и записи). Размер S-cache увеличен до 256 Кбайт, уровень ассоциативности вырос до восьми, а размер строки достиг 128 байт. Внешний B-cache был упразднен, а вместо него в ядро ЦП встроен 3-Мбайт T-cache с 12-канальной ассоциативностью и обратной записью, существуют также модели с 1,5-Мбайт T-cache. Ширина канала данных к T-cache расширена до 256 бит (с дополнительными 32 бит для ЕСС). Размер строки T-cache составляет 128 байт. Время доступа к S-cache пять и более тактов, к T-cache — 12 и более тактов. Количество записей в TLB S-cache увеличено до 128. Частота системной шины возросла до 200 МГц (эффективная частота — 400 МГц), а ширина канала данных до 128 бит (с дополнительными битами для ЕСС или четности), что дало возможность добиться теоретической максимальной скорости обмена данными по шине 6,4 Гбайт/с.
В ядро Madison было внесено меньше изменений: оно изготовлено по 130-нм технологии, оснащается 6-Мбайт T-cache, кроме того, существует модификация Madison 9М, у которой размер T-cache увеличен до 9 Мбайт. Еще одна модификация Madison — ядро Deerfield — обладает только 3-Мбайт T-cache и предназначено для двухпроцессорных конфигураций.
ЦП семейства Itanium подключаются к общей шине (это традиционно для процессоров Intel), максимальное количество ЦП на одной шине ограничено четырьмя. На практике пропускной способности системной шины в четырехпроцессорных конфигурациях часто оказывается недостаточно, поэтому при проектировании серверов с большим количеством ЦП часто ставят только по два ЦП на одну шину и соединяют отдельные шины при помощи скоростных коммутаторов.
Все ЦП семейства Itanium совместимы с набором команд х86 на аппаратном уровне. Однако производительность при выполнении х86-кода очень невысока — она сравнима с мощностью первых моделей Pentium. Это объясняется тем, что концептуальные различия между архитектурами настолько значительны, что логика ЦП самостоятельно не в состоянии обеспечить должную нагрузку на ФУ, чтобы вывести производительность на приемлемый уровень. Позже компания Intel выпустила связующее ПО (middleware) для Windows, которое на лету транслировало х86-команды в код Itanium с последующей оптимизацией. Этот подход позволил добиться падения производительности только в два раза по сравнению с изначально откомпилированным для архитектуры Itanium кодом. Не исключено, что вскоре Intel будет вынуждена доработать это ПО для обеспечения совместимости с 64-бит расширениями х86.
При сравнении архитектуры Itanium с NetBurst видны разные подходы к достижению максимальной производительности: если в NetBurst ставка делается на высокие тактовые частоты ядра ЦП при относительно небольшом количестве конвейеров ФУ и их большой длине, то в Itanium имеет место обратный вариант.
В настоящее время Itanium 2 лидирует по производительности на вещественных операциях и показывает довольно хорошую производительность на целочисленных. Ожидается выход двухъядерного Montecito с Hyper-Threading и 24-Мбайт встроенным T-cache — этот ЦП поставит рекорд по количеству транзисторов в ядре — около 1,7 млрд.
DEC Alpha
История этой легендарной архитектуры, на протяжении 10 лет показывавшей наивысшую производительность как на целочисленных, так и на вещественных операциях, началась с 1982 г., когда в Западной исследовательской лаборатории Digital Equipment Corporation (DF.C) началась работа над RISC-проектом Titan. Несколько позже были начаты еще три независимых RISC-проекта в рамках компании, которые в 1985 г. были объединены в проект PRISM (Parallel Instruction Set Machine, машина с параллельным набором команд). В 1988 г. проект был неожиданно закрыт, хотя уже через год началась работа над другой архитектурой ЦП, которая унаследовала многие особенности PRISM. Эта 64-бит архитектура получила название Alpha, а первый ЦП на ее основе, представленный в ноябре 1992 г., назывался Alpha 21064 и имел кодовое наименование EV4. Стартовав на очень высоких по меркам того времени тактовых частотах (150-200 МГц), сбалансированная архитектура этого ЦП привлекла внимание. Однако многочисленные просчеты руководства компании в вопросах ценообразования и позиционирования на рынке привели к тому, что архитектура так и не получила широкого распространения. Ситуацию не исправили ни выпуск недорогой модели 21066 (LCA4, первый ЦП со встроенным контроллером оперативной памяти), ни переход на новый четырехслойный 0,5-мкм техпроцесс и рост тактовых частот: в 1993 г. были представлены модели 21064А (EV45) с тактовой частотой 300 МГц и 21066А (LCA45) с тактовой частотой 233 МГц. В 1994 г. появился ЦП следующего поколения — 21164 (EV5) с удвоенным количеством конвейеров ФУ и встроенным 96-Кбайт S-cachc. Так как проектные нормы остались прежними, тактовая частота EV5 увеличилась лишь до 333 МГц. EV5 также оказался довольно дорогим в производстве из-за большого количества транзисторов (9,3 млн.) и площади ядра (299 мм2). После перепроектировки доработанного EV5 под 0,35-мкм технологию в 1995 г. появилась модификация 21164А (EV56), достигшая тактовой частоты 667 МГц. В 1997 г. был выпущен упрощенный вариант (без S-cacho.) этого ЦП — 21164РС (РСА56), он позиционировался как массовый, но производительный ЦП.
В январе 1998 г. DEC, испытывавшая серьезные финансовые трудности, была куплена компанией Compaq, одним из ведущих сборщиков компьютерной техники с архитектурой х86. Сформировав альянс с Samsung, эта компания пыталась продвигать на рынке последнюю разработку DEC — процессор 21264 (EV6), который хотя и изготавливался по тем же проектным нормам, что и EV56, показывал почти вдвое более высокую производительность при равных тактовых частотах. Это оказалось возможным благодаря использованию нового ядра, в котором было реализовано внеочередное выполнение команд, новая схема подключения кэш-памяти и новая системная шина DDR. Именно эта системная шипа была позже лицензирована AMD и применялась в процессорах семейства Athlon.
Однако даже столь удачная архитектура и внедрение новых проектных норм, позволивших значительно поднять тактовые частоты и снизить себестоимость, были выпущены 21264А (250-нм, EV67) и 21264В (18-нм, EV68A и EV68C) с частотами до 1250 МГц — не помогли этим ЦП завоевать популярность. Compaq и Sam sung не сумели обеспечить эффективный сбыт, ограничив область применения серверами и дорогими рабочими станциями. В июне 2001 г. Compaq объявила о переводе всех своих серверных решений на архитектуру Itanium, одновременно остановив разработку 21464 (EV8). В январе 2002 г. уже под маркой HP (поглотившей в конце 2001 г. Compaq) был анонсирован последний процессор Alpha — 21364 (EV7). Поскольку компания HP в сотрудничестве с Intel работала над развитием Itanium-платформ и располагала собственной архитектурой РА-RISC, архитектура Alpha оказалась «третьим лишним». Формально она была «похоронена» в августе 2004 г., когда компания Hewlett-Packard объявила о своих стратегических планах на рынке серверов, однако ее развитие прекратилось задолго до этого. Продукция на основе архитектуры Alpha перестанет продаваться под торговой маркой HP в 2006 г.
Тем не менее представители двух последних поколений архитектуры Alpha доступны на рынке и сейчас. В основе ядра EV6 лежит четырехконвейерный Е-box и двухконвейерный F-box (длина всех шести конвейеров 7 стадий). Функции А-box по подсчету виртуальных адресов возложены на Е-box. Кроме стандартных целочисленных команд и BWX (Byte-Word Extension), E-box поддерживает набор векторных команд MVI (Motion Video Instructions), предназначенных для ускорения расчетов, связанных с обработкой видео- и аудиопотоков. Процессор имеет 80 физических целочисленных и 72 физических вещественных регистра, однако количество логических (т. е. адресуемых программно) регистров осталось тем же, что и в предыдущих поколениях архитектуры: 32 целочисленных и 32 вещественных. 64-Кбайт I-cache с двухканальной ассоциативностью позволяет считывать по четыре команды за такт. Двухпортовый D-cache имеет объем 64 Кбайт, деухканальную ассоциативность и обратную запись. Также предусмотрен B-cache с прямым отображением и обратной записью, объем которого до 16 Мбайт. Он состоит из высокоскоростных микросхем статической памяти (обычно с отложенной записью) и подключается к ядру по выделенной шине со 128-бит каналом данных. Частота работы B-cache программируется и может находиться в диапазоне от 1/8 до 2/3 частоты ядра ЦП. Как уже упоминалось, системная шина использует технологию DDR для передачи данных, ее разрядность 64 бита (с дополнительными 8 битами для ЕСС).
EV7 представляет собой модификацию EV6, в которой оставшееся без изменений ядро дополнено 1,75-Мбайт S-cache с семиканальной ассоциативностью и обратной записью (подключаемым по той же шине со 128-бит каналом данных), двумя пятиканальными контроллерами оперативной памяти стандарта Direct Rambus (четыре 16-бит канала данных и один 16-бит канал для избыточной отказоустойчивости), четырьмя контроллерами для связи с соседними ЦП (с пропускной способностью свыше 6 Гбайт/с на канал) и одним контроллером для связи с периферией. Все вышеперечисленные контроллеры EV7 работали на 2/3 частоты ядра ЦП.
EV6 и его модификации использовали звездообразную топологию системной шины, в то время как системы на процессорах EV7 и EV7z строились по NUMA-топологии, маршрутизация данных между ЦП осуществляется встроенными коммутаторами. На практике к одному набору микросхем (DEC Tsunami, он же Typhoon) подключалось не более четырех ЦП семейства EV6, поэтому для построения систем с большим количеством ЦП использовались коммутируемые решения (например, уже рассмотренный AlphaServer GS160). На базе ЦП семейства EV7 могут быть созданы многопроцессорные серверы с количеством процессоров до 128. Благодаря четырем встроенным контроллерам каждый ЦП этого семейства может быть подключен к четырем соседним ЦП по произвольным алгоритмам.
С момента выхода EV6 в 1998 г. никаких изменений в функциональную часть ядра ЦП не вносилось, кроме того, для создания серверов на этом ЦП применяется НМС Tsunami, разработанный еще инженерами DEC. Его характеристики не удовлетворяют современным требованиям — частота системной шины составляет 83 МГц, на этой же частоте работает и контроллер памяти SDRAM (ширина шины памяти 256 или 512 бит). Частично недостатки НМС компенсирует большой объем B-cache, но по уровню производительности серверы на базе EV6—EV7 уступают современным системам.
Hewlett-Packard PA-RISC
Архитектура PA-RISC, известная как HP/PA (PA, Precision Architecture, точная архитектура), была разработана компанией Hewlett-Packard в конце 80-х гг. прошлого века. Руководство компании приняло решение перевести выпускаемую компьютерную технику с CISC-архитектур, таких, как 32-бит Motorola 68K и 16-бит собственной разработки, на потенциально перспективную свою же RISC-архитектуру.
Прообразом архитектуры РА-RISC считается 32-бит архитектура FOCUS, впервые воплощенная в рабочей станции HP 9000/520, которую в августовском выпуске Hewlett-Packard Journal 1983 г. назвали «настольным мэйнфреймом для инженеров и ученых». Каждый из максимум трех 18-МГц ЦП этой рабочей станции состоял из пяти микросхем, изготавливаемых по технологическому процессу NMOS3. Примечательно, что эта рабочая станция комплектовалась HP-UX, многопользовательской UNIX-подобной ОС, которая дожила до наших дней.
Первая спецификация на новую архитектуру, PA-RISC 1.0, заложила ее основы:
длина любой команды ровно 4 байта,
только команды загрузки-сохранения имеют доступ к оперативной памяти,
поддерживается три режима адресации (long, short и indexed),
декларируется 32 32-бит целочисленных, 32 64-бит вещественных и семь вспомогательных «теневых» (для обработки прерываний) регистров.
Вещественные регистры также могли быть адресованы как 64 32-бит или 16 128-бит. Использовалась 48-бит схема виртуальной адресации, расширенная с выходом спецификации PA-RISC 2.0 до 64-бит. Первые серийно выпускаемые ЦП уже соответствовали спецификации PA-RISC 1.1, наиболее существенным отличием от первой версии было использование раздельных шин и кэшей для команд и данных.
Первым ЦП архитектуры PA-RISC стал РА-7000, анонсированный в 1989 г. Его тактовая частота достигала 66 МГц при двухслойном 1,0-мкм технологическом процессе. Он располагал только одним пятистадийным целочисленным конвейером в составе Е-box, на который были также возложены функции А-box. Был предусмотрен (факультативно) и внешний математический сопроцессор. Подключались внешние асинхронные I-cache и D-cache размером до 256 Кбайт каждый, причем ширина шины к I-cache составляла 32 бит, а к D-cache — 64 бит. Каждый кэш был оснащен TLB, емкость которого равнялась 96 записям. Работа в многопроцессорном режиме предусмотрена не была.
Выпущенный в 1992 г. РА-7100 был уже суперскалярным RISC-процессором, располагающим, помимо одного целочисленного конвейера, одним вещественным. Соответственно отпала необходимость во внешнем математическом сопроцессоре. Благодаря переходу на трехслойный 800-нм процесс удалось поднять тактовые частоты до 100 МГц. Был увеличен и размер кэшей: I-cache до 1 Мбайт, D-cache до 2 Мбайт (оба на микросхемах асинхронной SRAM), а шина к I-cache была расширена до 64 бит, предусмотрен единый TLB на 120 записей и двухпроцессорный режим. Вскоре была выпущена незначительная модификация этого ЦП, РА-7150 (добавлена совместимость с cache bypass, а также внесены некоторые изменения в функциональной части ядра), тактовая частота которой была увеличена до 125 МГц.
В
1994 г. появился PA-7100LC (Low Cost, низкая цена), предназначавшийся для
массовых систем. Это был однокристальный процессор со встроенным контроллером
оперативной памяти FPM или EDO DRAM, со 128-бит шиной (с 16-бит каналом ЕСС).
I-cache и D-cache были сведены в один унифицированный кэш объемом до 2 Мбайт,
кроме того, был предусмотрен встроенный в ядро 1-Кбайт кэш команд. В структуру
Е-box был курсовые - 700 р.