Введение
Процессор с гетерогенными элементами (HEP) был представлен компанией Denelcor, Inc. в 1982 году. Архитектором HEP был Бертон Смит. Машина была разработана для решения задач гидродинамики для Баллистической исследовательской лаборатории. Система HEP, как следует из названия, собиралась из множества разнородных компонентов – процессоров, модулей памяти данных и модулей ввода-вывода. Компоненты были соединены посредством коммутируемой сети. Отдельный процессор, называемый PEM, в системе HEP (можно было подключить до шестнадцати PEM) был довольно нетрадиционным: посредством "очереди состояния программы (PSW)" до пятидесяти процессов могли поддерживаться аппаратно одновременно. Самая большая когда-либо поставленная система имела 4 PEM. Восьмиступенчатый конвейер команд позволял командам от восьми различных процессов выполняться одновременно. Фактически, в конвейере в любой момент времени могла присутствовать только одна команда от данного процесса. Поэтому полная пропускная способность процессора в 10 МИПС могла быть достигнута только при наличии восьми или более активных процессов; ни один процесс не мог достичь пропускной способности более 1,25 МИПС. Этот тип многопоточной обработки классифицирует HEP как процессор "бочкового" типа. Аппаратная реализация PEM HEP была выполнена на логике с эмиттерной связью. Процессы классифицировались как пользовательского или надзорного уровня. Процессы пользовательского уровня могли создавать процессы надзорного уровня, которые использовались для управления процессами пользовательского уровня и выполнения операций ввода-вывода. Процессы одного класса должны были быть сгруппированы в одну из семи пользовательских и семи надзорных задач. Каждый процессор, помимо очереди PSW и конвейера команд, содержал память команд, 2048 64-битных регистров общего назначения и 4096 константных регистров. Константные регистры отличались тем, что только процессы надзорного уровня могли изменять их содержимое. Сами процессоры не содержали памяти данных; вместо этого модули памяти данных могли быть подключены к коммутируемой сети отдельно. Память HEP состояла из полностью раздельной памяти команд (до 128 МБ) и памяти данных (до 1 ГБ). Пользователи видели 64-битные слова, но фактически слова в памяти данных были 72-битными, с дополнительными битами, используемыми для состояния (см. следующий абзац), контроля четности, тегов и других целей. В HEP была реализована разновидность взаимного исключения, в которой все регистры и ячейки памяти данных имели связанные состояния "пустой" и "полный". Чтение из ячейки устанавливало состояние в "пустой", а запись в нее – в "полный". Программист мог остановить процесс после попытки чтения из пустой ячейки или записи в полную ячейку, обеспечивая защиту критических секций. Коммутируемая сеть между элементами во многом напоминала современную компьютерную сеть. В сети были наборы узлов, каждый из которых имел три канала связи. Когда пакет приходил в узел, он обращался к таблице маршрутизации и пытался переслать пакет ближе к месту назначения. Если узел становился перегруженным, все входящие пакеты пересылались без маршрутизации. Пакеты, обработанные таким образом, получали повышенный уровень приоритета; когда несколько пакетов претендовали на один узел, пакет с более высоким уровнем приоритета маршрутизировался раньше пакетов с более низким уровнем приоритета. Другим компонентом коммутируемой сети была система sO, со своей собственной памятью и множеством отдельных шин DEC UNIBUS, подключенных для дисков и других периферийных устройств. Система также имела возможность сохранять биты "полный/пустой", которые обычно не были напрямую видны. Первоначальная производительность системы ввода-вывода оказалась крайне недостаточной из-за высокой задержки при запуске операций ввода-вывода. Рон Натали (из BRL) и Бертон Смит разработали новую систему из запасных частей на салфетках в местном стейк-хаусе и ввели ее в эксплуатацию в течение последующей недели. Основным языком программирования приложений HEP был уникальный вариант Fortran. Со временем были добавлены C, Pascal и SISAL. Синтаксис переменных данных, использующих биты "полный/пустой", предполагал добавление символа "$" перед их именем. Таким образом, 'A' обозначало бы локальную переменную, а $A – переменную блокировки "полный/пустой". Следовательно, возможность возникновения взаимоблокировки (deadlock) была реальной. Проблематично, что отсутствие "$" могло привести к непреднамеренной числовой неточности. Первая операционная система HEP была HEPOS. Майк Мусс участвовал в портировании Unix для Баллистической исследовательской лаборатории. HEPOS не была операционной системой, подобной Unix. Несмотря на то, что она была известна своей низкой стоимостной эффективностью, HEP получила внимание благодаря нескольким революционным функциям того времени. HEP обладал производительностью компьютера класса CDC 7600 в эпоху Cray 1. Системы HEP были приобретены Баллистической исследовательской лабораторией (система с четырьмя PEM), Лос-Аламосом, Аргоннской национальной лабораторией (одна PEM), Агентством национальной безопасности и немецкой компанией Messerschmitt (система с тремя PEM). Denelcor также поставила систему с двумя PEM в Университет Джорджии в обмен на их программную поддержку (система также была предложена Университету Мэриленда). Messerschmitt был единственным клиентом, который использовал HEP для "реальных" приложений; другие клиенты использовали его для экспериментов с параллельными алгоритмами. Система BRL использовалась для подготовки фильма с использованием программного обеспечения BRL CAD в качестве своего единственного реального приложения. Более быстрые и крупные проекты HEP 2 и HEP 3 были начаты, но так и не были завершены. Архитектурная концепция впоследствии была воплощена под кодовым названием Horizon.