4. Введение в архитектуру «Эльбрус»

4.1. Введение

Архитектура «Эльбрус» - оригинальная российская разработка. Ключевые черты архитектуры «Эльбрус» - энергоэффективность и производительность, получаемая при помощи задания явного параллелизма операций.

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

Компилятор способен анализировать исходный код гораздо тщательнее, чем аппаратура RISC/CISC процессора, и находить независимые операции в существенно большем диапазоне. Поэтому в архитектуре Эльбрус больше параллельно работающих исполнительных устройств, чем в традиционных архитектурах.

4.2. Характеристики микропроцессоров «Эльбрус»

Ниже представлены характеристики актуальных моделей микропроцессоров «Эльбрус».

Характеристики микропроцессора «Эльбрус-4C»

Характеристика

Значение

Тактовая частота

800 МГц

Пиковая производительность микросхемы, Gflops (64 разряда, двойная точность)

25

Пиковая производительность микросхемы, Gflops (32 разряда, одинарная точность)

50

Кэш-память данных 1-го уровня, на ядро

64 КБ

Кэш-память команд 1-го уровня, на ядро

128 КБ

Кэш-память 2-го уровня, универсальная, на ядро

2 МБ

Организация оперативной памяти

DDR3-1600 ECC, 3 канала, до 38,4 ГБ/с

Возможность объединения в многопроцессорную систему с когерентной общей памятью

До 4 процессоров

Каналы межпроцессорного обмена

3, дуплексные

Пропускная способность каждого канала межпроцессорного обмена

12 ГБ/с

Площадь кристалла

380 мм2

Число транзисторов

986 млн.

Энергопотребление

45-60 Вт


Характеристики микропроцессора «Эльбрус-8C»

Характеристика

Значение

Тактовая частота

1300 МГц

Число ядер

8

Пиковая производительность микросхемы, Gflops (64 разряда, двойная точность)

125

Пиковая производительность микросхемы, Gflops (32 разряда, одинарная точность)

250

Кэш-память данных 1-го уровня, на ядро

64 КБ

Кэш-память команд 1-го уровня, на ядро

128 КБ

Кэш-память 2-го уровня, универсальная, на ядро

512 КБ

Кэш-память 3-го уровня

16 МБ

Организация оперативной памяти

DDR3-1600 ECC

Количество контроллеров памяти

4

Возможность объединения в многопроцессорную систему с когерентной общей памятью

До 4 процессоров

Каналы межпроцессорного обмена

3, дуплексные

Пропускная способность каждого канала межпроцессорного обмена

12 ГБ/с

Площадь кристалла

321 мм2

Число транзисторов

2.73 миллиарда

Энергопотребление

75—90 Вт


Характеристики микропроцессора «Эльбрус-8CB»

Характеристика

Значение

Тактовая частота

1500 МГц

Число ядер

8

Пиковая производительность микросхемы, Gflops (64 разряда, двойная точность)

288

Пиковая производительность микросхемы, Gflops (32 разряда, одинарная точность)

576

Кэш-память данных 1-го уровня, на ядро

64 КБ

Кэш-память команд 1-го уровня, на ядро

128 КБ

Кэш-память 2-го уровня, универсальная, на ядро

512 КБ

Кэш-память 3-го уровня

16 МБ

Организация оперативной памяти

DDR4-2400 ECC, 4 канала, до 68,3 Гбайт/с

Количество контроллеров памяти

4

Возможность объединения в многопроцессорную систему с когерентной общей памятью

До 4 процессоров

Каналы межпроцессорного обмена

3, дуплексные

Пропускная способность каждого канала межпроцессорного обмена

12 ГБ/с

Площадь кристалла

333 мм2

Число транзисторов

2.78 миллиарда


4.3. Переход от скалярных процессоров к конвейеризированным и суперскалярным

Простейший скалярный процессор выполняет одну машинную команду за такт: пока не заканчивается предыдущая, следующая команда не начинает выполняться. При этом команды выстроены в цепочку, порядок которой задан в машинном коде. Но при этом совершенно необязательно, чтобы следующая команда пользовалась результатом предыдущей. Это позволило еще в середине 20 века выработать два пути ускорения исполнения команд.

Первый подход обозначен термином конвейеризация.

В нём используется принцип разбиения команды на несколько последовательных стадий: прочитать команду из памяти, декодировать ее, прочитать параметры этой команды, отправить на исполнительное устройство, результат команды записать в регистр назначения. Разбитие команд на разные стадии позволяет запускать следующую команду до того, как закончилась предыдущая. Термин «конвейеризация» пришел из промышленного производства, где этот принцип позволяет многократно увеличить темп изготовления продукции.

Второй подход стремится к параллельной группировке команд.

Для этого в последовательности команд нужно обнаруживать наборы, не пересекающиеся по используемым (аргументы) и определяемым (результаты) ресурсам. Такую группу команд можно запустить на исполнение одновременно.

Можно заметить, что описанные подходы не противоречат друг другу. Семейство архитектур, объединяющих эти принципы, известно как in-order superscalar.

В 60-е годы впервые был реализован следующий шаг - изменение последовательности команд относительно друг друга прямо в процессе исполнения. Такой подход назвали out-of-order superscalar (в дальнейшем OOOSS). Вся эволюция подходов к параллельному исполнению множества инструкций представлена на рисунке Переход от скалярных процессоров к суперскалярным с возможностью перестановки инструкций.

Переход от скалярных процессоров к суперскалярным с возможностью перестановки инструкций

Переход от скалярных процессоров к суперскалярным с возможностью перестановки инструкций

В 80-е годы начала развиваться альтернативная архитектура процессоров. Их отличительной особенностью является переупорядочивание команд не во время исполнения, а во время компиляции программы. Также ключевой характеристикой этой архитектуры является использование так называемых широких команд, которые позволяли выразить параллельность множества операций в ассемблере. Такая архитектура называется VLIW — «очень длинная машинная команда».

4.4. Широкая команда (ШК)

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

Рассмотрим ШК с точки зрения исполнительных устройств (см. рис. Широкая команда «Эльбрус», парк устройств). В ШК «Эльбрус» доступны:

  • 6 арифметико-логических устройств (АЛУ), исполняющих операции:

    • целочисленные (Int)

    • вещественные (FP)

    • сравнения (Cmp)

    • чтения из памяти (LD)

    • записи в память (ST)

    • над упакованными векторами (Vect)

    • деления и квадратного корня (Div/Sqrt)

  • 1 устройство для операции передачи управления (СТ);

  • 3 устройства для операций над предикатами (PL);

  • 6 квалифицирующих предикатов (QP);

  • 4 устройства для команд асинхронного чтения данных по регулярным адресам в цикле (APB);

  • 4 литерала размером 32 бита для хранения константных значений (LIT).

Широкая команда «Эльбрус», парк устройств

Широкая команда «Эльбрус», парк устройств

* В каналах 2 и 5 операции над вещественными числами поддержаны начиная с версии системы команд v4

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

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

Рассмотрим назначение и возможности доступных в ШК устройств.

Арифметико-логические устройства (АЛУ)

В процессорах Е4С/Е8С имеется шесть АЛУ с номерами 0-5.

В составе АЛУ0 и АЛУ3 присутствуют:

  • целочисленное арифметическое/побитовое/сдвиговое устройство;

  • устройство сравнения;

  • устройство для операций с упакованными целочисленными значениями шириной 8 бит, 16 бит, 32 бита;

  • вещественное арифметическое устройство;

  • вещественное арифметическое устройство над упакованными 32-разрядными вещественными числами;

  • устройство обращения к памяти по чтению.

В составе АЛУ0 также присутствует устройство обращения к специальным регистрам.

В составе АЛУ1 и АЛУ4 присутствуют:

  • целочисленное арифметическое/побитовое/сдвиговое устройство;

  • устройство сравнения;

  • устройство для операций с упакованными целочисленными значениями шириной 8 бит, 16 бит, 32 бита;

  • вещественное арифметическое устройство;

  • вещественное арифметическое устройство над упакованными 32-разрядными вещественными числами.

Вещественные устройства в АЛУ0, АЛУ1, АЛУ3 и АЛУ4, а также целочисленные устройства в АЛУ1 и АЛУ4 позволяют исполнять две последовательно зацепленные друг за друга операции в качестве одной трехаргументной операции, например, shl_addd ( a << 2 + 7) или fmul_subs ( x * y + z). Промежуточный результат первой операции не записывается в регистр, а используется только в качестве аргумента второй операции. Такие операции называют комбинированными.

В составе АЛУ2 и АЛУ5 присутствуют:

  • целочисленное арифметическое/побитовое/сдвиговое устройство;

  • устройство обращения к памяти по чтению/записи.

Также в АЛУ5 присутствуют устройство вещественного и целочисленного деления и устройство извлечения квадратного корня.

Предикатное устройство

В широкой команде можно выполнить до трех логических операций над предикатными регистрами, причем длительность операций составляет 1/2 такта, и поэтому в одном такте можно планировать логические операции, где вторая группа операций использует результат первой группы.

Устройство асинхронной подкачки массивов (APB)

В одной широкой команде можно исполнить до 4 операций чтения из буфера APB.

Устройство управления

В одной команде можно исполнить не более одной операции передачи управления и не более одной операции подготовки перехода.

4.5. Определяющие свойства архитектуры «Эльбрус»

В общепринятой классификации архитектуру «Эльбрус» можно отнести к категории VLIW. Доступ к аппаратным ресурсам процессора базируется на использовании широких команд (ШК). При компиляции каждого фрагмента программы происходит максимальное распараллеливание вычислительного процесса по всему полю возможных вычислительных устройств.

Архитектура «Эльбрус» включает ряд универсальных решений, свойственных современным высокопроизводительным микропроцессорам:

Регистровый файл

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

Предикатный файл

Состоит из 32 двухразрядных регистров — предикатов. Функция может использовать все 32 предиката.

Спекулятивный режим выполнения команд

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

Архитектура «Эльбрус» вводит режимы спекулятивности по управлению и спекулятивности по данным.

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

Спекулятивность по данным доступна посредством пары операций:

  • верхняя операция читает данные;

  • нижняя проверяет, была ли спекулятивно прочтенная ячейка памяти частично перезаписана с момента первой операции, и заново выполняет чтение в том случае, если это произошло.

Подготовка передачи управления — disp

Предварительная подкачка кода в направлении ветвления, а также его первичная обработка на дополнительном конвейере (на фоне выполнения основной ветви) скрывают задержку по доступу к коду программы при передачах управления. Тем самым возможна передача управления без остановки конвейера выполнения, когда уже известно условие ветвления. Архитектура микропроцессора определяет средства предварительной подкачки кода для трех команд передачи управления.

Предикатное и спекулятивное исполнение операций

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

Программная конвейеризация циклов

Позволяет наиболее эффективно исполнять циклы с независимыми (или слабо зависимыми) итерациями.

В программно-конвейеризированном цикле последовательные итерации выполняются с наложением - одна или несколько следующих итераций начинают выполняться раньше, чем заканчивается текущая. Шаг, с которым накладываются итерации, определяет общий темп их выполнения, и этот темп может быть существенно выше, чем при строго последовательном исполнении итераций. Такой способ организации исполнения цикла позволяет хорошо использовать ресурсы широкой команды и получать преимущество в производительности.

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

Асинхронный доступ к массивам

Позволяет независимо от исполнения команд основного потока буферизовать данные из памяти. Запросы к данным должны формироваться в цикле, а адреса линейно зависеть от номера итерации. Асинхронный доступ реализован в виде независимого дополнительного цикла, в котором кодируются только операции подкачки данных из памяти в FIFO-буфера. Из буфера данные забираются операциями основного цикла. Длина буфера и асинхронность независимого цикла позволяют устранить блокировки по считыванию данных в основном потоке исполнения.

4.6. Принцип использования параллельности операций для VLIW и OOOSS

Пусть есть 5 операций, которые требуется выполнить:

  1. a=x/7

  2. b=y+1

  3. c=b<<3

  4. d=x*x

  5. e=y*y

Сравнение исполнения кода в OOOSS и VLIW

Сравнение исполнения кода в OOOSS и VLIW

На рисунке Сравнение исполнения кода в OOOSS и VLIW показано, что в ассемблере для OOOSS порядок операций сохранен в соответствии с исходным кодом примера, а переупорядочивание операций происходит в процессе исполнения кода. Во VLIW операции переставлены еще на этапе оптимизирующей компиляции и построения ассемблера. Фигурными скобками обозначены широкие команды. И компилятор VLIW, и аппаратура OOOSS видят, что операция 3 зависит от операции 2 и требует ее завершения, но при этом операции 4 и 5 никак не зависят от результата первых трех операций, поэтому их можно начать исполнять раньше операции 3.

Компилятор для VLIW обладает гораздо большим окном операций для перемешивания, чем имеется на этапе исполнения у аппаратуры OOOSS. Это позволяет в некоторых случаях лучше выявлять независимые операции для их параллельного исполнения. С другой стороны, OOOSS обладает дополнительной информацией о параллелизме, доступной в динамике исполнения, например, значения адресов операций чтения и записи. Это позволяет лучше выявлять параллелизм в некоторых других ситуациях.

Подведем краткие итоги основных отличий VLIW и OOOSS.

VLIW:

  • явно выраженный в коде параллелизм исполнения элементарных операций;

  • точное последовательное исполнение широких команд;

  • особая роль оптимизирующей компиляции;

  • дополнительные архитектурные решения для повышения параллелизма операций.

OOOSS:

  • перестановка и параллельное исполнение операций обеспечивается аппаратно в пределах окна исполняемых в данный момент операций;

  • для переупорядочивания используются скрытые буфера, скрытый регистровый файл, неявная спекулятивность;

  • достаточно большое окно для поиска параллелизма и перестановки инструкций обеспечивается аппаратным предсказателем переходов.

Преимущества и недостатки VLIW и OOOSS (курсивом помечены недостатки).

VLIW:

  • больше открытых возможностей для выражения параллелизма инструкций;

  • лучшая энергоэффективность при схожей производительности;

  • возможные ухудшения производительности при исполнении legacy-кодов;

  • более сложный код для отладки и анализа;

  • более сложный компилятор.

OOOSS:

  • эффективное исполнение legacy-кодов;

  • дополнительная информация о параллельности операций, доступная в динамике исполнения;

  • расход энергии на многократное планирование одних и тех же операций;

  • ограниченность аппаратурой окна исполняемых операций для переупорядочивания.