Введение

CDC 6600 был флагманом серии 6000 мейнфреймовых компьютерных систем, производимых компанией Control Data Corporation. Обычно считается первым успешным суперкомпьютером, он превзошел предыдущего рекордсмена индустрии, IBM 7030 Stretch, в три раза. Обладая производительностью до трех мегаФЛОПС, CDC 6600 был самым быстрым компьютером в мире с 1964 по 1969 год, когда он уступил этот статус своему преемнику, CDC 7600. Первые CDC 6600 были поставлены в 1965 году в Ливермор и Лос-Аламос. Они быстро стали необходимостью для высокопроизводительных научных и математических вычислений, и системы были поставлены в Институт математических наук Куранта, CERN, Лоуренсовскую лабораторию радиационных исследований и многие другие организации. Всего было поставлено не менее 100 машин. CDC 6600 экспонируется в Музее истории компьютеров в Маунтин-Вью, Калифорния. Единственный рабочий компьютер серии CDC 6000 был восстановлен Living Computers: Museum + Labs.

История и влияние

Первые продукты CDC были основаны на машинах, разработанных в Engineering Research Associates (ERA), которые Сеймуру Крей попросили обновить после перехода в CDC. После экспериментальной машины, известной как "Little Character" ("Маленький символ"), в 1960 году они представили CDC 1604, один из первых коммерческих компьютеров на основе транзисторов и один из самых быстрых на рынке. Руководство было в восторге и планировало создать новую серию машин, более ориентированных на бизнес-приложения; они должны были включать инструкции для обработки символов и ведения учета, например. Крей не был заинтересован в таком проекте и поставил перед собой цель создать новую машину, которая была бы в 50 раз быстрее 1604. Когда его попросили предоставить подробный отчет о планах на один и пять лет вперед, он ответил, что его пятилетняя цель – "создать самый большой компьютер в мире", где "самый большой" в то время было синонимом "самого быстрого", а его план на один год – "достичь одной пятой пути к этой цели". Переведя свою основную команду в новые офисы рядом с первоначальной штаб-квартирой CDC, они начали экспериментировать с более качественными версиями "дешевых" транзисторов, которые Крей использовал в 1604 году. После многочисленных экспериментов они обнаружили, что нет возможности значительно ускорить работу германиевых транзисторов по сравнению с теми, что использовались в 1604. "Бизнес-машина", которую изначально хотело руководство, теперь оформлявшаяся в серию CDC 3000, достигла своего предела. Тогда Крей решил, что решение – работать с новыми кремниевыми транзисторами от Fairchild Semiconductor, которые только начинали появляться на рынке и предлагали значительно улучшенные характеристики переключения. В этот период CDC вырос из стартапа в крупную компанию, и Крей все больше разочаровывался в том, что считал абсурдными требованиями руководства. Ситуация стала особенно напряженной в 1962 году, когда новый CDC 3600 стал приближаться к производственному качеству и, казалось, полностью соответствовал ожиданиям руководства. Крей в конечном итоге сказал генеральному директору CDC Уильяму Норрису, что что-то должно измениться, иначе он покинет компанию. Норрис посчитал, что потерять его слишком рискованно, и дал Крэю зеленый свет на создание новой лаборатории в любом выбранном им месте. После недолгого поиска Крей решил вернуться в свой родной город Чиппева-Фолс, штат Висконсин, где он приобрел участок земли и основал новую лабораторию. Хотя этот процесс вызвал значительную задержку в разработке новой машины, в новой лаборатории, без вмешательства руководства, работа пошла быстрее. К этому времени новые транзисторы стали достаточно надежными, и модули, собранные на их основе, обычно работали с первого раза. 6600 начал обретать форму, и Крей работал бок о бок с Джимом Торнтоном, системным архитектором и "скрытым гением" 6600. За время существования машины (1964–1969 гг.) было продано более 100 CDC 6600. Многие из них были поставлены в различные лаборатории, связанные с разработкой ядерного оружия, а некоторые – в университетские вычислительные центры. На CDC 6600 было опровергнуто гипотеза Эйлера о сумме степеней, что стало одним из первых примеров прямого численного поиска. Крей немедленно переключил внимание на создание преемника, поставив цель – десятикратное увеличение производительности 6600, что воплотилось в CDC 7600. Позднее выпущенные компьютеры CDC Cyber 70 и 170 были очень похожи на CDC 6600 по общей архитектуре и почти полностью обратно совместимы с ним. 6600 был в три раза быстрее предыдущего рекордсмена, IBM 7030 Stretch, что вызвало тревогу в IBM. Тогдашний генеральный директор Томас Уотсон-младший написал своим сотрудникам 28 августа 1963 года: "На прошлой неделе Control Data объявила о системе 6600. Я понимаю, что в лаборатории, разрабатывающей эту систему, всего 34 человека, включая уборщика. Из них 14 – инженеры и 4 – программисты. Сопоставляя эти скромные усилия с нашей масштабной деятельностью по разработке, я не понимаю, почему мы потеряли лидерство в отрасли, позволив кому-то другому предложить самый мощный компьютер в мире". Ответ Крея был саркастичным: "Похоже, мистер Уотсон сам ответил на свой вопрос".

Описание

Типичные машины 1950-х и 1960-х годов использовали один центральный процессор (ЦПУ) для управления всей системой. Типичная программа сначала загружала данные в память (часто используя предварительно написанный библиотечный код), обрабатывала их и затем записывала обратно. Это требовало от ЦПУ достаточно сложной архитектуры для обработки полного набора инструкций, которые могли быть ему выданы. Сложный ЦПУ подразумевал большой размер, что вводило задержки в передаче сигналов между отдельными модулями, из которых он состоял. Эти задержки определяли максимальный предел производительности, поскольку машина могла работать только с такой частотой цикла, которая позволяла сигналам достигать следующего модуля. Крей пошел другим путем. В 1960-х годах ЦПУ обычно работали медленнее, чем основная память, к которой они были подключены. Например, процессору могло потребоваться 15 циклов для умножения двух чисел, в то время как каждый доступ к памяти занимал всего один-два цикла. Это означало, что основная память значительное время простаивала. Именно это время простоя и использовал 6600. CDC 6600 использовал упрощенный центральный процессор (CP), разработанный для максимально быстрого выполнения математических и логических операций, что требовало его минимального размера для уменьшения длины проводников и связанных с ними задержек в передаче сигналов. Это привело к тому, что основное шасси машины (как правило) имело крестообразную форму, а платы с компонентами ЦПУ располагались близко к центру, что позволило значительно уменьшить размер ЦПУ. В сочетании с более высокой скоростью переключения кремниевых транзисторов, новый ЦПУ работал на частоте 10 МГц (100 нс цикл), примерно в десять раз быстрее, чем другие машины на рынке. Помимо более высокой тактовой частоты, упрощенный процессор выполнял инструкции за меньшее количество тактов; например, ЦПУ мог завершить умножение за десять циклов. Для поддержки ЦПУ использовались десять 12-битных периферийных процессоров (ПП) объемом 4 КиБ каждый, имеющих доступ к общему пулу из 12 каналов ввода/вывода (В/В), которые обрабатывали ввод и вывод данных, а также определяли, какие данные отправлялись в центральную память для обработки ЦПУ. ПП были спроектированы для доступа к памяти в периоды, когда ЦПУ был занят выполнением операций. Это позволяло им выполнять ввод/вывод практически без затрат центрального процессорного времени, максимально загружая ЦПУ. В 6600 CP использовалось 60-битное слово и представление целых чисел в дополнительном коде, которое позже использовалось в машинах CDC до конца 1980-х годов, сделав их последними системами, помимо некоторых цифровых сигнальных процессоров, использующими эту архитектуру. Позже CDC предлагала различные варианты количества и типов ЦПУ, ПП и каналов, например, CDC 6700 имел два центральных процессора: 6400 CP и 6600 CP. В то время как другие машины того времени имели сложные панели управления, 6600 оснащен только панелью "холодного старта". Существует двойная консоль CRT, но она управляется операционной системой и не контролирует и не отображает аппаратное обеспечение напрямую. Вся машина 6600 содержала приблизительно 400 000 транзисторов.

Периферийные процессоры

Процессор мог выполнять только ограниченное количество простых инструкций. Типичный процессор того времени имел сложный набор инструкций, включавший инструкции для выполнения всех обычных служебных задач, таких как доступ к памяти и ввод-вывод. Cray вместо этого реализовал эти инструкции в отдельных, более простых процессорах, предназначенных исключительно для этих задач, что позволило значительно уменьшить набор инструкций центрального процессора. Это была первая реализация принципа, который впоследствии получил название архитектуры с уменьшенным набором инструкций (RISC). Возможность параллельной работы центрального процессора, периферийных процессоров (ПП) и системы ввода-вывода значительно повысила производительность машины. Обычно машина с несколькими процессорами стоила бы значительно дороже. Ключевым элементом конструкции 6600 было максимальное упрощение процессоров ввода-вывода, известных как периферийные процессоры (ПП). ПП были основаны на простом 12-битном CDC 160A, который работал значительно медленнее, чем центральный процессор, собирая данные и передавая их в основную память высокоскоростными пакетами через выделенное аппаратное обеспечение. 10 ПП были реализованы виртуально: аппаратное обеспечение центрального процессора было предусмотрено только для одного ПП. Это аппаратное обеспечение центрального процессора использовалось совместно и работало с 10 наборами регистров ПП, представляющими каждое из 10 состояний ПП (аналогично современным многопоточным процессорам). "Бочка" регистров ПП "вращалась", при этом каждый набор регистров ПП представлялся в "слот", занимаемый фактическим ПП. Общий процессор выполнял все или часть инструкции ПП, после чего бочка снова "поворачивалась", представляя следующий набор регистров (состояние) ПП. Для завершения инструкции требовалось несколько "поворотов" бочки. Полный "оборот" бочки занимал 1000 наносекунд (100 наносекунд на ПП), а выполнение инструкции могло занимать от одного до пяти "оборотов" бочки, или больше, если это была инструкция передачи данных.

Архитектура набора команд CP

Основой процессора 6600 является то, что впоследствии получило название RISC-система, в которой процессор оптимизирован для выполнения относительно простых инструкций с ограниченным и чётко определённым доступом к памяти. В отличие от этого, философия многих других машин заключалась в использовании сложных инструкций, например, одной инструкции, которая извлекала операнд из памяти и прибавляла его к значению в регистре. В процессоре 6600 загрузка значения из памяти требовала одной инструкции, а сложение – второй. Хотя теоретически это могло быть медленнее из-за дополнительных обращений к памяти, параллельная обработка нескольких инструкций в хорошо оптимизированном коде компенсировала эти затраты. Такое упрощение также требовало от программистов внимательного отношения к обращениям к памяти и сознательного написания кода для их минимизации. CDC 6600 CP, являясь машиной с тремя адресными регистрами, позволяет указывать все три операнда.

Модели

Серия CDC 6000 включала четыре основные модели: CDC 6400, CDC 6500, CDC 6600 и CDC 6700. Модели серии 6000 отличались только своими процессорами, которые были двух типов: процессор 6400 и процессор 6600. Процессор 6400 имел единый арифметический блок, а не отдельные функциональные блоки. В связи с этим он не мог перекрывать время выполнения инструкций. Например, в процессоре 6400, если за инструкцией умножения сразу следовала инструкция сложения, инструкция сложения не могла быть запущена до завершения инструкции умножения, поэтому общее время выполнения двух инструкций равнялось сумме их индивидуальных времен выполнения. Процессор 6600 имел несколько функциональных блоков, которые могли работать одновременно, то есть "параллельно", что позволяло процессору перекрывать время выполнения инструкций. Например, процессор 6600 мог начать выполнять инструкцию сложения в следующем такте процессора после начала инструкции умножения (при условии, конечно, что результат инструкции умножения не является операндом инструкции сложения), поэтому общее время выполнения двух инструкций равнялось просто времени выполнения более длительной инструкции умножения. Процессор 6600 также имел стек инструкций, своего рода кэш инструкций, который помогал увеличить пропускную способность процессора за счет уменьшения времени простоя, вызванного ожиданием ответа памяти на запросы по извлечению инструкций. Оба типа процессоров были программно совместимы, поэтому программа, работающая на любом из этих процессоров, работала бы одинаково на другом, но быстрее на процессоре 6600. Действительно, все модели серии 6000 были полностью взаимосовместимы. CDC 6400 имел один процессор (процессор 6400), CDC 6500 имел два процессора (оба – процессоры 6400), CDC 6600 имел один процессор (процессор 6600), а CDC 6700 имел два процессора (один процессор 6600 и один процессор 6400).

Организация памяти

Пользовательские программы ограничены использованием только непрерывной области основной памяти. Часть памяти, к которой имеет доступ выполняющая программа, контролируется регистрами RA (Relative Address) и FL (Field Length), недоступными для пользовательской программы. Когда пользовательская программа пытается прочитать или записать слово в центральной памяти по адресу a, процессор сначала проверяет, находится ли a в диапазоне от 0 до FL-1. Если это так, процессор обращается к слову в центральной памяти по адресу RA+a. Этот процесс известен как релокация с базой; каждая пользовательская программа видит основную память как непрерывный блок слов длиной FL, начинающийся с адреса 0; фактически программа может располагаться в любом месте физической памяти. Используя эту технику, операционная система может перемещать ("релоцировать") каждую пользовательскую программу в основной памяти, если регистр RA отражает её положение в памяти. Пользовательская программа, пытающаяся получить доступ к памяти за пределами допустимого диапазона (то есть с адресом, не меньшим FL), вызовет прерывание и будет завершена операционной системой. В этом случае операционная система может создать дамп памяти, который запишет содержимое памяти программы и регистров в файл, предоставляя разработчику программы возможность узнать, что произошло. Важно отметить различие с системами виртуальной памяти; в этом случае всё адресуемое пространство процесса должно находиться в основной памяти, быть непрерывным, и его размер не может превышать реальную ёмкость памяти. Все машины серии CDC 6000, кроме первых семи, могли быть сконфигурированы с дополнительной системой расширенной памяти (ECS). ECS строилась из иного типа ячеек памяти, чем использовалась в центральной памяти. Эта память была медленнее, но достаточно дешевой, чтобы её можно было сделать значительно больше по объёму. Основная причина заключалась в том, что ячейки памяти ECS соединялись всего двумя проводами (в отличие от пяти для центральной памяти). Благодаря очень широкой шине передачи данных, её последовательная скорость передачи была сопоставима со скоростью небольшой центральной памяти. Процессор 6000 мог непосредственно выполнять блочную передачу памяти между программой пользователя (или операционной системой) и блоком ECS. Использовались широкие каналы передачи данных, что обеспечивало высокую скорость операции. Границы памяти поддерживались аналогично центральной памяти, с использованием механизма RA/FL, поддерживаемого операционной системой. ECS могла использоваться для различных целей, включая хранение массивов пользовательских данных, превышающих объём центральной памяти, часто используемых файлов, подкачки и даже в качестве канала связи в многомашинном комплексе.

Периферийные процессоры (ПП)

Для выполнения задач обслуживания, которые в других конструкциях возлагались на центральный процессор, Крей включил десять дополнительных процессоров, частично основанных на его более раннем компьютере CDC 160 A. Эти устройства, называемые периферийными процессорами или ПП, были полноценными компьютерами, но оптимизированы для выполнения операций ввода-вывода и работы операционной системы. (Значительная часть операционной системы выполнялась на ПП, что освобождало большую часть вычислительной мощности центрального процессора для пользовательских программ.) Доступ к каналам ввода-вывода имели только ПП. Один из ПП (PP0) осуществлял общий контроль над машиной, включая управление программой, выполняющейся на основном процессоре, в то время как остальные были выделены для различных задач ввода-вывода; PP9 был выделен для системной консоли. Когда программе CP требовалось выполнить функцию операционной системы, она помещала запрос в известное местоположение (Reference Address + 1), за которым следил PP0. При необходимости PP0 назначал другому ПП загрузку необходимого кода и обработку запроса. ПП затем сбрасывал значение RA+1, чтобы сообщить программе CP об окончании задачи. Уникальная роль PP0 в управлении машиной представляла собой потенциальную единственную точку отказа, поскольку неисправность в этом узле могла привести к остановке всей машины, даже если девять других ПП и центральный процессор продолжали работать исправно. Крей устранил эту проблему в конструкции преемника 7600, предоставив возможность любому из ПП выступать в роли контроллера, а центральному процессору – переназначать любой из них на эту роль. Каждый ПП включал в себя собственную память объемом 4096 12-битных слов. Эта память использовалась как для буферизации ввода-вывода, так и для хранения программ, но исполнительные устройства разделялись между десятью ПП в конфигурации, называемой "бочка и слот". Это означало, что исполнительные блоки ("слот") выполняли один цикл инструкции от первого ПП, затем один цикл инструкции от второго ПП и так далее, поочередно. Это было сделано как для снижения стоимости, так и потому, что доступ к памяти CP требовал 10 тактов ПП: когда ПП обращается к памяти CP, данные становятся доступными при следующем получении ПП своего времени слота.

Доступ к центральному процессору

В дополнение к стандартному набору команд, ПП располагают несколькими командами, специально предназначенными для взаимодействия с центральным процессором.

Длина слов, символы

Центральный процессор имеет 60-битные слова, а периферийные процессоры – 12-битные. CDC использовал термин "байт" для обозначения 12-битных сущностей, используемых периферийными процессорами; символы занимают 6 бит, а инструкции центрального процессора – 15 бит или 30 бит с 18-битным полем адреса со знаком, последнее из которых обеспечивает напрямую адресуемое пространство памяти в 128K слов центральной памяти (в современных терминах, при 8-битных байтах, это чуть менее 1 МБ). Наличие знака в адресных регистрах ограничивает размер отдельной программы до 128K слов. (Более поздние машины, совместимые с CDC 6000, могли иметь 256K или более слов центральной памяти, при наличии бюджета, но отдельные пользовательские программы по-прежнему были ограничены 128K словами CM.) Инструкции центрального процессора начинаются на границе слова, когда они являются целью инструкции перехода или возврата из подпрограммы, поэтому иногда требуются пустые инструкции для заполнения последних 15, 30 или 45 бит слова. Опытные программисты на языке ассемблера могли оптимизировать свои программы, заполняя эти пустые пространства различными инструкциями, которые могли понадобиться позже. 6-битные символы, в кодировке, называемой кодом отображения CDC, могли хранить до 10 символов в слове. Они обеспечивали набор символов из 64 символов, чего достаточно для всех заглавных букв, цифр и некоторых знаков препинания. Этого было достаточно для написания FORTRAN или печати финансовых или научных отчетов. Фактически использовалось два варианта наборов символов кода отображения CDC: на 64 и 63 символа. Набор из 64 символов имел недостаток: символ ":" (двоеточие) игнорировался (интерпретировался как нулевое заполнение), если он был последним символом в слове. Дополнительный вариант, называемый кодом отображения 6/12, также использовался в системах совместного использования времени Kronos и NOS, чтобы обеспечить полноценное использование набора символов ASCII с некоторой совместимостью со старым программным обеспечением. Поскольку не было инструкций для прямого обращения к байтам, код должен был упаковывать и сдвигать символы в слова. Очень большие слова и относительно небольшой объем памяти означали, что программисты часто экономили память, упаковывая данные в слова на битовом уровне. Благодаря большому размеру слова и 10 символам на слово, часто было быстрее обрабатывать сразу все символы слова, чем распаковывать, обрабатывать и переупаковывать их по отдельности. Например, компилятор CDC COBOL был весьма эффективен при обработке десятичных полей с использованием этой техники. Подобные методы сейчас широко используются в "мультимедийных" инструкциях современных процессоров.

Физический дизайн

Машина была построена в корпусе в форме знака плюс, с насосом и теплообменником в самой внешней части каждого из четырех плеч. Охлаждение осуществлялось за счет циркуляции фреона внутри машины и передачи тепла внешнему контуру охлажденной воды. Каждое плечо могло вместить четыре шасси, каждое около толщиной, с шарнирами в центре, и открывающиеся как книга. Пересечение "плюса" было заполнено кабелями, соединяющими шасси между собой. Шасси были пронумерованы от 1 (в котором размещались все 10 ППУ и их память, а также 12 довольно простых каналов ввода-вывода) до 16. Основная память процессора была распределена по нескольким шасси. В системе с основной памятью объемом всего 64 КБ одно из плеч "плюса" исключалось. Логика машины была упакована в модули размером примерно квадратных и толщиной. Каждый модуль имел разъем (30 контактов, два вертикальных ряда по 15) на одном крае и шесть тестовых точек на противоположном. Модуль устанавливался между двумя алюминиевыми теплоотводными пластинами для отвода тепла. Модуль состоял из двух параллельных печатных плат, с компонентами, монтируемыми либо на одной из плат, либо между ними. Это обеспечивало очень плотную компоновку; как правило, не подлежащую ремонту, но с хорошими теплоотводящими характеристиками. Такая конструкция называлась "cordwood construction" (строительство из штабелированного дерева).

CDC 7600

CDC 7600 изначально планировался как полностью совместимый с существующими машинами серии 6000; разработка началась под названием CDC 6800. Однако в процессе проектирования разработчики пришли к выводу, что сохранение полной совместимости с машинами серии 6000 ограничит потенциал улучшения производительности, и приняли решение пожертвовать совместимостью ради повышения быстродействия. Хотя процессор CDC 7600 был в значительной степени совместим по набору инструкций с процессорами 6400 и 6600, что обеспечивало переносимость кода на уровне исходного текста языков высокого уровня, аппаратная часть CDC 7600, особенно периферийные процессорные устройства (PPU), значительно отличалась, и для CDC 7600 требовалась другая операционная система. Это оказалось удачным совпадением, поскольку позволило разработчикам улучшить некоторые особенности архитектуры серии 6000, такие как полная зависимость последних от периферийных процессоров (PP), в особенности первого (обозначаемого PP0), для управления работой всей компьютерной системы, включая центральный процессор. В отличие от процессора 6600, процессор CDC 7600 мог самостоятельно управлять своей работой с помощью инструкции Central Exchange jump (XJ), которая осуществляла обмен содержимым всех регистров с оперативной памятью. Фактически, машины серии 6000 были впоследствии оснащены этой функцией.