Ефимов А.И.
ОАО Конструкторское бюро системного программирования, г.Гомель, Беларусь, К.Т.Н., главный
программист, eai andr kb@mail.ru
ВИРТУАЛТРЕДИНГ: НОВАЯ АРХИТЕКТУРА ДЛЯ ВЫЧИСЛИТЕЛЬНЫХ СИСТЕМ С ПРЯМЫМ ТОНКО ГРАНУЛИРОВАННЫМ АППАРАТНЫМ МУЛЬТИПРОГРАММИРОВАНИЕМ
КЛЮЧЕВЫЕ СЛОВА
Параллельные вычисления, виртуалтрединговая архитектура, транзакционная микроархитектура, КПД, Силиконовый Занавес, прерывания, аппаратные семафоры.
АННОТАЦИЯ
В работе предложена новая архитектура вычислительных систем, названная виртуалтрединговой (ВТА). Ее особенностью, существенно упрощающей системное программирование и скорость исполнения параллельных приложений, является прямая аппаратная реализация управления нитями и вводом-выводом без прерываний, включая полнофункциональную синхронизацию. В ВТА использованы специальные архитектурные команды, заменяющие интерфейсные функции операционной системы. Ее высокая эффективность поддерживается оригинальной транзакционной микроархитектурой, заменяющей общепринятое грубо гранулированное программно-аппаратное мультипрограммирования нитей как единого целого тонко гранулированным аппаратным мультипрограммированием транзакций, порождаемых из архитектурных команд. Для количественного сравнения эффективности ВТА с существующими архитектурами предложено определение общетехнического показателя качества КПД. Представляется, что включение в учебный процесс подготовки инженеров и системных программистов исследования и реализации ВТА на свободных для академического использования средствах моделирования и макетирования должно значительно усилить
конкурентоспособность специалистов в области информационных технологий.
Эффективность вычислительных систем
По утверждению эксперта в области высокопроизводительных вычислительных систем Бартона Смита [1] в настоящее время требуются радикальные решения, способные вывести индустрию IT из спирали специализации (spiral of specialization), в которой "высокопроизводительными считаются те вычисления, которые хорошо выполняются высокопроизводительными системами". Такие решения должны обеспечить высокую скорость параллельных вычислений общего назначения [2], основным свойством которых является обработка в реальном времени интенсивного потока транзакций большим количеством нитей, взаимодействующих через разделяемую память. Такие вычисления характерны для больших СУБД, платежных систем и систем жесткого реального времени, требующих 5-10 микросекундного темпа обработки и управления [3].
Рассмотрим существующие подходы оценки эффективности вычислительных систем и определим для них общетехнический показатель качества - коэффициент полезного действия (КПД). Стерлинг [4] выделил четыре основные причины снижения скорости систем, "четыре всадника Апокалипсиса":
• накладные расходы - дополнительные работы на управление параллельностью;
• латентность - простои при доступе к памяти или другим частям системы;
• конкуренция - работа при соперничестве за разделяемые ресурсы;
• голодание - простои из-за слабого параллелизма и дисбаланса загрузки.
В совокупности эти причины вызывают состояния обобщенной латентности аппаратуры -состояния, в котором не выполняется полезная работа по продвижению вычислений. Соответственно, КПД аппаратуры можно определить простой формулой:
КПД = 1 - Сол / С
где С является общей стоимостью аппаратуры при выполнении некоторой работы, а Сол -стоимостью оборудования, находившегося в состоянии обобщенной латентности во время ее выполнения. По аналогии с тепловыми двигателями, улучшив архитектуру вычислительных систем (двигатель Дизеля вместо паровой машины), можно лучше использовать физические ресурсы - площадь и энергопотребление кристалла. Для практической оценки КПД архитектур необходимы соответствующие средства аппаратного мониторинга обобщенной латентности.
В последующих двух разделах понятие обобщенной латентности используется как ключ для сопоставления эффективности существующих архитектур с предлагаемой виртуалтрединговой. Следует отметить, что введенный таким образом КПД более точно отражает именно качество архитектуры, чем общепринятый показатель быстродействие/стоимость, отражающий сочетание качества архитектуры технологии элементной базы.
Программно-аппаратное мультипрограммирование
Как показано работах [5,6], мультипрограммирование естественно считать ортогональным по отношению к виртуальной памяти направлением виртуализации ВС, радикально упрощающим параллельное программирование. Например, последовательная программа сортировки массива методом пузырька является очень простой, если массив полностью умещается в памяти. Но ее сложность возрастает на порядки, если массив не помещается в физической памяти, а виртуальная память не поддерживается. Мультипрограммирование обеспечивает сходное упрощение сильно распараллеленных алгоритмов в соответствии с концепцией взаимодействия последовательных процессов Дейкстры
[7].
Важнейшим практическим вопросом в вычислительных системах является эффективность, с которой подержаны эти направления виртуализации. Первая аппаратная реализация виртуальной памяти, заменившая ее чисто программную реализацию на основе оверлеев [8], появилась в суперкомпьютере Atlas, разработанном в 1961 году [9]. В ней использовалась одноуровневая организации с грубо гранулированным свопингом страниц (512 6-байтовых слов) между оперативной паять и барабаном. Последующее развитие привело к многоуровневой организации виртуальной памяти (кэши 1, 2 и 3 уровней с малой, до 32 байт, длиной свопируемых элементов) и когерентной работе в широко масштабируемых многоядерных системах [10,11].
В то же время, эффективность мультипрограммирования осталась практически на уровне, аналогичном уровню развития виртуальной памяти в системе Atlas [9]. В поддержку этого утверждения рассмотрим аппаратно-программное управления нитями и процессами - основными объектами мультипрограммирования в современных операционных системах [12]. Первичное управление любой вычислительной системой обеспечивает размещаемая в ПЗУ программа начальной загрузки 5, называемая также базовой системой ввода-вывода. Как и любая программа, она представляет собой результат трансляции алгоритма на языке (языках) программирования в исполнимый файл кода, содержащий архитектурные команды. На рисунке 1 для удобства дальнейшего изложения они показаны в 3х адреснгом формате архитектуры MIPS, для которой имеется свободный для академического использования проект системы на кристалле (СнК) MIPSfpga [13]. Поле OpC содержит код команды, поля AR[j] и AR[k] содержат адреса архитектурных регистров исходных операндов (либо литералы), а AR[i] - адрес регистра результата.
Исполнения кода BIOS идет в начальном состоянии процессора (или каждого ядра) на всех его аппаратных нитях. В этом состоянии количества программных процессов и нитей совпадает с числом аппаратных. На рисунке 1 аппаратные нити и процессы представлены дескрипторами нитей и контекстов. На основе этих дескрипторов устройства выборки команд и устройства управления памятью реализуют покомандное продвижение вычислений для nt нитей в контексте их процессов-хозяев.
Для поддержки мультипрограммирования BIOS может запускать на исполнение файл кода операционной системы (ОС), либо работать самостоятельно, как это принято во некоторых встроенных системах. В обоих случаях первичные нити порождают вторичные процессы и нити, являющиеся грубо гранулированными единицами мультипрограммирования. Порождение процесса заключается в создании в физической памяти вычислительной системы дерева трансляции, обеспечивающего отображение всех виртуальных адресов данного процесса на физические адреса оперативной памяти или файла свопинга. Как показано на рисунке 1, дескриптор процесса содержит свой идентификатор PId и корень дерева трансляции.
Отношения; |—| - один к одному (владелец-объект) +—<] - один ко многим (владелец- объекты) Рис.1. Организации аппаратно-программного мультипрограммирования
Вторичные нити создаются и исполняются в контексте своего процесса-хозяина. Каждая нить представляется дескриптором, содержащим свой идентификатор TId и идентификатор PId своего процесса-хозяина, к пространству которого относятся вырабатываемые архитектурными командами исполнительные адреса. В зависимости от режима работы устройства управления памятью - со включенными средствами трансляции адресов или без - исполнительные адреса являются либо виртуальными либо физическими.
В общем случае в динамике работы ВС возникает показанная на рисунке 1 ситуация исполнения NT программных нитей на nt аппаратных. Программное мультиплексирование, аппаратно поддерживаемое устройством управления прерываниями (от таймера и устройств ввода-вывода), обеспечивают перезарузку (свопинг) дескрипторов программных нитей на аппаратных с накладными расходами, зависящими от архитектуры вычислительной системы. Если загружаемая нить принадлежит процессу, дескриптор которой не загружен в один из np дескрипторов, возникают дополнительные накладные расходы. Например, в широко распространенной архитектуре SPARC V9 [14] используется большой, около 4 килобайт, регистровый файл, обеспечивающий высокую скорость исполнения процедур - при одинаковой тактовой частоте почти втрое высшую, чем в архитектуре Intel. Платой за высокую скорость являются увеличенные в десятки раз накладные расходы, становящиеся неприемлемыми при высоком темпе мультиплексирования.
Суммирую сказанное в данном разделе, можно утверждать, что по существу между инженерами-схемотехниками и системными программистами сформировался показанный на
рисунке 1 Силиконовый Занавес со шлюзами в виде дескрипторов аппаратных нитей и контекстов. Работа по встречному перемещению (свопингу) программных нитей и процессов через эти шлюзами является основной причиной обобщенной латентности, снижающей КПД существующих вычислительных систем при исполнение параллельных вычислений общего назначения.
По-видимому, длительное существование Силиконового Занавеса объясняется двумя основными факторами:
- языковым барьером между инженерами-схемотехниками, до начала 90х годов использовавшими только схемное описание аппаратуры, и системными программистами, использующими текстовое представление;
- высокой стоимостью средств макетирования вычислительных систем, имеющих полностью открытый исходный код на языках описания аппаратуры.
Языковый барьер в настоящее время практически исчез - автор имеет большой опыт использования низкоуровневых языков для системного программирования - по собственному выбору ассемблер для БЭСМ-6, младших моделей ЕС-ЭВМ и PC-AT и по заказу forth для доработки BIOS SPARC V8. Этот опыт и опыт моделирования и макетирования систем на кристалле позволяет утверждать, что программирование на языке verilog гораздо комфортнее, чем на названных выше языках (особенно forth). Чтобы стать специалистом по логическому программированию систем на кристалле, студенту, имеющему опыт разработки и отладки параллельных программ на языке си, потребуется немного усилий, чтобы привыкнуть к разнице между передачей информации через программные переменные и аппаратные объекты - провода и триггеры. Второй фактор в настоящее время стал неактуальным в связи с появлением недорогих свободных проектов систем на кристалле СнК, например упомянутого MlPSfpga [13], который может быть реализован на недорогой макетных платах.
Представляется, что включение в учебный процесс подготовки инженеров и системных программистов совместных проектов реализации ВТА на свободных для академического использования средствах моделирования и макетирования позволит создать новую междисциплинарную специальность с высокой конкурентоспособностью на современном рынке. В следующем разделе представлено концептуальное описание реализации ВТА на основе базе оригинальной микроархитектуры, названной транзакционной (ТМА). Ее исследование и реализация позволит новым специалистам перенести Силиконовый Занавес в самое подходящее место - перед "Всадниками Апокалипсиса".
Архитектура виртуалтрединговой системы на кристалле
Прямое аппаратное мультипрограммирование
Как показано на рисунке 1, в конвейерах существующих микроархитектур исполняются только команды, принимаемые на вход устройств выборки из представленного дескрипторами фиксированного множества аппаратных нитей (для сокращения объема и сложности настоящей ной статье управление контекстами не рассматривается). В ТМА общепринятое грубо гранулированное одноуровневое представление нитей аппаратными дескрипторами заменено показанным на рисунке 2 двухуровневым представлением. Все программные нити, создаваемые архитектурными командам ВТА, постоянно представлены в директории дескрипторов нитей NT вхождениями-дескрипторами, состав полей которых описан в предыдущем разделе. В отличие от сосредоточенного регистрового представления в существующих микроархитектурах, дескриптор нити распределен по уровням системной виртуальной памяти, начиная с регистров, содержащий его корень (на рисунке выделен рамкой) до кэшей и оперативной памяти, в которые могут перемещаться отдельные архитектурные регистры.
Функцию устройств выборки команд реализует монитор нитей, число входных каналов выборки которого выбирается в зависимости от максимального числа нитей NT. Архитектурные команды, как в известных архитектурах, распределены по нескольким уровням памяти от кэша уровня 1 до оперативной памяти. Исполнение нитей реализуется по двухуровневой схеме. На первом уровне монитор нитей в каждом процессорном такте анализирует готовность к исполнению и приоритет полного множества нитей. По результатам анализа для каждой готовой к исполнению нити он выбирает очередную архитектурную команду и формирует на ее основе первичную транзакцию, которую выдает через перекрестный коммутатор в пул исполнительных устройств. Как показано на рисунке 2, транзакция наследует все атрибуты нити-хозяина - ее идентификатор, принадлежность процессу-хозяину и приоритет, а также образ архитектурной команды.
- по простому ключу
м-
по состав но >п" ключу
Отношения; +-1 одни к одному Ассоциативные ссылки:
(владелец-объект) +—j - один ко многим
(владелец- объекты!
Рис.2. Организации СнК с прямым аппаратным мультипрограммированием
Соответствующее коду операции исполнительное устройство отрабатывает транзакцию и при этом может привлекать другие исполнительные устройства, передавая им вторичные транзакций. Устройство, отработавшее первичную транзакцию, возвращает результат завершения в выдавший ее монитор нитей. В ТМА используется тонко-гранулированное распределенное представление ассоциативного регистрового файла, прототип которого, ориентированный на работу с фиксированным множеством аппаратных нитей, описан в работе [15]. Первичные и вторичные транзакции в качестве операндов и результатов используют его структурированные элементы-регистры как показано на рисунке 2. Тэг элемента состоит из поля идентификатора нити-хозяина представляемого архитектурного регистра TId и поля iAR, содержащего его индекс в архитектурном регистровом файле. Поле Value содержит текущее значение. Поле LRU содержит счетчик обращений за заданный интервал времени и используется для перемещения элемента по уровням системной виртуальной памяти.
По существу монитор, каждое исполнительное устройство и элемент ассоциативного регистрового файла реализуют распределенное тонко гранулированное приоритетное мультипрограммирование на уровне транзакций, которое на архитектурном уровне оно приводит к покомандному продвижению вычислений. В зависимости от желаемой скорости исполнения отдельной нити монитор может использовать так и простое поочередное исполнение команд, так и ускоренное используя суперскалярную технику.
В следующем разделе приведено описание команд аппаратной синхронизации ВТА и их реализации в транзакционной микроархитектуре.
Синхронизация на основе аппаратно-управляемых семафоров
Средства синхронизации в ВТА основаны на использовании аппаратно-управляемых семафоров (АУС), объединяющих функции мутекса и условной переменной современных операционных систем [12]. Дополнительно они реализуют функцию локального сторожевого таймера для контроля времен работы в критической секции и ожидания входа в нее. АУС
организован как активный компонент микроархитектуры, содержащий показанные на рисунке 3 локальные регистры:
TIdCS - идентификатор нити, находящейся в критической секции (КС); - таймаут времени пребывания нити в КС;
PriorCS- временный (повышенный) приоритет при работе нити в КС;
MxQ - очередь запросов нитей к мутексу данного АУС;
CvQ - очередь запросов нитей к условной переменной данного АУС;
TLat - таймаут ожидания входа в КС по описываемым ниже командам SLOck и Swait.
Синхронизация нитей поддержана пятью архитектурными командами SGet, SFree, SLock, SWait и SPas. Следует подчеркнуть, что реализуемые АУС локальный, не использующий прерываний системного таймера, контроль связанных с критическими секциями длительностями и повышение приоритета нити при работе в ней позволяет полностью снять проблему инверсии приоритетов [16].
Команд SGet(t,pr), параметры которой задают поля TOutCS и PriorCS, выделяет выдавшей нити адрес-указатель АУС, обозначаемый далее идентификатором ps, подаваемый в как параметр в остальные четыре команды. Возврат освободившегося АУС выполняет команда Sfree(ps).
Команда SLock(ps,ts) реализует функцию системного вызова pthread_mutex_lock и обеспечивает вход нити в критическую секцию для работы с приоритетом PriorCS в течении времени ТОШС либо отказ входа, если время его ожидания превысило заданное операндом ts. Идентификации этих случаев обеспечивает возвращаемый результат.
Команда SWait(ps,ts) является аналогом вызова pthread_cond_timedwait и реализует неактивное ожидание входа в КС до выдачи команды SPas(ps), позволяя устранить ресурсоемкий опрос разделяемых переменных в критической секции.
Рис 3. Организации синхронизации с использованием аппаратноуправляемых семафоров
Команда SPas(ps) объединяет действие системных вызовов pthread_mutex_unlock и pthread_cond_broadcast, выводит нить из критической секций, охраняемой семафором ps и освобождает ее для одной из других конкурирующих нитей.
В следующем разделе приведен пример, иллюстрирующий применение рассмотренных средств для организации ввода-вывода.
Ввод-вывод: Interruption considered harmful
Как нетрудно убедиться, транзакционная микроархитектура для реализации тонко гранулированного мультипрограммирования, включая аппаратную синхронизацию с
таймированием связанных с критическими секциями длительностей, не использует асинхронных прерываний. Рассмотренные средства синхронизации ВТА в сочетании с эффективной поддержкой большого количества нитей позволяют выделить каждому каналу ввода-вывода, поддерживающему независимую активность внешних устройств, собственную программную нить. Такая нить, называемая нитью ввода-вывода, создается обычной нитью, называемой программной нитью и работает с максимальным приоритетом. Нить ввода-вывода реализует с одной стороны жесткое временное взаимодействие с аппаратурой ввода-вывода, а с другой мягкое взаимодействие с программной нитью по схеме поставщик-потребитель, используя описанные в предыдущем подразделе аппаратные семафоры.
Рисунок 3 на примере реализации алгоритма поставщик-потребитель иллюстрирует семантику средств синхронизации с использованием АУС, которая подходит как для взаимодействия вычислительных нитей между собой так и для взаимодействия с нитями ввода-вывода. Программная нить запрашивает АУС командой SGet, заносит его в доступную нити ввода-вывода переменную, инициализирует общие переменные и запускает нить ввода-вывода. Глобальная переменная np с начальным значением 0 показывает текущее количество заполненных блоков, которое не должно быть больше nmax. Нить-поставщик (при выводе информации это программная нить, а при вводе нить ввода вывода), находясь в критической секции, в зависимости от значения разделяемой переменной np, либо поставляет информацию, увеличивая np, и выходит из КС, выдав инструкцию SPas(ps), либо ожидает освобождения свободного места, перейдя по инструкции SWait(ps) в состояние неактивного ожидания в очереди к условной переменной с освобождением КС. Нить-потребитель либо использует поставленную информации (уменьшает np на рисунке), либо переходит в состояние ожидания, если ее нет.
Традиционной ресурсоемкая техника реализации ввода-вывода, применяемая даже в ОС мягкого реального времени 16, использует программные обработчики прерываний и нити-посредники, которые являются объектами грубо гранулированного мультипрограммирования используют все ресурсы аппаратной нити и, в худшем случае однонитевой архитектуры, ядра в целом. В результате большой объем аппаратуры во время обработки поддерживающих ввод-вывод прерываний будет находиться в состоянии обобщенной латентности, снижающей КПД вычислительной системы. В отличие от нее в ВТА заменяющая всех посредников нить ввода-вывода исполняется как поток транзакций, использующих только необходимый минимум тонко гранулированных элементов аппаратуры оставляя их основной объем для исполнения
вычислительных нитей.
В зависимости от открытости исходного кода устройств, реализованных на платах разработки СнК, нить ввода вывода может исполняться либо на процессорном ядре либо на показанном на рисунке 2 сопроцессоре ввода-вывода, имеющем простейшую систему команд, достаточную для взаимодействия с аппаратурой ввода-вывода и плюс три команды синхронизации SLock, SWait и SPas, отрабатываемые исполнительным устройством синхронизации. Поступающие от внешних устройств сигналы по существу являются только запросами внимания, а делает их прерываниями только некоторые архитектуры вычислительных систем.
Достаточно давно, в суперкомпьютерах использовались сервисные процессоры (CDC 6600 [17], 1960) и процессоры ввода вывода (Эльбрус-2 [18], 1980 год). Современные многонитевые суперкомпьютеры для высокопроизводительных вычислений общего назначения являются экстремально многонитевыми (Tera MTA [19], Cray XMT [20]) и вместо прерываний используют опрос выделенной нитью. Соответственно, в рамках учебных проектов реализации ВТА целесообразно отработать макро и микроархитектуру архитектуру сопроцессора ввода-вывода, который бы мог работать с основными современными устройствами USB, Ethernet, SATA и видеоадаптерами.
Завершая раздел, следует подчеркнуть что понятие "прерывание" не используется ни в ВТА, ни в транзакционной микроархитектуре - соответсвенно, можно утверждать, что в новых архитектуры мощных компьютеров interruption considered harmful.
Заключение
Параллельные вычислений общего назначения становятся доминирующими по объему средств, вкладываемых вычислительных системы для их исполнения. Для таких систем очень актуальным остается старый вызов Сеймура Крэя [21] "Каждый может построить быстрый процессор. Фокус в том, чтобы построить быструю систему". Важна также оценка кластерных систем Бартона Смита [22] в отношении таких вычислений "Современные микропроцессоры также
плохи для параллелизма общего назначения, как и динозавры, которые на них охотятся. Если новые капитаны компьютерной индустрии не будут готовы к архитектурным усовершенствованиям, они вскоре осознают тяжесть пути перестающих плыть против течения".
Представляется, что достаточно важные усовершенствования вносит предложенная в настоящей статье виртуалтрединговая архитектура. Современные средства автоматизации проектирования, открытые в исходных текстах проекты систем на кристалле и недорогие платы для их макетирования позволяют создать новую междисциплинарную специальность, включив в учебный процесс разработку совместных проектов усовершенствования доступных архитектур средствами виртуалтрединга. Это позволит подготовленным таким образом специалистам, как и пользователям их разработок, избежать судьбы динозавров и обеспечить длительную эволюции в параллельном мире.
Литература
1. Burton Smith, Reinventing Computing Microsoft Research Faculty Summit 2007 http://www.cct.lsu.edu/~estrabd/LACSI2006/Smith.pdf.
2. Burton Smith, The Quest for General Purpose Parallel Computing 1994 Developing a computer science agenda for highperformance computing ACM New York, NY, USA ©1994
3. Операционные системы реального времени http://asutp.ru/?p=600591.
4. T. Sterling. Critical Factors and Directions for Petaflops-scale Supercomputers. California Institute of Technology, NASA Jet Propulsion Laboratory, Presentation to IFIP WG10.3 e-Seminar Series. 4 January 2005.
5. Ефимов А.И. Машина с виртуальным мультипроцессированием: новая архитектура параллельных вычислений общего назначения., Вопросы радиоэлектроники, серия ЭВТ, выпуск 2, 2008 Электронная копия: http://www.mcst.ru/publikacii-mcst-s-2004goda.
6. Ефимов А.И. Двумерная виртуализация процессора: новый подход к повышению реальной эффективности суперкомпьютеров http://www.ospcon.ru/files/media/Efimov.pdf.
7. E.-W. Dijkstra, Cooperating sequential process, In F.Genuys, editor, Programming Languages. Academic Press, New York , 1968.
8. Оверлеи http://en.wikipedia.org/wiki/Overlay_(programming)
9. T. Kilburn, D. Edwards, M. Lanigan, and F. Sumner. One-level storage system. IRE Trans. Elect. Computers, 37:223--235, 1962. http://www.eecs.harvard.edu/cs261/papers/kilburn61.pdf
10. Cray MTA-2 https://ru.wikipedia.org/wiki/Cray_MTA-2
11. SPARC T5-2 SERVER http://www.oracle.com/us/products/servers-storage/ servers/sparc/oracle-sparc/t5-2/sparc-t5-2-ds-1922871.pdf
12. Love, Robert. Linux kernel development / Robert Love. — 3rd ed.
13. MIPSfpga programme opens up the MIPS architecture to universities worldwide http://blog.imgtec.com/mips-processors/mipsfpga-opens-up-the-mips-architecture-to-universities-worldwide.
14. https://www.fujitsu.com/hk/Images/JPS1-R1.0.4-Common-pub.pdf SPARC® Joint Programming Specification (JPS1):Commonality Sun Microsystems and Fujitsu Limited.
15. How to Fake 1000 Registers, Proceedings of the 38th annual IEEE/ACM International Symposium on Microarchitecture http://aggregate.ee.engr.uky.edu/LAR/micro05.pdf.
16. Eleventh real-time Linux workshop, Dresden, 2009 http://lwn.net/images/conf/rtlws11/papers/proceedings_2009.pdf.
17. CDC 6600 https://en.wikipedia.org/wiki/CDC_6600.
18. МВК "Эльбрус-2" http: //www2.icmm.ru/~masich/win/lexion / elbrus2/elbrus2.htm
19. The Tera Computer System. Robert Alverson, David Callahan, Daniel Cummings, Brian Koblenz, Allan Porterfield, and Burton Smith ACM International Conference on Supercomputing, pp. 1-6, June 1990 https://en.wikipedia.org/wiki/Cray_XMT.
20. Seymour Cray - A Man Whose Vision Changed the World www.cray.com/Assets/PDF/about/SeymourCray.pdf
21. Burton Smith, The end of architecture, ACM SIGARCH Computer Architecture News Homepage archive Volume 18 Issue 4, Dec. 1990, Pages 10-17.