Мультипроцессор Larrabee и его продолжение - Xeon Phi

Одной из самых спорных разработок последних 10 лет является разработка мультипроцессора Larrabee компанией Intel. Изначально позиционированный как исключительно мощная графическая карта, тем не менее программируемая как обычный мультипроцессор x86, он не выдержал борьбы с конкурентами, и после воскрес как специализированный сопроцессор для массивно параллельных вычислений Xeon Phi.

Разработка Larrabee была революционной для своего времени. Отмасштабировав большое количество приложений для количества процессорных ядер более 8, было решено разработать мультипроцессор, который позволял бы иметь на борту 64 и более процессоров, 512-битные векторные операции и, кроме того, сохранил бы совместимость с традиционной моделью вычислений. Более того - процессорные ядра долны были быть совместимы с x86, расширяя предложение линейки процессоров Intel.

Разработчикам необходимо было решить несколько важных проблем. Наиболее серьёзными проблемами можно считать доступ в память для 128 и более потоков, а также устройств исполнения шейдеров, и, масштабирование шины, предназначенной для соединения устройств находящихся внутри чипа Larrabee.

Может показаться, что две эти проблемы фактически разные взгляды на проблему пропускной способности межпроцессорной шины, но решаются они по разному. Для масштабирования шины применяется аппаратное решение, для масштабирования доступа в память - программное.

Ясно, что использование общих шин, характерное для ранних решений (стандартный протокол MESI) практически невозможно использовать, так как при любом доступе в общую память будет одна большая проблема с блокировками шины отдельным процессором. Поэтому было решено использовать двунаправленную синхронную кольцевую (!)шину. Ширина шины в одном направлении равна 512 битам, дополнительно передаётся адрес и служебная информация. Разумеется техническая возможность организации такой шины появляется только тогда, когда все ядра собраны на одном куске кремния. Каждая шина разбивается на некоторое количество регистров-остановок. Например, 64 ядра обеспечивают 64 "остановки", контроллеры кеша и памяти еще несколько десятков, устройства доступа к памяти и шине PCI Xpress - ещё дюжину остановок. Регистры-остановки фактически являются простыми буферами-защёлками, работающими синхронно, что позволяет разделять на шине транзакции от разных процессоров, количество же разделяемых транзакций равно числу остановок. Две кольцевые шины, направленные "по часовой стрелке" и "против часовой стрелки", увеличивают ширину потока в два раза. Тактовая частота шины может существенно повыситься, так как расстояния между регистрами-остановками и приёмными и передающими буферами устройств крайне малы. Таким образом, блокировка сменяется на ожидание пустого слота на текущем регистре-остановке.

Картинка из англоязычной презентации производителя иллюстрирует концепцию.

Основное достоинство такой шины - её отличная масштабируемость для большого количества потребителей на шине, высокая скорость и способность распределять полезную нагрузку относительно простым способом (все свободные слоты на шине можно достаточно эффективно распределить). Естественно, поддержка когерентности кеш-памяти никуда не исчезает, просто видоизменяется, но производительность выростает существенно. Таким образом, Larrabee примечательна в первую очередь отличной пропускной способностью внутренней шины.

Однако имеются другие проблемы. Более-менее простые операции с общей памятью необходимо расчитывать так, чтобы в учёт брались характеристики кеш-памяти. Иначе масштабируемость алгоритма будет заканчиваться на количестве ядер равном четырём.

Рассмотрим следующий рисунок, показывающий масштабируемость алгоритмов на Larrabee на большом количестве ядер.

Естественно, что простым распараллеливанием подобный эффект получить нельзя. Во-первых, должен быть приличный объём обрабатываемых данных. Во-вторых, количество данных, обрабатываемых одним процессором, должно быть не менее размера страницы основной памяти - 4Кбайт. Данные должны быть соответствующим образом распределены. Естественно, что приличное качество распараллеливания можно получить исключительно на хорошо переработанных алгоритмах, что требует высокой квалификации разработчика, измерений производительности и стоит очень дорого. Поэтому овчинка должна стоить выделки.

Как пример - масштабируемость реальных игр на Larrabee.

В отличие от процессоров Intel P4, Intel Core - Larrabee не имеет хороших предсказателей предвыборки данных из памяти. Иметь большое количество автоматических предсказателей - обозначает перегружать шину запросами. Поэтому контроллер кеш-памяти имеет сопроцессор, позволяющий осуществлять предвыборку данных из памяти, и не только линейные массивы, но и сложные структуры (списки). Программирование контроллера предвыборки является тяжелой затеей, требующей высокой квалификации и приличного времени, а также последующего анализа производительности. Это плата за масштабирование архитектуры.

С учётом трудностей работы с памятью в принципе можно достичь 90% загрузки процессоров, но не всегда и не везде. Поэтому программирование Larrabee является тяжелой задачей, чем-то сходной с планированием обработки данных шейдерными устройствами на видеокартах и требует высокой квалификации и длительного времени.

Архитектурные особенности ядер Larrabee

Каждое вычислительное ядро Larrabee является версией процессора класса Pentium P54 (самый первый Pentium), оснащённым векторным вычислительным устройством, позволяющим обрабатывать 16 32-битовых чисел или 8 64-битовым чисел (целочисленных и с плавающей запятой). Поддержаны 4 потока исполнения.

Одновременно процессор может исполнять 2 инструкции. Поддерживаются инструкции x87. Есть кеш-память первого уровня (32 Кбайт инструкций и 32 Кбайт данных). Кеш-память второго уровня составляет 512 Кбайт.

На следующем рисунке показан конвейер процессора. Конвейер содержит всего пять-шесть ступеней для скалярного конвейера и отдельный векторный конвейер до 12 ступеней.

Векторные инстукции Larrabee в отличии от инструкций х86 трёхоперандные. Для реализации условного исполнения (вместо переходов) используются 16 масочных регистров, применяемых к регистру-приёмнику. Каждый бит маски разрешает запись в каждый элемент вектора. Имеется богатый набор логических инструкций для операций над масочными регистрами и команды пересылки данных между основным регистровым файлом и масочными регистрами. Следующая команда складывает векторный регистр 1 с векторным регистром 2 и записывает результат в векторный регистр 3 согласно маске в масочном регистре номер 4.

Поскольку общая архитектура Larrabee масштабируема, простое "нанизывание" на кольцевые шины процессорных ядер, контроллеров кеш, контроллеров доступа к динамической памяти и шин вввода-вывода позволяет строить любые вычислительные структуры, например как показано на рисунке.

Спасибо за внимание!