В самом начале 80-х годов двадцатого столетия, как и много раз в более поздние годы, возникло мнение, что обычные процессоры достигли предела своей производительности. Тогда, по крайней мере, к этому имелись все предпосылки: имевшиеся на тот момент технологии уже не позволяли разместить больше логических схем на одном кристалле. Традиционные компьютеры с архитектурой CISC приблизились к пределу своих вычислительных возможностей, и было неясно, можно ли его преодолеть. Именно тогда на свет появились транспьютеры — чипы с принципиально новой архитектурой, которую сразу же окрестили научно-техническим прорывом, революционной разработкой и будущим компьютерных технологий. О самих транспьютерах и о том, как сложилась их судьба — наш сегодняшний рассказ.
Разработчики
Изобретателем транспьютеров является британская компания INMOS, штаб-квартира которой располагалась в городе с красивым названием Бристоль. Фирма была основана в 1978 году в рамках усилий британского правительства по развитию отечественной полупроводниковой промышленности. Правительство через Национальный совет по предпринимательству (NEB) выделило 50 миллионов фунтов стерлингов: эти инвестиции рассматривались как стратегический шаг, призванный обеспечить конкурентоспособность Великобритании в быстро растущей мировой электронной промышленности. Основная задача, которую ставили перед собой отцы-основатели — Ян Бэррон, Ричард Петритц и Пол Шредер — бросить вызов доминированию американских и японских производителей на британском рынке полупроводников.
Ян Марчант Бэррон, инженер с опытом работы в области компьютерных архитектур, стал основной движущей силой INMOS. Ранее он трудился в компаниях Elliott Brothers и Computer Technology Limited, где разработал транзисторный компьютер Elliott 803 и 16-битный компьютер, построенный на основе эмиттерно-связанной логики Modular One. В основе концепции INMOS лежала параллельная обработка данных — подход, который, по мнению Бэррона, должен был произвести революцию в вычислительной технике, преодолев ограничения традиционной последовательной обработки на процессорах существующих архитектур. Ричард Петриц, один из основателей компании, был опытным экспертом в области полупроводников. Он привнес ценный опыт из своей работы в RCA и General Electric, который очень пригодился в дальнейших проектах INMOS.
Первыми продуктами INMOS стали микросхемы статической оперативной памяти, за которыми последовали динамические RAM и EEPROM. Но главной разработкой компании стал транспьютер, который и вывел ее в лидеры британского рынка производителей полупроводников.
Рождение транспьютера
Поскольку технические возможности существовавших в начале 80-х процессоров уже были близки к исчерпанию, считалось, что единственный путь развития — это более широкое использование параллелизма, то есть, использования нескольких процессоров, которые будут работать вместе для одновременного решения задач. Предыдущие поколения микропроцессоров не подразумевали такой вариант применения, поэтому индустрия нуждалась в новых архитектурах, которым это было бы под силу. Увеличение тактовой частоты существовавших чипов уже не приводило к приросту быстродейсвия, что было особенно критично для приложений, требующих высокопроизводительных вычислений. Ян Бэррон небезосновательно полагал, что в будущем параллелизм и многозадачность станут поддерживать все операционные системы.
Транспьютеры, разработанные в INMOS с нуля, представляли собой микропроцессоры, каждый из которых имел собственную встроенную память и последовательные каналы связи для обмена данными с другими транспьютерами, что позволяло им напрямую взаимодействовать друг с другом. Такая архитектура теоретически давала возможность конструировать различные системы — от серверов и рабочих станций с небольшим количеством процессоров, до суперкомпьютеров, оборудованных сотнями транспьютерных чипов. В то время эта концепция была новаторской, до INMOS никто не проектировал ничего подобного.
Гениальность транспьютера заключалась в его масштабируемости, которая позволяла разработчиком создавать большие взаимосвязанные многопроцессорные системы для таких целей, как научные исследования и системы управления различным оборудованием в реальном времени.
Был и еще один немаловажный фактор — экономический: добавление большего количества процессоров потенциально обходится гораздо дешевле, чем использование одного более быстрого процессора. Разработчики полагали, что транспьютер будет стоить всего несколько долларов за единицу. При этом способов использования микросхемы существовало великое множество: например, один транспьютер мог быть установлен в качестве центрального процессора персоналки, а другой — вместо основного контроллера дисковых накопителей на той же машине. В традиционной архитектуре ПК вычислительные возможности дискового контроллера будут простаивать, когда к накопителю или дисководу не осуществляется доступ. Напротив, в транспьютерной системе свободные циклы любого из этих транспьютеров могут использоваться для других задач, что значительно увеличивает производительность всей системы в целом.
Анатомия транспьютера
Внешне транспьютер мало чем отличался от других микропроцессоров того времени: прямоугольный керамический корпус и металлические контакты для подключения к печатным платам. Самая известная модель, INMOS T414, была упакована в 32-контактный корпус DIL (dual in-line), который был распространенным форм-фактором для микропроцессоров в 1980-х годах. Однако внутри корпуса транспьютера скрывалась сложная архитектура, которая и отличала его от конкурентов.
Технически транспьютеры можно отнести даже не к микропроцессорам общего назначения, а к микроконтроллерам, поскольку они имели собственную оперативную память и были оборудованы практически всем необходимым для автономной работы. В микросхему встроили контроллер ОЗУ и даже микропрограмму, играющую роль операционной системы реального времени (RTOS). Таким образом, транспьютер представлял собой ранний прообраз тогда еще не существовавшего в природе устройства System-on-Chip (SoC).
Каждый транспьютер имел оперативную память на кристалле объемом от 2 до 4 килобайт в зависимости от модели. Эта локальная память была очень важна для уменьшения задержек при доступе к данным и минимизации необходимости поддерживать постоянную связь с внешней памятью. Включение локальной памяти позволяло каждому транспьютеру работать над задачами независимо, не полагаясь на общую оперативную память или шины, которые часто становились узким местом в многопроцессорных системах.
Чип работал на частоте 20 МГц, которая считалась довольно высокой для того времени, настолько, что конструкторы были очень обеспокоены возможностью реализации такого высокочастотного тактового сигнала на плате. Поэтому внешняя тактовая частота была намного ниже: 5 МГц, а для ее увеличения применялся умножитель. Ядро микросхемы использовало четыре непересекающиеся фазы, и разработчики могли задействовать любую их комбинацию. Поэтому можно с определенной долей приближения утверждать, что транспьютер на самом деле работал на частоте 80 МГц.
Основным инструментом управления передачей данных был микрокод: коды операций инструкций использовались в качестве точек входа в постоянное запоминающее устройство, а выходная информация из ПЗУ передавалась непосредственно в тракт данных. Для многотактных инструкций микрокод декодировал четыре возможных варианта для второго цикла в то время, пока тракт данных выполнял первый. Решение о том, какой из этих вариантов будет фактически использоваться, принималось ближе к концу первого цикла, что позволило обеспечить очень высокую производительность.
Самой уникальной и инновационной особенностью транспьютеров были последовательные аппаратные коммуникационные линии, которые назывались «os-link». Каждый транспьютер имел четыре высокоскоростных двунаправленных последовательных канала связи, которые позволяли ему напрямую связываться с другими транспьютерами со скоростью передачи данных 5, 10 или 20 Мбит/с. Любое количество транспьютеров могло быть соединено вместе по каналам связи (которые могли простираться на десятки метров), образуя одну вычислительную ферму. Правда, передача данных между транспьютерами осуществлялась по цепочке, что неизбежно вызывало задержки в больших системах. Для решения этой проблемы INMOS разработала коммутатор с нулевой задержкой, который подключал до 32 транспьютеров (или коммутаторов) к еще более крупным сетям.
Транспьютеры могли загружаться как из памяти, так и через os-link — для выбора источника загрузки использовался специальный вывод микросхемы BootFromROM. Для этого была задействована двухбайтовая команда из верхней части памяти, с помощью которой обычно выполняется обратный переход к загрузочному коду. Если команда не поступила при подаче питания, микросхема будет ожидать получения данных по любому сетевому каналу. Это позволяло создавать многопроцессорные устройства, на которых один транспьютер всегда загружается из ПЗУ, а затем начнет отправлять загрузочный код другим транспьютерам, и сможет передавать разный код для разных чипов. Например, в транспьютер, выполняющий на устройстве функцию контроллера жестких дисков или дисководов, таким образом можно загрузить соответствующий драйвер.
Транспьютер имел всего три регистра данных и указатель рабочей области на обычный стек памяти, доступный с помощью инструкций. Это позволяло очень быстро переключать контекст, просто изменяя указатель рабочей области на память, используемую другим процессом. Набор команд состоял из восьмибитных инструкций, состоящих из опкода и полубайтов операндов. Это сделало транспьютер одним из немногих коммерческих процессоров с архитектурой MISC (Minimal instruction set computer).
Параллельные вычисления обеспечивал планировщик, который мог эффективно переключаться между несколькими процессами (или «потоками»), позволяя процессору обрабатывать целй комплекс задач одновременно. Ожидающие связи процессы автоматически приостанавливались, пока сетевая схема завершала чтение или запись, и это время простоя предоставлялось другим процессам. Подобный подход значительно ускорял работу чипа по сравнению с программной многозадачностью, используемой в других системах.
Язык Occam
Чтобы облегчить использование параллелизма, INMOS разработала специальный язык программирования для транспутеров под названием Occam, названный в честь Уильяма Оккама и его принципа простоты («бритва Оккама»). Occam был основан на модели CSP (Communicating Sequential Processes), в которой процессы обменивались сообщениями по каналам, подобно коммуникационным каналам самого транспьютера.
Occam позволял программистам определять процессы и указывать, как они взаимодействуют друг с другом, обеспечивая эффективные параллельные вычисления. Межпроцессное взаимодействие на основе каналов стало фундаментальной частью языка. Так, например, написание кода для контроллеров устройств стало тривиальной задачей: даже самая простая программа могла отслеживать последовательные порты в ожидании ввода-вывода и автоматически переходить в режим сна при отсутствии активности.
В Occam везде, где это возможно, использовалось детерминированное поведение. Во многих других системах недетерминизм (когда время и порядок выполнения элементов кода могут меняться) является основным источником ошибок и сложностей. Дизайн Occam позволяет избежать этого, предоставляя строгие правила для взаимодействия процессов. Коммуникационная модель Occam определяет процессы как независимые сущности, взаимодействующие через каналы. Процессы не обмениваются состоянием, что позволяет избежать многих подводных камней, связанных с параллельным программированием, таких как состояние гонки.
Как и большинство языков программирования, Occam поддерживает последовательное выполнение операторов с использованием оператора SEQ. Последовательность операторов выполняется в том порядке, в котором они появляются. Параллельность выражается с помощью конструкции PAR. Когда несколько процессов или операторов помещаются в блок PAR, они выполняются одновременно, параллельно. Связь между параллельными процессами в Occam осуществляется с помощью односторонних каналов. Процесс может отправить данные другому процессу по каналу, а процесс-получатель будет ждать, пока данные придут. Вот пример кода, в котором один процесс отправляет значение другому процессу по каналу:
CHAN INT c: -- объявляем целочисленный канал 'c'
PAR
c ! 42 -- Процесс 1 посылает integer-число 42 по каналу 'c'
INT x:
c ? x -- Процесс 2 получает значение из 'c' и сохраняет его в переменной 'x'
Occam был языком-первопроходцем, который ввел ключевые понятия в параллельное программирование, актуальные и сегодня. Упор на простоту помог ему стать эффективным инструментом для программирования транспьютеров.
Закат эпохи
Несмотря на инновационную архитектуру, транспьютеры так и не добились широкого коммерческого успеха. С появлением процессоров общего назначения с несколькими ядрами и растущим доминированием таких известных игроков, как Intel и Motorola, INMOS стало непросто удержаться на рынке. Кроме того, сложность программирования параллельных систем и нишевый характер многих приложений для транспьютеров ограничивали их более широкое применение.
В 1989 году INMOS была приобретена компанией SGS-Thomson (ныне STMicroelectronics), и разработка транспьютеров в итоге прекратилась. Однако наследие британцев продолжает жить. Многие из концепций, заложенных в транспьютеры, такие как параллелизм и распределенная обработка данных, повлияли на развитие многоядерных процессоров, графических чипов и современных технологий параллельных вычислений.
Статья поддерживается командой Serverspace.
Serverspace — провайдер облачных сервисов, предоставляющий в аренду виртуальные серверы с ОС Linux и Windows в 8 дата-центрах: Россия, Беларусь, Казахстан, Нидерланды, Турция, США, Канада и Бразилия. Для построения ИТ-инфраструктуры провайдер также предлагает: создание сетей, шлюзов, бэкапы, сервисы CDN, DNS, объектное хранилище S3.
IT-инфраструктура | Удвоение первого платежа по коду HABR
Автор: CyberPaul