[Перевод] Суперкомпьютер Эльбрус-3
История Эльбрус-3
В период с 1984 по 1985 год, когда завершалась разработка первых процессоров «Эльбрус-2», команда Эльбруса под руководством Бориса Арташесовича Бабаяна приступила к предварительным работам над машинами следующего поколения. В 1985 году ИТМиВТ получил государственный заказ на проектирование и создание машины с теоретической максимальной производительностью в 10 ГФлопс. Основные требования к «Эльбрусу-3» оставались такими же, как и к «Эльбрусу-1» и «Эльбрусу-2». Особое внимание уделялось высокой производительности как в научных, так и в универсальных вычислениях, надёжности и совместимости программного обеспечения с ранними моделями «Эльбруса».
В конструкции «Эльбруса-1» и «Эльбруса-2» присутствовал ряд недостатков, которые делали их неподходящими в качестве основной машины с требуемой производительностью, необходимой в государственном применении. Помимо архитектурных ограничений в производительности, требовалось получать больше информации о выполнении программного кода и зависимостях команд и данных в момент исполнения, которая не была доступна динамическому планировщику в момент исполнения.
Планировщик мог учитывать в лучшем случае до 32 инструкции наперёд (общее количество буферных станций, содержащих инструкции и операнды или адреса операндов в каждом функциональном блоке). Часто этого было недостаточно, особенно в случае передачи условного управления (ветвления кода). Более того, динамическое планирование существенно затрудняло отладку. Невозможно было статически определить точный порядок исполнения инструкций. Вариативность в планировании одного исполнения к другому также влияли на показатели производительности. Бабаян отмечает, что ему было крайне трудно демонстрировать работу системы приёмной комиссии по причине того, что не удавалось добиться повторяемости результатов измерения производительности. По этим причинам было решено использовать конвейерные функциональные блоки и сосредоточиться на статическом планировании исполнения команд.
Для более строгого контроля над исполнением кода и большого объёма данных о зависимостях команд, присутствующих в программе, разработчики стали рассматривать возможность предоставления компилятором вспомогательной информации о каждом этапе компиляции и попытаться управлять им (Использование профиля в современном LCC?). В итоге, компилятор должен был бы обладать глубокими сведениями о времени выполнения команд, времени доступа к памяти и задержках передачи данных при планировании выполнения с высокой скоростью и широким уровнем детализации. Изначально разработчики не были уверены в возможности создания такой машины, но их вдохновил опыт компании Floating-Point Systems, Inc. (FPS), которая разработала матричные процессоры (сопроцессор), который предоставлял программистам детальный контроль над планированием работы каждого функционального блока.
Во многом благодаря усилиям конструкторов и настойчивости ИТМиВТ, к 1984–1985 годам Министерством электроники (Минэлектронпром) продвинулась разработка серии логических матриц И-300Б на основе ЭСЛ с 1500 вентилями на кристалле, которые инженеры могли бы применить при проектировании будущих машин.
БМК И-300Б
Это были микросхемы с минимальной средней задержкой в 400 — 800–900 пикосекунд, что могло обеспечить выполнение процессора с тактовым периодом в 10 наносекунд (100 МГц).
Первый эскиз проекта «Эльбрус-3» представлял собой классический векторно-конвейерный процессор. Даже при такте всего в 10 наносекунд, обычный векторный конвейерный процессор, выполняющий две команды за такт, теоретически мог бы достичь максимальной производительности всего лишь 200 МФлопс. Чтобы достичь 10 ГФлопс, потребовалось бы объединить 50 таких процессоров в единую систему! В один процессор можно было бы встроить больше каналов, но количество задач, при решении которых эффективно использовалось бы большее количество конвейеров, было ограничено. Требовалось, чтобы «Эльбрус-3» обладал высокой производительностью не только в научных приложениях, но и в приложениях общего назначения. Поэтому чистый векторно-конвейерный подход был отвергнут. [1]
Чтобы удовлетворить требованиям «Эльбруса-3» и обеспечить более точный контроль над выполнением, разработчики внедрили архитектуру с Очень Длинными Машинными Словами (**VLIW**, англ. *Very Long Instruction Word*). **VLIW** — это один из трёх подходов к организации параллельных вычислений, описанных в книге *Джоша Фишера: Параллелизм уровня Инструкций*. [2] Другие два подхода — суперскаляр и поток данных. Эти три подхода отличаются тем, как они определяют зависимости между инструкциями и кто отвечает за планирование — программист или компилятор, в зависимости от конкретной архитектуры. В подходе VLIW эту задачу берёт на себя компилятор. В суперскалярном подходе, на примере Эльбруса-2 (стековая система команд), планирование осуществляется на аппаратном уровне. В терминологии VLIW основной базовой единицей вычислений, такой как сложение, загрузка памяти и переходы, называются микрооперациями (слоги). Они соответствуют инструкциям в традиционных последовательных архитектурах. Инструкция VLIW представляет собой набор микроопераций, которые должны выполняться одновременно. Компилятор планирует программу, формируя инструкции из микроопераций, которые могут выполняться одновременно.
Хотя в таком подходе отказались от сложных безадресных стековых инструкций, они всё же предлагают эффективные методы повышения производительности. В процессе разработки «Эльбруса-2» разработчики продолжали следовать ранее установленным принципам, которые были характерны для всего семейства «Эльбрус». Это включало крупнозернистую многопроцессорную обработку, модульность, общую память, аппаратную поддержку языков высокого уровня и операционной системы. В Эльбрус-3 было внедрено множество функциональных блоков и аппаратных меток данных, что значительно расширило возможности машины. Принципы, лежащие в основе дизайна, были основаны на следующих требованиях:
Обеспечение высокой производительности и энергоэффективности;
Переносимость программного обеспечения между поколениями компьютеров «Эльбрус»;
Поддержка большого количества системного и прикладного программного обеспечения.
Раннее решение о написании всего программного обеспечения на языке высокого уровня дало разработчикам свободу в случае изменения архитектуры отдельных процессоров.
В то же время, поскольку на процессорах «Эльбрус-2» применялся процедурно-ориентированный язык программирования Эль-76, для Эльбруса-3 также было необходимо сохранить возможность его применения. Это требование стало основной причиной различий между подходами «Эльбруса» и западными VLIW-процессорами.
После краткого экскурса в архитектуру «Эльбруса-3», мы проведём сравнительный анализ этого процессора с двумя западными коммерческими реализациями VLIW: Cydra 5 от Cydrome Inc. и Trace от Multiflow Inc.
Организация Эльбрус-3
Чтобы достичь производительность в 10 ГФлопс, Бабаян и его коллеги разработали сильносвязанный мультипроцессор, представленный на рисунке 1. [1, 2]
Рис. 1. Структура Эльбрус-3
Он состоит из 16 процессоров, каждый из которых оснащён семью конвейерными функциональными блоками, c тактовой частотой до 10 наносекунд. Результаты моделирования на уровне вентилей и трассировки показали, что для обеспечения необходимой передачи данных требуется 12,5 наносекунд (80 МГц) на каждой стадии. Таким образом, каждый процессор имеет теоретический пик производительности в 560 МФлопс, а в полной конфигурации составляет 8,96 ГФлопс.
Конфигурация также включает в себя восемь блоков основной памяти, восемь процессоров ввода-вывода, 16 телекоммуникационных процессоров, магнитные диски и прочие устройства ввода-вывода. Общий объём локальной памяти составляет 18 МБайт (2 Мегаслова) в каждом процессоре, распределённых по 32 банкам. Объём всей основной памяти составляет 288 МБайт (32 Мегаслова), а время цикла — 400 наносекунд. Секция основной памяти с 16 портами чередуется на 128 банках данных с циклом, составляющим 35 тактов.
Данные передаются между буферами центрального процессора, локальной и основной памятью, а также системой ввода-вывода через через коммутатор ввода-вывода. Каждый из восьми процессоров ввода-вывода обеспечивает скорость передачи данных 200 МБайт в секунду с общей пропускной способностью в 1600 МБайт в секунду.
Процессор
В архитектуре Эльбрус-3 (Рис. 2) предусмотрены 9 функциональных блоков: два сумматора, два умножителя, один делитель, два блока загрузки/хранения и два логических блока. Для упрощения структуры межсоединений, делитель и один из логических блоков были объединены с блоком загрузки/хранения, что позволило сформировать два составных блока.
Рис. 2. Микроархитектура процессора Эльбрус-3
В итоге, в системе (Рис. 3) имеется семь функциональных блоков, соединённых коммутатором 15×16, все блоки имеют конвейер. Центральный процессор включает в себя Блок Команд (БК, IU), Блок Индексации (БИ, InU), Блок Управления кэшем/памятью (MMU), Локальную память процессора (LM) и Буферную Память (БП, BM). Последняя состоит из стекового буфера на 1024 слова и буфера элементов массива на 512 слов. В Эльбрус-3 используются те же механизмы кэш-когеренции, что и в Эльбрус-2.
Рис. 3. Структура процессора Эльбрус-3
Операнды для функциональных блоков могут быть следующими:
семь функциональных модульных выходов;
семь синхронных буферов результатов хронологии;
многопортовый стековый буфер;
многопортовый буфер элементов массива;
литералы из блока команд.
Кто повлиял на разработчиков Эльбрус-3
На разработчиков «Эльбруса-3» значительное влияние оказали западные разработки горизонтальных архитектур. В 1981 году компания FPS представила объединённый матричный процессор AP-120B, который содержал два два арифметических модуля с плавающей запятой, получающих операнды данных из разных источников. [4] Инструкции, выдаваемые каждый такт, содержат поля, управляющие работой всеми блоками компьютера в моменте этого такта. Эти устройства включали в себя два арифметических блока, АЛУ для вычисления адресов, счётчик циклов и индексов, портов ввода-вывода, банков памяти и т. д. Программирование AP-120B требовало очень подробного понимания планирования тактов на низком уровне, что привело к тому, что лишь немногие специалисты, преимущественно из FPS, занимались непосредственным программированием системы. Большинство пользователей ограничивалось использованием библиотеки подпрограмм, предоставляемых FPS. Таким образом, несмотря на то что машина была спроектирована с учётом обеспечения высокой производительности, её использование оказалась достаточно негибким и сложной при программировании. В целом, процессор с подключённым матричным процессором представляет собой более сложную в использовании и менее эффективную систему по сравнению с обычной машиной, поскольку программисту приходится управлять двумя устройствами и явно перемещать данные между ними. Способ передачи данных является медленным относительно скорости обработки подключённого процессора, что делает его пригодным только для задач, в которых соотношение вычислений и данных является значительным.
В начале 1980-х годов Джозеф Фишер занимался разработкой компиляторов для горизонтальных архитектур, включающих в себя планирование трассировки. Планирование трассировки представляет собой метод глобального сжатия, изначально разработанный для генерации длинных команд микрокода из последовательного исходного кода (горизонтального микрокода). При использовании планирования трассировки компилятор «угадывает» поток управления программой во время её выполнения, чтобы последовательности кода могли выполняться заранее и параллельно. Планирование трассировки позволяет реорганизовать код, сохраняя при этом корректное состояние машины для внешнего мира. В случае неверного предположения и необходимости возврата к исходному коду компилятор вставляет дополнительный код («код компенсации») для восстановления правильного состояния. Очевидно, что система работает наиболее эффективно, когда компилятор делает правильные предположения. Преимуществом компиляторов Фишера было то, что они выполняли планирование трассировки, обеспечивая высокую производительность и эффективность кода. Компилятор проводил тщательный анализ всей программы и получил возможность свободно вносить изменения в код по всей её структуре, не нарушая при этом целостности основных блоков программы, по крайней мере, на уровне планирования. Большая часть результатов работы Фишера была включена в серию компьютеров VLIW Trace, разработанную компанией Multiflow, Inc. в конце 1980-х годов.
Работы Фишера и FPS оказали значительное влияние на разработчиков Эльбруса. Последние не стремились слепо копировать западные наработки, а тщательно изучали их, чтобы выявить сильные стороны и применить их в своей работе. В процессе разработки были выявлены как сильные, так и слабые стороны. В частности, разработчикам не пришлись по вкусу сложность программирования и негибкость матричных процессоров FPS. Кроме того, компенсационный код Фишера привёл к значительному увеличению размера исполняемого файла и замедлял выполнение при неверном «предположении». Однако наиболее значимым достижением западной разработки стала демонстрация возможности применения подхода VLIW, что вселило в разработчиков «Эльбруса» уверенность в продолжении работы.
В результате третьего этапа исследований VLIW западом был создан суперкомпьютер Cydra 5 в Cydrome, Inc. Как мы увидим далее, существует значительное сходство между архитектурными особенностями этой машины и «Эльбрусом-3». Однако «Эльбрус-3» был почти полностью спроектирован до 1989 года, когда инженеры «Эльбруса» впервые узнали о Cydra 5. Инженеры Эльбруса использовали многие из тех же конструктивных решений, но независимо от работы Cydra. Это яркий пример параллельной эволюции технологий.
Сравнение Эльбруса-3 с западными VLIW компьютерами
Планировщик
Подобно Trace и Cydra 5, компилятор Эльбрус-3 выполняет глобальный анализ исходной программы. Как и Trace, он анализирует по одной процедуре или модулю за раз в поисках критического пути вычисления. Компилятор создаёт зависимость от данных, управляющую зависимость, и граф вызова процедура, и пытается обнаружить скрытые зависимости между адресами, которые должны быть вычислены во время выполнения.
Однако, несмотря на преимущества, которые предоставляет подход, направленный на достижение большей оптимизации, разработчики Эльбруса-3 не применили глобальный подход к планированию. Компилятор Эльбруса, будучи вынужденным использовать один и тот же код для всех вызовов данной процедуры, применяет процедурно-ориентированную модель статического планирования (PSS), в рамках которой перемещение кода ограничено пределами процедуры. Таким образом, разработчики «Эльбруса-3» прибегли к методам уменьшения управляющих зависимостей в условных переходах и вызовах процедур, отличающимся от тех, что используются в Trace и Cydra 5.
Фундаментальные причины создания PSS кроются в особенностях проектирования и разработки среды разработки под Эльбрус, которые отличаются от таковых у Trace и Cydra 5. В отличие от американских компьютеров, «Эльбрус-3», как и «Эльбрус-1» и «Эльбрус-2», создавался почти исключительно для военных нужд. Двумя ключевыми требованиями были высокая производительность и надёжность.
В данных обстоятельствах разработчики решили продублировать функциональные блоки, например использовали дорогостоящий матричный коммутатор и распределённую регистровую память для получения промежуточных результатов. Также были использованы многопортовые регистровые файлы. Наличие большого количества функциональных блоков позволило параллельно выполнять множество операций из альтернативных базовых блоков, что, в свою очередь, позволило избежать необходимости «угадывать» правильную ветвь, как это происходит при трассировке. Компилятор Эльбрус-3 не выбирает наиболее вероятную ветвь выполнения кода программы и не задействует механизм компенсации для восстановления корректности программы в случае ошибочных предсказаний. Вместо этого он реализует параллельное выполнение нескольких возможных ветвей одновременно. Переход к одной из ветвей подразумевает использование результатов, полученных по действительному пути. Более подробно о стратегии планирования ветвлений можно узнать из работы [2]. В ней также показано, что Эльбрус-3 и Cydra 5 обеспечивают улучшенное управление памятью, поскольку операции доступа в альтернативных ветках выполнения эквивалентны (хотя и имеют некоторые различия в реализации).
Для обеспечения гибкости и портируемости программного обеспечения, «Эльбрус-3» должен был поддерживать язык программирования Эль-76 — язык, который использовался во всех ранних моделях компьютеров Эльбрус. Ключевым элементом языка Эль-76 является процедура, представляющая собой одновременно составной элемент программы и базовую вычислительную единицу. Разработчики должны были сохранить возможность построения программы из отдельных, заранее спланированных процедур. При этом было необходимо избежать дублирования кода. Поэтому перемещение кода ограничивается границами процедуры, и при каждом вызове процедуры используется один и тот же процедурный код. В отличие от этого, в системах Trace и Cydra 5 применяется другой подход, основанный на встроенной процедуре замены.
Конвейеризация циклов
Одним из ключевых целей проекта «Эльбрус-3» было повышение производительности векторных операций применимых, например, в научных приложениях. При этом разработчики стремились обеспечить эффективность работы в широком спектре задач. Аналогичная задача стояла и перед создателями Cydra 5 — они стремились разработать машину, способную справляться с большим разнообразием работы, а не только с численными вычислениями. Важным аспектом проектирования было создание машины, способной эффективно обрабатывать циклы с повторениями и условными переходами. Такие циклы обычно не поддаются векторизации на традиционных векторно-конвейерных машинах, что ограничивает их вычислительный потенциал.
Как отмечается в работе [2], разработчики обеих машин независимо друг от друга пришли к схожим решениям. Их подход основан на возможности сохранения и доступа к нескольким контекстам итераций цикла в процессе его выполнения. В рамках каждой итерации цикла происходит динамическое выделение набора регистров, известного как фрейм итерации, в пределах буфера элементов циклического массива. Все переменные, обрабатываемые в ходе итерации, помещаются в этот фрейм. В него могут входить как элементы массива или вектора, так и скалярные значения. Доступ к этим переменным осуществляется посредством регистра базового цикла, каждый из которых содержит указатель на итерацию и её размер. Любой буфер элемента массива представляет собой комбинацию команды перемещения и указателя.
Быстрый произвольный доступ к векторным элементам обладает двумя ключевыми преимуществами. Во-первых, он позволяет эффективно обрабатывать векторы, что делает код более эффективным и понятным. Во-вторых, это способствует повышению производительности при обработке массивов, что особенно важно для задач, требующих выполнения большого количества операций с массивами. Применение такого регистрового файла обеспечивает высокую производительность векторной обработки, сопоставимую с производительностью векторных суперкомпьютеров. Однако, в отличие от последних, в «Эльбрусе-3» возникают дополнительные издержки, связанные с добавлением смещения к базовому регистру цикла.
С другой стороны, произвольный доступ к элементам вектора становится гораздо более гибким, чем в случае векторных регистров. Во-первых, размер итерационного фрейма и расположение каждой переменной цикла внутри него известны во время компиляции. Во-вторых, многократные итерации и доступ к фреймам могут быть выполнены за один такт. В результате к фреймам, расположенным в буфере элементов массива, можно получить доступ к любой переменной цикла. Метод итерационного фрейма превосходит векторные регистры в циклах обработки с повторениями.
В добавок, он предоставляет механизмы для поддержки операций на нескольких итерациях, что делает его более универсальным. Во-первых, в «Эльбрусе» реализованы специализированные аппаратные механизмы, которые обеспечивают эффективную обработку вложенных циклов. В то же время в Trace отсутствует архитектурная поддержка циклов, и их программная реализация осуществляется путём развёртывания. В Cydra 5, подобно «Эльбрусу-3», имеется аппаратная поддержка, предназначенная для выделения регистров в буфере элементов массива на каждой итерации. Эта поддержка позволяет сохранять журнал итерационных фреймов, одновременно обращаться к нескольким фреймам и предварительно загружать данные для следующей итерации. Тем не менее, в Cydra 5 отсутствует специализированное оборудование для обработки вложенных циклов.
Система команд
Инструкции в процессоре Эльбрус-3 представляют собой сложный комплекс операций, организованных в особом формате. Эти операции могут быть разной точности: с половинчатой (32-разрядные данные и 4-разрядный тег), с одинарной (64-разрядные данные и 8-разрядный тег), предусмотрены операции для работы с данными двойной точности (128 бит). Принцип кодирования команд в Эльбрус-3 аналогичен подходу, используемому Trace: машинные инструкции фиксированной длины представлены в памяти в виде переменной длины, которая проходит упаковку. Упакованная команда «Эльбрус-3» может содержать от одного до четырёх 72-разрядных слов. Некоторые микрооперации в инструкции имеют фиксированные позиции, в то время как другие могут варьироваться. Длина распакованной инструкции составляет 504 бит, и каждая операция занимает строго определённое место.
Например, процессор Cydra 5 использует особоый формат команд, позволяющий выполнять шесть операций на шести функциональных блоках с помощью одной команды. Формат Мультислова (MultiOp) состоит из семи частей, по одной для каждой микрооперации. Длина формата Мультислова (Широкой команды) составляет 256 бит [5], что позволяет разместить в каждом 256 битном командном слове несколько одиночных микрокоманд (UniOp). Это решение было разработано для более эффективной обработки фрагментов кода с ограниченным параллелизмом.
Механизмы синхронизации и обработка исключений
Благодаря общей памяти многопроцессорного варианта Эльбруса-3, в некоторых случаях статическое планирование вычислений может быть изменено во время выполнения.
К таким случаям относятся:
перекрывающееся выполнение двух независимо запланированных процедур;
взаимодействие с асинхронной памятью;
обработка исключений.
Первый вариант является особым для Эльбруса и связан с необходимостью поддерживать раздельную компиляцию и выполнение процедур, потенциально использующих один и тот же исполняемый бинарник; остальные являются традиционными проблемами для любой архитектуры VLIW. В отличие от Trace и Cydra 5, в Эльбрус-3 используется общая, разделяемая память, планирование которой осуществляется нестатически. У разработчиков не было выбора, поскольку статическое планирование памяти невозможно для мультипроцессоров с общей памятью. Конкретные решения этих проблем приведены в [2].
Производительность
На момент написания данной статьи (1992 год), полноценный и функционирующий процессор «Эльбрус-3» ещё не был создан, поэтому невозможно было с точностью измерить его реальную производительность. Тем не менее, был проведён бенчмарк на эмуляции однопроцессорного варианта «Эльбрус-3» (10 нс), с помощью теста Livermore, написанного на языке FORTRAN, который запускался на процессоре «Эльбрус-2».
На рисунке 4 представлены результаты сравнения производительности с реальным Cray X-MP/48 (однопроцессорная конфигурация) в одинаковых бенчмарках. Хотя достоверность результатов моделирования может быть предметом дискуссии, но результаты теста демонстрируют, что «Эльбрус-3» способен был выполнять значительно больше операций за такт по сравнению с Cray X-MP. Кроме того, он демонстрировал более стабильную производительность во всех областях применения по сравнению с теоретической пиковой производительностью (измеренную средним гармоническим методом).
Рис. 4. Результаты сравнения производительности Эльбрус-3 с Cray X-MP/48
Эльбрус-3 | Cray X-MP/48 | |
---|---|---|
Среднее гармоническое | 151.06 | 15.26 |
Максимум | 523 | 175 |
Минимум | 26 | 3.11 |
Число процессоров | 1 | 1 |
Период такта (нсек) | 10 | 9.5 |
Пиковая производительность, МФлопс (1 процессор) | 700 | 210 |
Заключение
В 1990 году был завершёно проектирование блока умножения. В 1991 году была завершена подготовка всей необходимой документации, и на Загорском электромеханическом заводе, расположенном под Москвой, было создано несколько прототипов процессоров. Однако сборка несколько задержалась из-за ожидания поставок необходимого оборудования от заводов-изготовителей. На момент написания данной статьи «Эльбрус-3» находился на стадии отладки оборудования. В течение 1992 года финансирование проекта оставалось стабильным, хотя и не всегда соответствовало необходимым потребностям, но, а затем проект был закрыт из-за невозможности финансирования.
Ссылки
Источник оригинала
Дополнительная информация об Эльбрус-3
Эльбрус (семейство компьютеров)
От «Эльбруса-3» — к «Эльбрусу-2000»
[1] — Fisher, Joseph A., Rau, B. Ramakrishna, «Instruction-Level Parallel Processing,» Science v. 253, 5025 (Sep. 13, 1991), 1233–1241.
[2] — Dorozhevets, M. N., Wolcott, P., «The El«brus-3 and MARS-M: Recent Advances in Russian High-Performance Computing,» The Journal of Supercomputing 6 (1992), 5–48
[3] — Babayan, B. A., Bocharov, A. V., Volin, V. S., Gavrilov, S. S., Groshev, A. S., Gruzdov, F. A., Yeremin, M. V., Zotov, S. M., Plotkin, A. L., Pshenichnikov, L. Ye., Ryabov, G. G., Chudakov, M. L., Shevyakov, V. S., Multiprocessor Computers and the Methods of their Design., Smirnov, Yu, Ed., Vysshaya shkola, Moscow, 1990.
[4] — Hockney, R. W., Jesshope, C. R., Parallel Computers, 2nd ed., Adam Hilger, Bristol, 1988.
[5] — Rau, B. Ramakrishna, Yen, David W. L., Yen, Wei, Towle, Ross A., «The Cydra 5 Departmental Supercomputer. Design Philosophies, Decisions, and Trade-offs,» Computer (IEEE) v. 22, 1 (Jan., 1989), 12–35.