[МУЗЫКА] [МУЗЫКА] [МУЗЫКА] Уважаемые слушатели, в этом разделе я бы хотел поговорить с вами о способах ускорения ЭВМ, способах повышения их производительности. Начнем с такого классического способа, который называется RISC — Reduced Instruction Set Computer. Мне очень приятно заметить, что этот способ, который сейчас является чуть ли не самым главным элементом архитектуры современных ЭВМ, придуман не в фирмах, а в университетах. К сожалению, не в наших советских университетах, а в американских, но все равно мне как университетскому профессору это приятно. Почти что одновременно, с расстоянием в один год в университете Беркли Дэвид Паттерсон и в университете Стэнфорд Джон Хеннесси придумали такой способ ускорения ЭВМ, о которых мы сейчас будем и говорить. Итак, вернемся в 80-е годы XX века. Тогда технология позволяла собрать в одном кристалле примерно 100000 вентилей или 100000 транзисторов — как считать. Вот больше они не могли. И вот в таком количестве вентилей разместить полную систему команд какой-то машины, которая обычно насчитывала 250‒300 команд, было невозможно, кристалл был слишком маленький для этого, слишком мало элементов. Но уже тогда люди хорошо понимали, что если работать внутри одного кристалла, то скорость огромная, большая. А если работать в несколько кристаллов, то скорость сильно падает. Мы тоже в нашей лаборатории системного программирования проводили такие эксперименты, но правда, несколько позже, в начале 90-х годов, но все равно. То есть если взять один кристалл Xilinx и в нем разместить какую-то схему, можно достичь частоты 100 мГц, это по тем временам было очень много, сегодня это уже не так много. А если эту же схему разбить на два кристалла и соединить их одним проводком на плате длиной в два сантиметра, то скорость падает в пять раз — 20 мГц. Дело в том, что внутри кристалла все проводки очень тоненькие: там, скажем, проводок — это сто атомов меди в ширину. А если... И поэтому там маленькое сопротивление, маленькая индуктивная нагрузка и т.д. Чистая физика. А проводок, даже который 2 сантиметра, нам он кажется очень тонким, на самом деле в нем ширина — десятки тысяч атомов, и уже совсем другое сопротивление, поэтому существенно большие токи и т.д. Итак, задача была — разместить в одном кристалле. Но кристаллы, еще раз повторяю, в это время были довольно ограничены по своим возможностям. Вот эти товарищи, университетские профессора, придумали метод. Они изучили, какие команды чаще всего используются в машинах. Оказалось, что есть примерно 20‒25 команд, которые используются во много раз чаще, чем все остальные 250‒300 команд. Но понятно, какие это: загрузка из памяти в регистр, выгрузка из регистра в память, плюс, минус, умножить, уже даже разделить сюда, в эти частотные команды не входит. Условная передача управления, какие-то логические команды. И вот так набиралось 20‒25 команд. Так RISC-архитектура подразумевает, что в один кристалл можно вогнать 25 команд, вот эти упрощенные команды, самые такие базовые, простые команды. И они будут работать с той самой частотой 100 мГц, что хорошо, а остальные действия, которые все-таки нужны, хотя бы изредка, будем собирать из этих базовых 25 команд. И такой метод оказался чрезвычайно продуктивным. И хотя уже сейчас кристаллы — миллионы вентилей, а не 100000, как в 80-е годы, но до сих пор архитектура RISC царствует в нашей области. Рассмотрим основные принципы RISC-архитектуры, которые неизменны вот с 80-х годов. Все команды имеют одинаковую длину. Ну это понятно, зачем: чтобы водопроводу было легче вычитывать команды вперед. Все или почти все команды исполняются за один такт. Ну это такой был святой принцип RISC-архитектуры, хотя с течением времени от него стали отходить. В самых традиционных RISC-овых архитектурах всегда встречаются команды, которые выполняются 6-8 тактов, ну что, подумаешь. Тем не менее, когда основная масса команд исполняется за один такт, это ускоряет машину. В RISC-машинах всегда много регистров, причем, там, не 16, как в IBM 360, а 500, 1000. Я уже говорил, что регистры расположены прямо в процессоре, поэтому обращение к ним во много раз быстрее, чем обращение к памяти. И поэтому если вам удается самые частые перемены, самые частые значения размещать в регистрах, а не в памяти, то машина работает существенно быстрее. Хотя это трудная задача для компиляторщика, потому что распределить эти регистры оптимально — это трудная задача. Но мы умеем это делать. Вся работа с памятью сосредоточена только в двух командах — Load и Store. Все остальные команды работают исключительно только с регистрами. И наконец, the last, but not least — последнее по порядку, но не последнее по значению — программирование ведется только на алгоритмических языках высокого уровня. Есть такое сокращение — АЯВУ — алгоритмический язык высокого уровня. Дело в том, что вот эта ограниченность базовой системы команд приводит к каким-то странным вещам. Если встречается команда безусловной передачи управления — Branch на метку, о чем я уже говорил, то всегда есть полностью еще следующая команда, и только потом реально произойдет переход. Человек это обязательно забудет, а транслятор — нет. Ну и вообще, вот если вам надо сделать деление, а деления нет, приходится делать какую-то подпрограмму. Поэтому программировать... вообще всегда программировать на алгоритмических языках высокого уровня лучше, чем в кодах и на ассемблере, но в RISC это становится совершенно необходимо. Хочу сказать, что вот эти принципы, они хотя и святы для RISC-архитектуры, но все-таки они довольно часто нарушаются. Ну например, когда мы делали свою машину Самсон — об этом я еще буду рассказывать — мне показалось странным иметь все команды длиной в 32 бита. И, в общем, немножко нажав на инженеров, удалось уговорить их сделать водопровод для команд и в один байт, и в два, и в четыре, и другие разные длины. То есть это просто дело техники. Ну, я понимаю, что как принцип, это хорошо, но если это тормозит или увеличивает объем памяти, почему надо следовать этому принципу? Вот насчет того, что один такт. Авторы всегда настаивали, что все команды должны быть за один такт. Ну что такое, молиться что-ли на этот такт надо? Если у вас есть какой-нибудь вход в процедуру, вызов процедуры, то там по сути надо сделать довольно много действий, в один такт не уместишь. Ничего страшного, пусть будет несколько тактов. Много регистров сейчас во всех машинах, все понимают, что регистры лучше, чем память, поэтому — RISC, не RISC — регистров во всех машинах много. Работа с памятью в двух командах — это, пожалуй, единственный принцип, который так более-менее сохраняется, и тут мне даже сказать нечего. А уж программирование на АЯВУ — это вообще мой принцип. Я много лет работал с военными и на военную промышленность, и главной моей целью всегда было заставить их работать на алгоритмических языках высокого уровня, поскольку это повышает по сравнению с ассемблером в кодах машины, поскольку это повышает и производительность труда, и надежность программирования. Поэтому этот принцип, я считаю, что нельзя узурпировать только для RISC. Тем не менее, вот такие принципы RISC есть, и когда на экзамене какому-нибудь моему студенту этот вопрос попадается, я прошу все эти принципы пересказать и привести ту самую критику, о которой я сейчас только что сказал. Следующий элемент является исторически самым старым методом ускорения машины. Здесь мне особенно приятно отметить, что этот метод придумал советский ученый Сергей Алексеевич Лебедев. Схема называется «водопровод». Что это такое? Вот исполняется одна команда. В это время... Потом надо начинать следующую команду, в это время процессор простаивает. Так Лебедев сообразил, что можно сделать отдельную схему, которая будет читать команды впрок: какая-то команда исполняется, а одна, две, три следующих команды в это время читаются из памяти и размещаются где-то в процессоре. Вот он назвал такую схему «водопровод». И когда... Он же был автор самой быстрой машины в Европе, МЭСМ. Это было сделано в Москве в 1953 году. И как автор самой знаменитой машины путешествовал по Америке с лекциями и там опубликовал статью «Способы ускорения современных ЭВМ» на английском языке. Мы проверяли, никаких публикаций американских, или английских, или каких-то других с датами до 1950 год нет. Поэтому мы искренне думаем, что автор этой идеи — Сергей Алексеевич Лебедев. Американцы, конечно, говорят, что у них все это уже было, они все это знали. Но просто, поскольку они хотели патентовать все, поэтому они не публиковались, но это их дело. В университете принято считать так: есть статья с такой-то датой, на которую можно сослаться — все, твой приоритет определен. Итак, мне особенно интересно сказать, что американский термин pipeline — это перевод с русского на английский. Сейчас довольно много терминов проникает в нашу жизнь английских, американских. Так вот этот термин возник из русского, точно так же, как sputnik. Спутник. Все знают, что это русское слово. И в Америке все это знают. Так вот, что я хочу сказать ещё про водопровод? Нельзя зачитывать, скажем, 40 команд. Это абсолютно бесполезно. Почему? Потому что есть мировая статистика, что в любой программе в среднем каждая 6-я–8-я команда — это передача управления. Понятно, что если вы передали управление на другое место, то водопровод надо будет заново разгонять, машина будет простаивать, а всё, что он закачал перед этим, — всё пропадет. Поэтому водопровод обычно делают на 6–8 позиций в расчёте на то, что этого хватит, чтобы машина не тормозилась, и в то же время не надо читать слишком много, потому что при передаче управления то, что вы начитали, пропадет. Кстати, американцы — злобные люди. Они теперь используют другой термин — prefetching. Я не знаю, из каких соображений они отказались. Когда я был помоложе, американцы спокойно говорили pipeline. А теперь говорят prefetching. Ну, хорошо, бог с ними. Лет 30 назад память была медленнее процессора не более, чем в 3, 4–5 раз. Так сейчас устроена электронная промышленность, что с каждым годом это расхождение даже увеличивается, то есть память существенно, видите, в 15–20 раз медленнее, чем процессор. И поэтому значение водопровода даже усиливается. То есть тем более важно, чтобы процессор не простаивал и чтобы какие-то схемы заранее читали команды из памяти, чтобы процессор не тратил время на ожидание очередной команды. В современных машинах умеют предсказывать переходы. Что это такое? То есть у вас есть условное предложение if, then, else. Условие — выполнить одну ветку, а по другому условию выполнить другую ветку. Совершенно хладнокровно можно запустить водопровод сразу, запустить сразу два водопровода на then-часть и на else-часть. В любом случае, произойдет переход или провалится на следующую команду, у вас будут заготовлены уже команды. Современные ЭВМ умеют даже больше, чем делать несколько водопроводов. Они умеют собирать динамическую статистику частоты, реальную передачу управления. Стоит, условно, переход. Либо произойдёт переход, либо не произойдет. Компьютер сам может собрать статистику частоты переходов. И на более вероятный сделает более длинный водопровод, а на менее вероятный сделает более короткий водопровод. И это тоже ускоряет работу машины. Ещё одним способом ускорения, кстати, тоже придуманный Лебедевым, — это чередование блоков памяти, по-английски interleaving. Представьте, что у вас есть векторная машина, в которой можно работать не с одним словом, а с векторами, состоящими из многих элементов. И тогда хотелось бы в один такт прочитать много элементов векторов. Допустим, вам надо сложить два вектора, то есть у вас есть один вектор, другой вектор, и вам надо так поэлементно сложить. Interleaving делается следующим образом. У вас несколько банков памяти, 4–8, больше бывает. Каждый со своим устройством управления, поэтому эти банки памяти могут работать совершенно независимо. И тогда адресация расположена так: нулевое слово — в нулевом банке памяти, первое слово — в первом банке памяти и так далее. Если у вас всего 4, то 0, 1, 2, 3, а 4-я снова в нулевом банке памяти. Вот такое циклическое. Это позволяет вам прочитать за один такт много слов и выполнить векторную операцию существенно быстрее. Обращаю ваше внимание, что я вам последние несколько минут рассказывал о способах ускорения ЭВМ архитектурными методами. Заметьте, я ни разу не сказал о частоте, о тактовой частоте, о количестве вентилей в кристалле, разве что, когда говорил про риск. Это все архитектурные улучшения машины. И они мне особенно нравятся, потому что это как раз классическая математическая работа — предлагать более эффективные алгоритмы. И, вообще, знаете, чтобы завершить этот раздел я хочу вам сказать, что в советское время наши машины в 50 или больше раз были медленнее американских машин. Тем не менее, Гагарин сел в 40 километрах от расчётной точки. Ведь только третий американский астронавт сумел облететь вокруг Земли. Мы запустили первый спутник. Это тоже были огромные расчёты. То есть наши учёные умудрялись математическими, архитектурными методами достигать таких же результатов, каких достигали американцы, даже лучше, чем на американцы, на во много раз более быстрых машинах. Это тоже часть нашей истории, которой я горжусь