stringtranslate.com

Джоэл МакКормак

Джоэл МакКормак — американский учёный-компьютерщик, который разработал для корпорации NCR версию машины p-кода , которая представляет собой своего рода стековую машину , популярную в 1970-х годах как предпочтительный способ реализации новых вычислительных архитектур и языков, таких как Pascal и BCPL . Конструкция NCR не имеет общей архитектуры с Pascal MicroEngine , разработанной Western Digital , но оба они предназначались для реализации p-системы UCSD .[1,2]

Теория P-машин

Урс Амманн, студент Никлауса Вирта , первоначально представил p-код в своей докторской диссертации (см. Урс Амманн, О генерации кода в компиляторе Паскаля, Программное обеспечение: практика и опыт, Том 7, № 3, 1977, стр. 391). –423). Основная идея заключается в том, что сложная программная система закодирована для несуществующего, вымышленного, минимального компьютера или виртуальной машины , и этот компьютер реализован на конкретном реальном оборудовании с помощью интерпретирующей компьютерной программы, которая обычно небольшая, простая и быстро разрабатываемая. Язык программирования Паскаль приходилось переписывать для каждого нового приобретаемого компьютера, поэтому Амманн предложил единожды переписать систему на виртуальную архитектуру. Успешной академической реализацией Паскаля стала UCSD p-System, разработанная Кеннетом Боулзом , профессором UCSD, который начал проект разработки универсальной среды программирования Паскаля с использованием архитектуры P-машины для множества различных вычислительных платформ, использовавшихся в то время. время. МакКормак был частью команды студентов, работавших над проектом.[3] Эти знания и опыт он взял с собой в НКР .

P-дизайн машины

НКР наняла МакКормака сразу после окончания колледжа. Ранее они разработали побитовую аппаратную реализацию машины p-кода с использованием набора микросхем AMD AM2900 . Машину преследовало множество проблем с синхронизацией и производительностью; Маккормак предложил модернизировать процессор, который будет иметь микросеквенсор, основанный на программируемой логике . Когда Маккормак покинул NCR, чтобы основать Volition Systems, он продолжил работу над процессором в качестве подрядчика.

В этом новом процессоре использовался горизонтальный микрокод, который радикально улучшил параллелизм внутри микроархитектуры. Эти широкие 80-битные микрослова позволяли ЦП выполнять множество операций за один микроцикл: процессор мог выполнять арифметическую операцию, одновременно выполняя чтение памяти во внутренний стек, или передавать содержимое регистра, одновременно читая его. новые данные в ALU. В результате многие из более простых операций с p-кодом требовали всего одной или двух микроинструкций; некоторые операции были построены с использованием тесных циклов из одного микрослова.

Два бита на такт выбирали одно из четырех времен цикла для каждой инструкции: 130, 150 или 175 наносекунд, которые генерировались с помощью линии задержки. Более быстрые детали от AMD также позволяли бы обеспечить время цикла 98 нс, но соответственно более быстрого блока управления ветвями не было. Отдельный блок предварительной выборки/форматирования инструкций также использовал линии задержки для генерации асинхронных сигналов синхронизации. Это устройство имело 32-битный буфер и могло декодировать следующие данные в нескольких форматах: знаковый байт; беззнаковый байт; слово; и сжатый «большой» формат, в котором небольшие числа 0..127 кодировались в одном байте, а большие числа в пределах 128..32767 — в двух.

Встроенный стек из 1024 16-битных слов хранил временные значения — скаляры и множества. Адреса стека двигались вниз , при этом указатель стека уменьшался перед записью и увеличивался после чтения. Регистр во внутреннем файле AMD 2901 хранил значение вершины стека, чтобы ускорить простые операции. Сложение целых чисел занимало всего один цикл команд; поскольку в регистровом файле всегда находился один операнд, требовалась только одна выборка из памяти стека.

Каждое широкое управляющее слово могло либо содержать адрес следующей микроинструкции, либо управлять следующей командой p-машины, которую необходимо извлечь. Таким образом, микросеквенатор мог практически произвольно переходить через управляющий код. Первые 256 микроинструкций в памяти соответствовали p-машинным инструкциям, поэтому микроассемблер помещал первое управляющее слово в соответствующее место. Инструкции P-кода, для выполнения которых требовалось несколько микроинструкций, не могли начинаться с ветки (поскольку это поле уже используется для перехода к остальной части микропрограммы для выполнения инструкции). [ нужна цитата ]

P-машинная архитектура

ЦП использовал технику хранения верхнего слова стека в одном из регистров AMD 2901. Это часто приводило к уменьшению количества микроинструкций. Например, вот несколько p-кодов такими, какими они оказались. tos — это регистр, а q — это регистр. "|" означает параллельные действия в одном цикле. (Стек работает не совсем таким образом... он уменьшается до того, как в него записываются данные, и увеличивается после чтения данных.)

Поскольку управление следующим адресом и местоположение следующего микрокода находились в каждом широком микрослове, штраф за выполнение микрокода в любом порядке не взимался. Таблица из 256 меток, и компилятор микрокода переместил первую инструкцию каждой из этих меток в первые 256 ячеек памяти микрокода. Единственное ограничение, которое это накладывало на микрокод, заключалось в том, что если p-код требовал более одной микроинструкции, то для первой микроинструкции не могло быть указано какое-либо управление потоком (так как она была бы заполнена командой «goto <остальная часть микрокода для p» -код>).

fetch	% Fetch and save in an AMD register the next byte opcode from	% the prefetch unit, and go to that location in the microcode.	q := ubyte | goto ubyte
SLDCI	% Short load constant integer (push opcode byte)	% Push top-of-stack AMD register onto real stack, load	% the top-of-stack register with the fetched opcode that got us here	dec(sp) | stack := tos | tos := q | goto fetch
LDCI	% Load constant integer (push opcode word)	% A lot like SLDCI, except fetch 2-byte word and "push" on stack	dec(sp) | stack := tos | tos := word | goto fetch
SLDL1	% Short load local variable at offset 1	% mpd0 is a pointer to local data at offset 0. Write appropriate	% data address into the byte-addressed memory-address-register	mar := mpd0+2	% Push tos, load new tos from memory
SLDX	dec(sp) | stack := tos | tos := memword | goto fetch
LDL	% Load local variable at offset specified by "big" operand	r0 := big	mar := mpd0 + r0 | goto sldx
INCR	% Increment top-of-stack by big operand	tos := tos + big | goto fetch
ADI	% Add two words on top of stack	tos := tos + stack | inc(sp) | goto fetch
EQUI	% Top two words of stack equal?	test tos - stack | inc(sp)	tos := 0 | if ~zero goto fetch	tos := 1 | goto fetch

Эту архитектуру следует сравнить с исходной спецификацией машины P-кода , предложенной Никлаусом Виртом .

P-производительность машины

Конечным результатом стала плата размером 9x11 дюймов для ЦП, которая работала с UCSD p-System быстрее, чем что-либо еще, с большим отрывом. В 35-50 раз быстрее, чем интерпретатор LSI-11 , и в 7-9 раз быстрее, чем это сделал Western Digital Pascal MicroEngine за счет замены микрокода LSI-11 микрокодом p-кода. Он также работал быстрее, чем машина Никлауса Вирта Лилита , но не имел возможностей растровой графики и примерно с той же скоростью, что и VAX-11/750, работающий с собственным кодом. (Но VAX мешал плохой код, исходящий из компилятора Berkeley Pascal, и он также был 32-битной машиной.)

Образование

Позднее трудоустройство

Публикации

Смотрите также

Рекомендации

  1. Архив новостей группы пользователей Pascal
  2. Музей P-системы UCSD
  3. Веб-сайт UCSD Pascal Reunion