- PVSM.RU - https://www.pvsm.ru -

О суперскалярах, параллелизме и кризисе жанра

О суперскалярах, параллелизме и кризисе жанра
Наверное, ни для кого из хабралюдей не будет новостью то, что основополагающие идеи и принципы, заложенные в нынешней цифровой технике и ее компонентах, родом из далекого по компьютерным меркам прошлого, а именно – из середины предыдущего века. Именно тогда были придуманы те основы, которые вот уже 50 лет с успехом разрабатывают, совершенствуют и продают крупнейшие (и не столь большие) компании сектора IT – в их строю, конечно, и Intel. Однако при всей очевидности данное положение навевает определенно пессимистический настрой: неужели все великие идеи закончились, и наше поколение обречено на мелочное ковыряние в Великом Наследии Прошлого?
Рассмотрим один конкретный и неудивительный для этого блога пример – заглянем в мысли тех, кто думает об усовершенствовании процессорных архитектур.

Для начала дадим необходимое пояснение – определение суперскалярности. В простейшем скалярном вычислительном действии участвуют два операнда; в векторном операция производится над двумя наборами чисел. Имеется и промежуточный (или смешанный) вариант: одновременно производятся различные операции над разными парами скаляров за счет наличия избыточного количества ячеек обработки – такой подход и называется суперскалярным.

О суперскалярах, параллелизме и кризисе жанра
Принципиальная схема суперскалярного исполнения команд

Не будем углубляться в вопрос, кто первый создал суперскалярный процессор – были ли это американские или советские ученые, и в каком году это произошло. Важнее то, что суперскаляр на сегодняшний момент рулит, и реального оппонента ему пока не видно. Однако прямолинейное развитие суперскалярного принципа уперлось сейчас в идеологический предел – при нынешнем подходе большего мы из него не выжмем. Суперскалярный подход, в принципе, одинаково применим и к RISC, и к CISC архитектуре. RISC, в силу более простой системы команд, пока еще имеет потенциал для разгона в рамках классической методики развития – это мы наблюдаем сейчас на примере ARM, динамика роста вычислительной мощности которых впечатляет. Однако и там, и там «кризис жанра» неизбежен, ибо он определяется самой сущностью суперскалярности.

В чем состоит проблема? В сложности задачи, которую берет на себя процессор. Суперскаляр на ходу распараллеливает последовательный код. Но этот процесс распараллеливания слишком трудоемок даже для нынешних процессорных мощностей, и именно он ограничивает производительность машины. Делать это преобразование быстрее определенного количества команд за такт невозможно. Можно сделать больше, но при этом упадет тактовая чистота – такой подход, очевидно, бессмысленнен. Разумный предел количества команд в настоящее время изучен со всех сторон и пересмотру не подлежит.
Суперскаляр вполне можно назвать гениальной архитектурой, но она есть предельно хорошая реализация программы, которая написана последовательно. Беда не в самом суперскаляре, а в представлении программ. Программы представлены последовательно, и их нужно во время исполнения преобразовывать в параллельное выполнение. Главная проблема суперскаляра – в неприспособленности входного кода к его нуждам. Имеется параллельный алгоритм работы ядра и параллельно организованная аппаратная часть. Однако между ними, по середине, находится некая бюрократическая организация – последовательная система команд. Компилятор преобразует программу в последовательную систему команд; от той последовательности, в какой он это сделает, будет зависеть общая скорость процесса. Но компилятор не знает в точности, как работает машина. Поэтому, вообще говоря, работа компилятора сегодня – это шаманство. Он просто смотрит: «если так переставить, то быстрее будет». Наверное.
Вот поучительный пример. Программная предзагрузка (prefetch [1]) – технология, позволяющая предварительно считывать данные в кеш процессора. Она была придумана около 10 лет назад и считалась весьма благотворно действующей на производительность системы. А потом оказалось, что после отключения prefetch, компьютер начинает работать в 1,5 раза быстрее. Все дело в том, что prefetch отлаживался на одной модели CPU, а используется на других (где процессором выполняется некоторый автоматический prefetch), и проще его просто отключить, чем приспособить к нынешнему многообразию процессорного парка. И такие случаи сейчас происходят сплошь и рядом.

О суперскалярах, параллелизме и кризисе жанра
«Эльбрус-1КБ» – советская суперскалярная ЭВМ

Можно представить, как сложно компилятору делать программу для суперскаляра. Но аппаратуре приходится еще труднее. Смотрите, что делает суперскаляр: последовательное представление команд выполнения он начинает превращать в параллельное. При последовательном представлении все зависимости данных убираются. Однако по-прежнему необходимо в правильной последовательности обращаться к регистру: не переставлять обращения к одному и тому же регистру. А для того чтобы переставить команды суперскаляру, ему нужно знать все зависимости. Поэтому он все вычислительный поток преобразовывает обратно. Ужас – страшнее не придумаешь. И попытки его оптимизировать похожи скорее на латание дыр, нежели на принципиальные изменения.
Еще 30 лет назад советские разработчики компьютерной техники, проектируя системы Эльбрус [2], понимали, что суперскаляр – хорошая архитектура, но сложная, необоснованно сложная. И, кроме того, имеющая пределы по скорости. Нужен был принципиально новый подход, и, самое главное, необходимо было убрать камень преткновения – последовательное представление команды. Нужно, чтобы машина получила все в параллельном виде – и это будет очень простое решение. То есть совершенное. А проблему совместимости старого кода и новой архитектуры можно решить с помощью двоичной компиляции [3].
Еще одна возможность подобного подхода – возможность использовать более, чем одно ядро. Это не планирование вычислений, а просто разделение ресурсов. Ресурсы делим статически на «вычислительные порции»; суперскаляр такого делать не может, так как чтобы хорошо разделить на порции, нужно заглядывать вперед (это может сделать только программа). Фактически, вместо одного потока имеет место явный параллелизм. Это может избавить от большого количества ограничений.

Варианты аппаратного параллелизма в процессорах многократно опробовались различными исследовательскими группами, естественно, ведутся такие разработки и в Intel; одним из их результатов стал процессор Itanium [4], использующий архитектуру VLIW (very long instruction word — очень длинное слово команды). VLIW представляет собой химически чистую реализацию идеи, высказанной выше, когда вся нагрузка по созданию параллелизма ложится на плечи компилятора, а в процессор поступает уже аккуратно и грамотно распараллеленный поток команд.

О суперскалярах, параллелизме и кризисе жанра
Процессор Intel Itanium 2

Другое перспективное направление движения к параллельному будущему – процессоры с большим количеством микроядер, где многопоточность достигается самым что ни на есть аппаратным способом, причем каждое ядро поддерживает также механизм суперскалярности. В Intel подобного рода разработки ведутся под флагом MIC (Many Integrated Core Architecture [5]). Проект прошел несколько ступеней развития, при переходе от одной к другой несколько менялись приоритеты и позиционирование продукта – обо всем этом вскорости будет отдельный рассказ.

Подведем промежуточный итог. Ведутся ли сейчас фундаментальные разработки, способные в будущем кардинально изменить нашу жизнь/представление о процессоре? Да, несомненно, многое из того, о чем мы говорили сегодня, через 50 лет войдет в учебники по истории цифровой техники. Ну а мы в блоге Intel (где же еще!) обязуемся, не дожидаясь этого срока, информировать и дальше о вестях с процессорных фронтов.

Автор: saul


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/zhelezo/10809

Ссылки в тексте:

[1] prefetch: http://en.wikipedia.org/wiki/Instruction_prefetch

[2] Еще 30 лет назад советские разработчики компьютерной техники, проектируя системы Эльбрус : http://www.mcst.ru/e2k.pdf

[3] двоичной компиляции: http://ru.wikipedia.org/wiki/Двоичная_компиляция

[4] процессор Itanium: http://en.wikipedia.org/wiki/Itanium

[5] Many Integrated Core Architecture: https://www-ssl.intel.com/content/www/us/en/architecture-and-technology/many-integrated-core/intel-many-integrated-core-architecture.html?