0:00
[МУЗЫКА]
[МУЗЫКА] Мы
уже говорили о водопроводе, своеобразном конвейере, который читает команды впрок.
Чуть позже появились конвейеры исполнения команд.
Первым таким был Intel 486 в 1989 году,
то есть когда каждая команда исполняется каждые пять-шесть тактов,
но исполнение разбито на конвейер, и поэтому только в начале идет какой-то
разгон, а потом каждый такт выдается результат, хотя каждая команда отдельно
исполнялась пять тактов, но они были сильно конвейеризованы.
Еще позже появилось суперскалярное выполнение.
Первый был такой Intel Pentium 1993 год.
В этой машине было много сумматоров, несколько умножителей и других устройств,
и машина сама умела так на аппаратном уровне выбирать команды и
раскидывать их по разным устройствам и выполнять их параллельно.
Очень интересным вариантом улучшения архитектуры
ЭВМ является спекулятивное выполнение.
Рассмотрим пример на слайде: if a > 0, then x := y + z.
Вот на современных машинах можно одновременно начать вычисление
условия a > 0 и присваивание, x присвоить y + z.
Только в самый последний момент, когда уже нужно производить окончательную финальную
запись в x, машина проверит какой-то специальный триггерок,
если условие истинно, запись произойдет, а если ложно, то,
значит, зря делали, но кого это колышет, кому это будет жалко.
Просто результат действия пропадет, а присваивание не будет выполнено.
Зато, когда условие сработало,
мы сэкономили сразу один-два такта, и это тоже хорошее ускорение.
Существенное ускорение в этом достигается за счет многопроцессорности,
и вот эта многопроцессорность, многомашинность бывает совершенно разная.
И даже есть определенная специальная классификация всего этого.
Начнем с термина SIMD, single instruction multiple data,
то есть у вас есть несколько компьютеров,
которые выполняют каждый такт одну и ту же команду,
но с иными локальными данными.
То есть одна команда, на каждом компьютере исполняется одна и та же команда,
но со своими локальными данными.
И есть такой пример.
Первый исторический пример, машина американской ILLIAC IV, опять-таки
с удовольствием скажу, что придумана в Университете Иллинойском в 1975 году.
Они сделали машину, в которой было 64 компьютера.
Вообще-то план был 256 компьютеров, но не дожали, такое бывает, но и 64 тоже много.
Итак, есть 64 компьютера,
которые готовы исполнять каждый такт одну и ту же команду,
есть отдельная управляющая машина, которая раздает эти команды этим компьютерам.
Интересно спросить — кому это нужно?
Так вот есть такая область — решение уравнений в частных производных,
и там есть метод, называется метод сеток.
Область, в которой вычисляется функция с этими многими частными
производными, имеет границу, на этой границе значения функции известны,
и вам надо рассчитать значение функции в каждой внутренней точке.
Это делится на такие сетки, и сначала грубо считается, а потом каждый такт,
шаг между точками сетки, уменьшается в два раза.
Это в общем такое массовое действие,
когда по четырем точкам надо вычислить значение точки в середине квадратика,
это такое массовое действие, вот очень хорошо ложится на машины типа ILLIAC IV.
Единственное исключение, которое позволяет себе эта машина,
что отдельный компьютер может пропустить такт и ничего не делать,
если он уже попал на сетку, но это единственное исключение,
так все компьютеры работают ровно в одной и той же команде.
У нас в СССР, естественно, эту машину тоже быстро скопировали,
была такая машина ПС-2000, в точности такая же,
как ILLIAC IV, но сделана несколько позже.
На самом деле сегодня таких вот машин, я просто все рассказываю на примере
ILLIAC IV, поскольку это исторически первая машина такого класса,
ну вот поглядите — и CDC, и Cray, и Fujitsu, была советская машина,
причем оригинальная, не копия какой-нибудь машины, ПС-3000,
Эдуард Анатольевич Трахтенгерц, я его хорошо знал, главный конструктор
этой машины, ему удалось сделать векторную машину, которая работала по принципу SIMD,
и эта машина получила какую-то огромную популярность у геологов,
потому что им надо делать много расчётов, а Трахтенгерцу удалось сделать довольно
компактную машину, которую можно было перевозить в ГАЗике.
И они так и делали, в какой-нибудь глухомани Сибири запускают
электрогенератор бензиновый и от него запускают компьютер ПС-3000.
И это была хорошая машина.
Мы, я помню, мы делали Algol 68 и довольно хорошо изучили.
Следующий класс многопроцессорных машин — это MIND, multiple instruction,
multiple data.
Сразу начну с примера, потому что иначе это все будет непонятно.
Еще в 1985 году англичане, не американцы сделали машину,
которую они назвали, фирма Inmos, они назвали эту машину транспьютер.
Кристалл, много кристаллов, у каждого кристалла есть четыре канала,
причем каналы имеют буферную память на четыре позиции, и поэтому кристалл,
когда хочет послать сообщение соседу, он просто посылает в нужный канал информацию,
если в канале хоть одна свободная позиция есть, всё,
процессор может продолжать работу дальше без всяких ожиданий.
А если канал переполнен, все четыре позиции заняты,
тогда этот микропроцессор немножко подождет, пока канал освободится.
И оказалось, что это тоже очень удачная схема,
причем идеология эта была придумана в Бостонском университете.
Есть такой знаменитый ученый Тони Хоар, он сейчас получил звание сэра, сэр Тони Хоар.
Я его хорошо знаю, интересный дядька, довольно хорошо говорит по-русски.
И вот он в каком-то смысле классик, есть много вещей, которые придумал Тони Хоар,
и в частности, вот эту идеологию транспьютера придумал он,
и для транспьютеров он придумал собственный язык Оккам.
Знаете ли вы, что такое Оккам?
Есть такой принцип — лезвие Оккама,
не используйте понятий сверх минимально необходимого.
Оккам — это монах, который жил примерно 800 лет назад,
некоторые говорят, что он был один из основателей Оксфордского университета,
но это трудно установить, но во всяком случае его труды известны до сих пор.
Он был, скорее, философ, чем монах.
Тогда, видимо, все монахи были в каком-то смысле философы.
Так вот, лезвие Оккама — это в его честь названо,
и язык Оккам был назван в его честь.
Почему?
Потому что вполне выразительный язык, на 20 страницах изложенный,
и сегодня трудно найти алгоритмический язык высокого уровня,
который можно написать на 20 страницах.
Вот Оккам, оказывается, можно.
И в нем главное, кроме обычной арифметики, было распараллеливание, то есть как
раз вот был язык специально предназначен для программирования транспьютеров.
Мы на нем тоже поработали, хороший язык.
Есть и более современный пример, приведен на слайде — Xeon Phi 2012 года.
Сейчас поговорим о третьем классе параллельных компьютеров
— архитектура VLIW — very long instruction word.
В каком-то смысле мне архитектура нравится больше других, потому что что это такое?
Длинная команда, скажем, одна команда, длинная шкала,
в которой можно уместить, скажем, 15 команд, штук семь команд-пересылок,
загрузки, выгрузки, и штук восемь аналитических команд.
Я знаю VLIW-овские архитектуры, у которых 23 команды и больше.
Так вот, если транслятор был такой умный,
что сумел все клеточки, или почти все клеточки занять,
то представляете — за один такт вы сможете использовать 15 команд, это же здорово.
Никакая аппаратура выполнить 15 команд одновременно не может,
тому есть объективные причины, а компилятор может.
То есть это будет действительно какой-то мощный оптимизирующий компилятор,
который может переставлять команды как-то, не нарушая семантики, естественно.
И если транслятору удается заполнить хотя бы 70–80 %
позиций длинной команды, то машина начинает работать бешено быстро.
И мне это приятно, потому что я сам компиляторщик,
моя первая диссертация — это было проектирование ретранслятора,
генерация объектного кода, ретрансляция Алгол 68.
То есть я всю жизнь пишу трансляторы и всю жизнь ругаюсь с теми людьми,
которые верят в аппаратный параллелизм, потому что я искренне думаю,
что аппаратный параллелизм никогда не достигнет таких же результатов,
как оптимизирующий компилятор, например, для VLIW-овской архитектуры.
Конечно, эта компиляция будет долго, но представьте себе задачу,
когда вы пускаете ракету на Марс,
она будет лететь три года и управляться какими-то внутренними компьютерами.
Но что нам стоит потратить на трансляцию не одну минуту, как обычно, а, скажем,
час или даже трое суток, кто от этого пострадает?
зато потом программа будет три года оптимальным образом работать,
потреблять меньше электроэнергии, короче, будет выполнять свою задачу.
Таким образом, VLIW-архитектура стала очень популярной.
И могу вам сказать, что те компьютеры,
которые у вас на столах или на коленях лежат, персоналки, они все VLIW-овские,
и старая система команд x86 там просто аппаратным образом интерпретируется,
а система команд сохраняется исключительно для преемственности программного
обеспечения, а реально аппаратные средства, во всех этих персоналках,
которыми вы пользуетесь, это уже VLIW-архитектура.
И вот такая VLIW-архитектура получила популярность и в нашей стране.
Есть серия машин Эльбрус, о которой я еще не раз и не два буду упоминать,
оригинальная машина, сделанная в Москве советскими, а потом российскими учеными.
Один из главных конструкторов — Бабаян Борис Арташесович,
очень симпатичный дядька.
Сейчас он перешел на работу в Intel, ему уже лет 80 или больше.
Очень симпатичный, правда такой хороший человек.
И вот он любил повторять в старые времена: «Кто не верит в динамизм,
тот не верит в коммунизм».
Сейчас я его встречаю время от времени на всяких конференциях, и переспрашиваю:
«Борис Арташесович, а сейчас как вы относитесь к динамизму и коммунизму?».
Шутка состоит в том, что современные Эльбрусы, — там были Эльбрус-1, Эльбрус-2,
Эльбрус-3, целая серия машин — современные Эльбрусы, они все VLIW-овские,
то есть полностью ориентированные на компиляторную технику,
а первые Эльбрусы были все с аппаратным параллелизмом, и поэтому для Бабаяна,
по-моему, произошел поворот вот именно такой, на 180 градусов.
Ну что же, жизнь такая тяжелая.
Но мне приятно, что я-то с ним с 74-го года работаю и всегда ему про это говорил.
В общем, немножко, может быть, эгоистично думаю, что я все-таки оказался прав.
На самом деле и на солнце есть пятна, и VLIW-овская архитектура,
столь любимая мной, имеет свои недостатки.
Например, представьте, вы исполняете 15 разных команд в одном такте,
а они требуют разного доступа к кэшу, разное число тактов для исполнения,
то есть синхронизация получается не очень простой.
Поэтому в 1997 году фирмы
Hewlett-Packard и Intel предложили некоторое развитие архитектуры VLIW.
Они назвали этот вариант EPIC.
Что такое EPIC?
Explicitly parallel instruction computing.
Первым примером такой архитектуры был компьютер фирмы Intel Itanium.
Одно время он гремел, и везде про него говорили, и вообще люди думали,
что он станет самым массовым компьютером, но как-то он все-таки сошел.
Тем не менее он играл революционную роль,
потому что именно с него началось новое движение архитектуры.
Давайте попробуем перечислить несколько особенностей EPIC,
архитектуры EPIC по сравнению с тем, что было.
Например, предикация.
Команды из разных веток условного предложения запускаются параллельно,
но со специальными полями условий.
Сейчас, кстати, многие машины так и работают,
то есть эта идея от Itanium перешла в сегодняшние машины.
То есть вы понимаете, есть if-then/else.
Так вы запускаете одновременно и then-часть, и else-часть.
Но каждая команда снабжена неким триггером условия.
Если условие есть, то это закончится.
А если условие ложно, то команда исполнена, но не дали ей завершиться,
просто пропало.
Но зато если условие есть, то это сработает.
Аналогичным образом работает спекулятивная загрузка регистра в память.
Понимаете, я уже много раз сказал, что память медленнее, чем процессор,
много медленнее.
Поэтому если у нас встретилась команда load, транслятор может ее перенести как-то
существенно выше, раньше на несколько команд, пока не нарушается семантика.
А в регистре тоже специальный триггер, который проверяет,
закончилась загрузка из памяти в регистр или не закончилась.
Поэтому он будет запускать load раньше, а когда приходит пора использовать значение
этого регистра, будет по этому триггеру определять: если загрузка закончилась
— пользуйтесь, не закончилась — вот тут несколько тактов подождете.
В этом разделе я расскажу вам архитектурные способы ускорения ЭВМ.
RISC и все остальные.
Мне интересно, что тут движение идет в обе стороны.
С одной стороны, математики,
архитекторы, придумывают какие-то архитектурные решения.
С другой стороны, инженеры не дремлют и тоже что-то пытаются оптимизировать.
И вот на примере EPIC мне кажется, что это удивительно хорошее
сочетание и архитектурных решений от VLIW, а еще раз повторю,
что VLIW — это моя любимая архитектура, поскольку я сам компиляторщик,
и явного параллелизма аппаратного уровня.
И вот это сочетание является удивительно удачным решением и удачным сочетанием
архитектурных и чисто инженерных подходов.