Начиная разработку процессора Niagara, инженеры Sun Microsystems исходили из следующего предположения: «При конструировании современных процессоров практически все делается неправильно, а единственно верным решением станет возврат к простым идеям ранней микропроцессорной эры» .

Эволюция никогда не идет по одному, магистральному, пути — организмам приходится адаптироваться к разным условиям, причем иногда оказывается, что более «примитивный» и менее требовательный предшественник лучше приспособлен к агрессивной среде, нежели его развитый потомок. Точно так же и в эволюции процессоров иногда наблюдается возврат к идеям, которые, казалось бы, давно уже принадлежат прошлому. Одни производители микропроцессоров меряются мускулами и наращивают мощь, следуя по пути, истоки которого были заложены 10–15 лет назад, в то же время другие пытаются найти принципиально новые решения, в поисках вдохновения обращаясь к архитектурным принципам эпохи, предшествующей эре Pentium.

Из прошлого в современность

Как и многие новшества в мире микропроцессоров, серия Niagara берет свое начало от академического исследовательского проекта, а именно проекта Hydra, начатого в конце 90-х годов, в рамках которого профессор Кунле Олукотун из Стэнфордского университета предложил идею создания принципиально нового микропроцессора. Для реализации своих идей профессор основал компанию Afara Websystems, которая позднее была выкуплена Sun Microsystems, а в 2002 году появился процессор Niagara, представлявший собой урезанный вариант Hydra (тогдашняя 90-нанометровая технология изготовления процессорных кристаллов не позволяла реализовать некоторые идеи в полном объеме). Архитектура процессора Niagara действительно воскрешала идеи конца 80-х: на восемь ядер, способных выполнять только целочисленные операции, приходился один разделяемый модуль выполнения для операций над вещественными числами. В процессоре был реализован классический пятистадийный конвейер с дополнительной стадией выбора потока, «изюминкой» многопоточного микропроцессора Hydra (рис. 1).

За один такт в микропроцессоре Niagara выполняется только одна инструкция, а его ключевой особенностью является способность управлять несколькими потоками одновременно (в первом процессоре семейства каждое ядро могло управлять четырьмя потоками). Однако это не означает, что разные потоки будут выполняться одновременно инструкции — каждое ядро Niagara в конкретный момент времени выполняет только одну инструкцию (восемь ядер процессора могут, таким образом, выполнять восемь потоков, всего же процессор управляет 32 потоками). Каждому потоку выделяется собственный набор регистров, благодаря чему в процессе переключения между потоками не приходится тратить время на сохранение и восстановление состояния потока из оперативной памяти. Переключение между потоками выполняется с помощью алгоритма, выбирающего тот, который дольше всех ожидает своей очереди. Ресурсы потокам выделяются динамически. Если ядро задействовало все четыре потока, то при частоте работы ядра 1,2 ГГц каждый поток будет выполняться на частоте 300 МГц. Если ядро управляет тремя потоками, каждому из них достанется по 400 МГц, двум потокам — по 600 МГц, наконец, один поток получит все 1,2 ГГц.

Какие выгоды можно извлечь, располагая столь простыми средствами, — без блоков предсказания ветвлений, подвижных окон инструкций и т.п.? Рассмотрим, к примеру, задачу компенсации задержек, возникающих при обращении команд процессора к медленной оперативной памяти. Традиционным методом борьбы с задержками является переупорядочение инструкций. В то время как одна из инструкций находится в состоянии ожидания завершения длительной внешней операции, процессор может исполнять другие, результаты выполнения которых не зависят от результата инструкции, находящейся в состоянии ожидания. Процессор с внеочередным исполнением инструкций может манипулировать таким количеством последних, каким позволят размеры окна инструкций процессора. Чем больше окно, тем больше можно выполнять инструкций во «внеочередном порядке», и, следовательно, компенсировать более длительные задержки. Проблема в том, что размеры окна инструкций нельзя увеличивать бесконечно. Вместе с увеличением размеров окна возрастают сложность его реализации, количество потребляемой процессором энергии и, соответственно, количество выделяемого тепла. В процессорах Intel и AMD для борьбы с задержками применяется предсказание переходов, при котором решения о выполнении цепочки инструкций принимаются до завершения вычисления условия перехода, на основе предыдущих результатов.

В процессорах Niagara проблема задержек решается принципиально иначе. Если один из потоков «застопорился» на выполнении какой-то инструкции, процессор переключается на другой поток. Поскольку разные потоки выполняются независимо, процессору не приходится анализировать зависимости между инструкциями из разных потоков. Потоку, выполняющему инструкцию загрузки данных, присваивается наименьший приоритет. В результате, когда процессор возобновит выполнение этого потока, результаты обращения к кэшу первого уровня, скорее всего, уже будут известны, и неопределенность относительно задержек при выполнении инструкций, зависящих от загружаемых данных, будет устранена. Аналогично решается и проблема ветвлений. Найдя в потоке инструкцию перехода, процессор не пытается предсказать ветвления, а просто переключается на другие потоки до тех пор, пока условие перехода не будет вычислено.

Еще одна характерная особенность серии микропроцессоров Niagara (первый представитель которой поступил на рынок в 2005 году под именем UltraSPARC T1) — наличие встроенного криптографического модуля, реализующего на аппаратном уровне алгоритмы RSA и DSA с 2048-разрядными ключами. В процессорах Niagara 1 криптографический модуль в каждый момент времени может быть доступен не более чем одному потоку. Работа модуля выполняется в асинхронном режиме. Поток инициирует выполнение криптографической операции, сохраняя определенное значение в контрольном регистре. Далее криптографический модуль самостоятельно выполняет все необходимые действия, в том числе и обмен данными с кэш-памятью первого уровня. О завершении криптографической операции поток может узнать одним из двух способов: путем периодического опроса состояния криптографического модуля или посредством прерывания, инициируемого криптографическим модулем.

На первый взгляд многопоточная модель Niagara не может дать существенного прироста производительности. Один поток на частоте ядра процессора 1,2 ГГц может выполнять столько же работы, сколько четыре потока на частоте 300 МГц каждый, однако на практике все оказывается не совсем так. Только идеальный код может все время сохранять соотношение одна инструкция — один такт. Выполнение потока постоянно замедляется операциями ветвления, загрузки данных из кэша первого уровня или, еще хуже, загрузкой данных, которых в кэше не оказалось. В процессорах Niagara в то время, как один из потоков находится в состоянии ожидания завершения длительной операции, другие потоки могут использовать высвободившиеся такты. Разработчики смогли позволить себе снабдить процессор небольшим по объему кэшем первого уровня, поскольку промахи кэша не приводят, вообще говоря, к замедлению работы ядра. При этом они стремились обеспечить как можно большую пропускную способность системы памяти на всех уровнях. При выполнении одного потока на ядре Niagara лишь 21% тактов совершает полезную работу, тогда как при выполнении четырех потоков это число возрастает до 71%.

Поскольку первоочередной целью многопоточной архитектуры процессоров Niagara является более эффективное использование уже имеющихся ресурсов (тактов ядра), разработчики микропроцессора указывают, что при оценке эффективности чипов не следует исходить исключительно из таких параметров, как частота ядра (похожие аргументы приводят и другие разработчики современных микропроцессоров). По мнению проектировщиков Niagara, любой номинальный прирост производительности процессора следует оценивать не сам по себе, а с учетом его стоимости (прежде всего с точки зрения расхода энергии), а также того, насколько в результате возрастет производительность реальных систем, перешедших на новый процессор. Вместо термина «производительность» в оценках процессоров Niagara предлагается использовать термин «пропускная способность» (throughput performance), которая для Niagara стремится к идеалу RISC-систем — одна инструкция на такт. Развивая свой подход к оценке производительности микропроцессоров, представители Sun утверждают, что производительность серверных процессоров следует оценивать в единицах количества выполняемых инструкций на один ватт или на одну монтажную единицу (rack unit) стойки сервера.

Ограничения Niagara 1

Наличие в Niagara 1 лишь одного модуля работы с вещественными числами, связанного с остальными компонентами ядра посредством матричного переключателя, может стать узким местом. Мало того, только инициализация выполнения операции с плавающей запятой отнимает 30 тактов, а в каждый момент времени математический процессор доступен всего одному из восьми активных (по числу ядер) потоков. На практике это означает, что процессор Niagara 1 может выполнять без задержек только такой код, в котором инструкции, работающие с вещественными числами, составляют не более 2% кода программы. Многопоточная структура процессора может продемонстрировать все свои преимущества только при работе с программным обеспечением, интенсивно использующим потоки, например, для выполнения Web-приложений, на рынок которых и был нацелен микропроцессор Niagara 1. Впрочем, даже при использовании Niagara 1 для выполнения многопоточных приложений следует принимать во внимание тот факт, что ни один из потоков не должен быть критичен ко времени выполнения, поскольку именно задержки, возникающие при работе потоков, представляют собой движущий механизм многопоточности. Довольно жесткие требования к программному обеспечению, предъявляемые процессорами Niagara, привели к тому, что по-настоящему эффективной работы можно было добиться только для программ, которые разработаны для SPARC V9 (его набор инструкций поддерживает Niagara) и выполняются под управлением Solaris. Дело в том, что данная операционная система широко использует многопоточность и предоставляет развитый прикладной интерфейс программирования многопоточных приложений [1,2]. 

Новая Niagara

Переход на 65-нанометровую технологию позволил разработчикам Sun более полно реализовать идеи, заложенные в процессорах компании Afara Websystems. Процессор Niagara 2 фактически оказался ближе к прототипу серии, нежели его предшественник. Так же как и Niagara 1, он содержит восемь ядер, однако каждое ядро теперь включает в себя по два четырехпоточных конвейера; таким образом, общее число потоков, которыми может управлять Niagara 2, возросло до 64. Следует особо отметить, что удвоение числа поддерживаемых потоков достигнуто за счет удвоения числа конвейеров. Благодаря этому каждое ядро Niagara 2 может одновременно выполнять по два потока из восьми. Большее количество потоков, естественно, создает большую нагрузку на кэш-память всех уровней, однако, как уже отмечалось, архитектура процессоров Niagara такова, что общая пропускная способность системы памяти влияет на производительность процессора больше, нежели емкость кэша, а общая пропускная способность системы памяти для процессоров Niagara 2 увеличена в соответствии с возросшей производительностью.

При проектировании нового процессора разработчики Sun уделили серьезное внимание повышению производительности выполнения операций над вещественными числами. Теперь у каждого ядра процессора есть собственный модуль, который в терминологии Sun называют floating-point/graphics unit (FGU), поскольку он поддерживает расширения инструкций UltraSPARC 2.0 VIS. Возможности совместного использования FGU несколькими потоками также претерпели заметные улучшения. На деле это означает, что пропускная способность подсистемы операций с плавающей запятой, реализованной в процессорах Niagara 2, стала соответствовать практическим потребностям большинства современных приложений.

Восемь процессорных ядер Niagara 2 связаны матричным переключателем с восемью банками 16-путевого модульно-ассоциативного кэша второго уровня, общим объемом 4 Мбайт (у Niagara 1 — 3 Мбайт). Поскольку нагрузка на кэш в новом процессоре возросла вдвое, а объем кэша увеличился лишь на треть, для поддержания высокой производительности процессора разработчикам пришлось увеличить пропускную способность системы памяти. Вместо четырехканальной памяти DDR2, реализованной в Niagara 1, в новом процессоре используются четыре сдвоенных канала FBDIMM DRAM. Несколько большая по сравнению с DDR 2 энергоемкость новой подсистемы памяти с лихвой окупается приростом производительности — в 1,7 раза, по оценкам разработчиков. Изменения коснулись и буфера выборки инструкций. Процессоры семейства Niagara считывают инструкции парами (четная и нечетная). При этом четная инструкция сразу же поступает в конвейер, а нечетная сохраняется в буфере до тех пор, пока не придет ее очередь (в каждый данный момент времени в конвейере находится одна инструкция). В процессорах Niagara 1 у каждого ядра был только один буфер хранения «нечетных» инструкций. В ядре процессора Niagara 2 количество буферов инструкций увеличено до восьми (у каждого потока теперь свой буфер). В конвейере Niagara 2 появились дополнительные стадии. Конвейер целочисленных операций стал восьмистадийным (рис. 2), тогда как при выполнении инструкций, работающих с данными с плавающей запятой, конвейер насчитывает 12 стадий.

Рис. 3. Кристалл Niagara 2

При рабочей частоте ядра 1,4 ГГц Niagara 2 должен демонстрировать как минимум двукратный прирост производительности по сравнению со своим предшественником. В таких областях, как вычисления с плавающей запятой и шифрование данных, отправляемых по сети, прирост производительности должен быть еще выше. По данным Sun, производительность при выполнении отдельного потока (при полной загрузке многопоточной системы процессора), содержащего целочисленные инструкции, должна возрасти на 40%. Учитывая незначительный прирост тактовой частоты, а также тот факт, что большее количество потоков потребует более сложного механизма переключения, 40-процентный прирост производительности следует отнести на счет различных микроархитектурных улучшений. В то же время производительность приложений, нуждающихся в большом количестве вычислений с плавающей запятой, возрастет на порядок. В отношении энергопотребления показатели Niagara 2 выглядят не менее впечатляюще. По словам одного из разработчиков, Грега Грохоцки, Niagara 2 обеспечивает вдвое большую производительность на каждый затраченный ватт по сравнению с предыдущей моделью. В целом процессор Niagara 2 (рис. 3) можно рассматривать как удачную основу для построения недорогих серверов, в которых способность обрабатывать много потоков одновременно важнее высокой скорости выполнения каждого отдельного потока.

Новый камень

Между тем в Sun уже разработали первый микропроцессор следующего поколения многопоточных процессоров. Процессоры под кодовым названием Rock включают четыре блока, по четыре процессорных ядра в каждом. Каждое ядро Rock способно поддерживать одновременную работу двух потоков (всего 32 потока на процессор), кроме того, каждое ядро имеет собственный модуль для работы с вещественной арифметикой и графическими инструкциями. Каждая группа из четырех ядер будет обладать собственным кэшем первого уровня, 32 Кбайт для инструкций и 32 Кбайт для данных. Кэш второго уровня также будет разделен на четыре сегмента по 512 Кбайт.

Одна из новинок Rock — технология Scout Threading, которая представляет собой следующий шаг на пути борьбы с задержками, возникающими при обращении к медлительным компонентам системы. Уже говорилось, как многопоточность процессоров семейства Niagara позволяет во многих случаях свести на нет эффект задержек, однако, это не может помочь в ситуации, когда процессор выполняет только один поток. Технология Scout Threading предназначена для устранения задержек, возникающих при выполнении одного потока, когда эти задержки не могут быть «заполнены» кодом других потоков. Суть технологии заключается в том, что при возникновении задержки процессор продолжает спекулятивное выполнение инструкций (результаты такого выполнения не влияют на состояние процессора). Если в процессе спекулятивного выполнения встречается инструкция, ссылающаяся на область внешней памяти, система проверяет, можно ли на данном этапе вычислить ее адрес. Если адрес может быть определен, то выполняется упреждающая выборка данных. Упреждающая выборка и спекулятивное выполнение команд используются также и для повышения производительности микропроцессора Rock в многопоточном режиме.

В Sun рапортовали об успешном запуске операционной системы Solaris 10 на микропроцессоре Rock. «Система запустилась и не сожгла ни процессор, ни плату», — так сообщил об этом Джефф Томас, один из руководителей подразделения разработки. Как и в случае с процессорами Niagara, Rock и операционная система Solaris существуют в состоянии симбиоза. Запуск операционной системы на новом процессоре означает, что Sun, скорее всего, уложится в заявленные сроки и представит новый процессор (его производство возложено на компанию Texas Instruments) широкой публике во второй половине 2008 года.

***

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

Литература

  1. Harlan McGhan, Niagara 2 Opens the Floodgates. Microprocessor Report Newsletter.
  2. Multithreading in the Solaris? Operating Environment. A Technical White Paper, Sun Microsystems.