Экскурсия по Музею Истории Компьютеров в Калифорнии, с пользой для разработки. Часть 1. ENIAC, Stretch, CDC6600, IBM/360

Господа! Сегодня мы пройдемся с сибирской девушкой Ириной по Музею истории компьютеров в Маунтин-Вью, Калифорния. Причем пройдемся не как туристы, а для принесения пользы России. Я уже писал в предыдущем посте, что один из эффективных способов для студента изучить проектирование процессоров — это взять какой-нибудь древний, но поучительный процессор, найди документацию по его архитектуре (и какую-нибудь информацию по его микроархитектуре), и спроектировать аналог этого процессора на языке описания аппаратуры SystemVerilog (или VHDL, если он вам больше нравится), после чего реализовать процессор на плате ПЛИС / FPGA (какой именно, не важно — Altera / Intel FPGA, Xilinx или Lattice). В качестве учебника для такого упражнения вы можете начать с Харрис & Харрис, после чего продолжить с книгами для более продвинутой стадии обучения, например Шень-Липасти.

Каким образом все это принесет пользу России? Под такие проекты мы собираемся раздавать FPGA платы на конференции которая пройдет 18-22 сентября в Томске. Туда приедут представители МГУ, МФТИ, МИЭТ, МЦСТ, Imagination Technologies, National Instruments итд. Они будет обсуждать, как обновить программу университетов, чтобы сегодняшние студенты через несколько лет проектировали росийские чипы на уровне передовых западных компаний. Там также будет школа-семинар, на которой будут обсуждать, как делать учебные процессоры — начиная от простейшего schoolMIPS от Станислава Жельнио @sparf.

Вот первая фотография из музея в Маунтин-Вью — на ней помимо Ирины и ракеты в центре виден небольшой ящичек. Это бортовой компьютер космической станции «МИР» , который проектировали инженеры советского объединения «ЭЛАС», которое трансформировалось в современную зеленоградскую компанию «ЭЛВИС»:

Итак, темы для учебных проектов — начиная из дремучих десятилетий середины XX века:

Перед нами — блок для хранения таблицы результатов вычисления арифметических функций теплого лампового компьютера ENIAC, разработанного в 1943-1947 Преспером Экертом и Джоном Мочли из Университета Пенсильвании. В некоторый момент их коллега Джон фон Нейман предложил использовать этот блок для хранения программ. Так родилась «архитектура фон-Немана». Вообще ее правильно было бы назвать «архитектура Экерта-Мочли-фон-Неймана», но Экерту и Мочли не повезло — их имена были засекречены, а имя фон-Неймана — нет (компьютер предназначался для расчета артиллерийских таблиц).

Если вы хотите реализовать этот компьютер на FPGA, я нагуглил ENIAC_Operating_Manual, хотя превратить его в код на верилоге будет нетривиально:

Транзисторный суперкомпьютер IBM 7030 Stretch. Название (stretch — «растягивать») произошло от обещаний его создателей сделать компьютер в 100 раз быстрее предшествующего IBM 704. К сожалению, Stretch получился всего в 30 раз быстрее и бизнес-коммьюнити покрыло создателей позором и презрением. Тем не менее, в процессе этой «неудачи» айбиэмовские инженеры придумали конвейерность, многозадачность и защиту памяти:

CDC 6600 (1963). Первый «настоящий» суперкомпьютер в истории и первый процессор с внеочередным исполнением инструкций. До сих пор повсеместно используется в качестве примера scoreboarding-а на лекциях по микроархитектуре (см. напр. первые нагугленные (правда не очень свежие) слайды по CDC 6600 из Беркли ). Реализация упрощенного CDC 6600 на верилоге и FPGA — один из самых очевидных кандидатов для студенческого курсового проекта.

Вот отрывок про общую организацию CDC 6600 из книжки Microprocessor Architecture: From Simple Pipelines to Chip Multiprocessors by Jean-Loup Baer (2009). Несколько функциональных устройств, работающих параллельно (но без конвейера) и scoreboard, отслеживающий зависимости по данным между инструкциями, и приостанавливающий запуск выполнения инструкции, пока ее операнды не будут готовы:

IBM 360 (1964-1978). Эта линия компьютеров произвело настолько глубокое впечатление на ЦК КПСС СССР, что они, несмотря на сопротивление советских суперкомпьютерных авторитетов из ИТМиВТ (БЭСМов и Эльбрусов) насадили советские реализации IBM 360/370 по всем соцстранам под именем ЕС ЭВМ. Эти компьютеры изображены даже на рисунках советских детей брежневской эпохи «я у мамы на работе»:

В принципе было за что — линия IBM/360 внедрила революционную для своего времени концепцию «единая архитектура (система команд) — разные микроархитектурные реализации (устройства конвейера и структура хардверных блоков)». Иными словами, один и тот же софтвер мог работать как на медленных дешевых, так и на быстрых дорогих компьютерах этой линейки — без перекомпиляции. (Правда софтвер для этих машин был не очень дружелюбным по сравнению с софтвером на вскоре возникших миникопьютерах, но хардверные инженеры IBM не были в этом виноваты, это была вина программистов IBM и их менеджмента).

Впрочем проект IBM/360 принес пользу и для мира программирования. Вот видите слева от сумочки Ирины книжку «Мифический человеко-месяц» Фредерика Брукса? Автор книжки — менеджер проекта OS/360, который сделал наблюдение, что попытка исправить сорванный дедлайн добавлением в проект новых программистов часто ведет к ухудшению ситуации — дедлайн станет еще более сорванным. Книжку издали в 1975 году, тут же перевели в СССР, и местами она актуальна до сих пор:

Также линия IBM/360 ввела в мейнстрим концепцию «микропрограммирования» и «микрокода», которые стали неактуальны в процессе «RISC-революции» 1980-х (современные микропроцессоры преимущественно hardwired из-за необходимости все конвейеризовать). Однако эти концепции настолько крепко въелись в советские и пост-советские учебники компьютерной архитектуры, что люди до сих пор задают вопрос «а что, Verilog — это микропрограммирование?» — после чего долго приходится объяснять что это _не_ микропрограммирование.

Так зачем реализовывать IBM/360 на FPGA? Все реализовывать бессмысленно, но один аспект одной модели, а именно IBM System/360 Model 91, появляется среди современных студенческих курсовых проектов по микроархитектуре не реже, чем scoreboard от CDC 6600. Я говорю о так называемом «алгоритме Томасуло», способе организации внеочередного выполнения арифметических операций с аппаратным «переименованием регистров» и «блоками резервирования» (да, эти штуки есть и в процессорах в ваших айфонах, это не остатки мамонта). Довольно странно, что про алгоритм Томасуло нет статьи на русской википедии, хотя есть на украинской:

Алгоритм Томасуло — це алгоритм, який використовується в комп’ютерній архітектурі апаратного забезпечення, для динамічного планування команд, яке передбачає позачергове виконання, з метою ефективного використання функціональних блоків процесора. Алгоритм був розроблений Робертом Томасуло у 1967 році, коли він працював в IBM, і вперше реалізований в IBM System/360 Model 91 в блоці операцій з рухомою комою.

Головними нововведеннями алгоритму Томасуло є перейменування регістрів в апаратних засобах, блоки резервування[en] для всіх функціональних блоків, і спільна шина даних (СШД), по якій обчислені значення синхронно передаються в усі блоки резервування, які можуть мати потребу в них.

В одной из самых полезных современных книжек по разработке процессоров, Modern Processor Design: Fundamentals of Superscalar Processors by John Paul Shen and Mikko H. Lipasti (2013), наглядно показано, как выглядел блок операций с плавающей точкой у IBM/360-91 до улучшения Томасуло и после него. Такое же «до и после» можно сделать и для студенческого проекта, со сравнением производительности (количества тактов на разных последовательностях операций) и максимальной тактовой частоты (при реализации на FPGA):

После этого книжка Шен-Липасти описывает как это делается в современных процессорах с динамическим конвейером:

А вот ранний транзисторный мейнфрейм из Японии — NEAC 2203, сделанный в 1958 году. Он никогда не продавался вне Японии. Вообще тогда к японским товарам в мире было несерьезное отношение, но японские компании подавили в себе идолопоклонничество перед Западом и занялись капитализмом по-японски. Сначала они обкатывали технологические решения на внутреннем рынке (своего рода «импортозамещение»), а потом агрессивно атаковали мировой рынок. Через пару десятилетий Япония вытеснила американские компании с рынка микросхем памяти и домашней электроники, и тот же NEC построил самый мощный суперкомпьютер 1992 года — NEC SX-3/44. Одновременно в Японии стали появляться голоса о необходимости уменьшения политической зависимости от США, и японский министр транспорта написал книжку 「NO」と言える日本 («Япония может сказать «NO»!). К сожалению, это вставание с колен подкосил последующий экономический кризис, но японский опыт 1950-1980-х интересен для изучения.

На этом мы заканчиваем первую часть прогулки по музею. Если вам понравилось начало, я могу написать еще — про суперкомпьютеры Cray и Illiac, мини-компьюеры HP, DEC и Data General, первые микропроцессоры и микрокомпьютеры, RISC-овые рабочие станции и Лисп-машины, игровые приставки и роботов.

Теперь мы напомним для чего все это:

Если вас интересуют open-source проекты такого типа для повышения общественной образованности, вы готовы их писать на SystemVerilog или VHDL, выкладывать код на GitHub и писать про них статьи на Хабре (с анализом производительности), но у вас нет FPGA платы — вы можете одолжить ее (и получить насовсем если проект будет успешен) в одном из трех мест:

1. Александр Романов из МИЭМ НИУ ВШЭ в Москве. Александр вводит курсы по Verilog для студентов, и у него в дополнение к обычным платам в университете есть разномастная коллекцию плат с Altera и Xilinx FPGA, как часто используемые платы от Terasic и Digilent, так и слабодокументированные китайские платы — именно для открытых проектов.

2. Ярослав Вознюк из Киево-Могилянской академии. Я приезжал на их хакатоне для школьников, и оставил там несколько плат Digilent Cmod A7 35T с Xilinx Artix-7 для бартера «плата за проект с статьей на Хабре».

3. Владимир Макуха из Новосибирского Технического Государственного Университета. Там есть набор плат для проходящей через неделю конференции в Томске. Часть их них (Digilent Nexys DDR4) останется у Владимира, часть (Terasic DE0-CV) пойдет на такие проекты.

В качестве вдохновления вы можете посмотреть на существующие проекты с реализованными на FPGA процессорами на Хабре от @SparF , @Frantony , @oleh_plotnikov , @Kingit , @VMSS , @kirill90 , @Boris_92 (вы можете добавлять свои в комментариях).

Дополнение про основы современной разработки процессоров

Древние процессоры делались из радиоламп, транзисторов, микросхем малой степени интеграции и рисования схем мышкой на экране. Сейчас это все нет так. Пару слов для тех читателей, которые не знакомы с тем, что такое Verilog, ASIC и FPGA:

Из поста на Geektimes «Оруженосцы микроэлектроники. Видеорепортаж с конференции по проектированию электроники в Сан-Франциско»:

Пока мы обсудили кульминацию микроэлектронного проекта — изготовление микросхемы на фабрике. Но как такой проект начинается?

В последние 25 лет дизайн микросхемы чаще всего пишется на языке описания аппаратуры Verilog ([ранее] в Европе и у военных — VHDL), после чего специальная программа (logic synthesis) превращает дизайн в граф из проводов и логических примитивов, другая программа (static timing analysis) сообщает дизайнеру, вписывается ли он в бюджет скорости, а третья программа (place-and-route) раскладывает этот дизайн по площадке микросхемы.

Когда дизайн проходит все этапы: кодирование на верилоге, отладка, верификация, синтез, static timing analysis, floorplanning, place-n-route, parasitics extraction и т.д. — получается файл под названием GDSII, который отправляют на фабрику, и фабрика выпекает микросхемы. Самые известные фабрики этого типа принадлежат компании Taiwan Semiconductor Manufacturing Company или TSMC.

Из поста на Habrahabr Как начать разрабатывать железо, используя ПЛИС — пошаговая инструкция:

В самом простом варианте FPGA состоит из матрицы однородных ячеек, в функцию каждой из которых можно поменять с помощью мультиплексоров, подсоединенных к битам конфигурационной памяти. Одна ячейка может стать гейтом AND с четырьмя вводами и одним выводом, другая — однобитным регистром и т.д. Загружаем в конфигурационную память последовательность битов из памяти — и в FPGA образуется заданная электронная схема, которая может быть процессором, контроллером дисплея и т.д.

ПЛИС-ы / FPGA — не процессоры, «программируя» ПЛИС (заполняя конфигурационную память ПЛИС-а) вы создаете электронную схему (хардвер), в то время как при программировании процессора (фиксированного хардвера) вы подсовываете ему цепочку написанных в память последовательных инструкций программы (софтвер).