Книга
Книга
Архитектура ЭВМ и искусственный интеллект
Л #1 к ^ fit S • Tjyi»± Mu's Ж Л -ц.
ШКЭД1Ш • T-^-W± ш ф м
^T^^J®7
* - A ti
Амамия М., Танака Ю.
АРХИТЕКТУРА ЭВМИ ИСКУССТВЕННЫЙИНТЕЛЛЕКТ
Перевод с японскогоС. О. Махарадзепод редакциейд-ра физ.-мат. наук Н. Г. Волкова
МОСКВА "МИР" 1993
ББК 32.973
А61
УДК 681.3
Амамия Мм Танака Ю.
Архитектура ЭВМ и искусственный интеллект: А61 Пер. с японск.— М.: Мир, 1993.—400 с., ил.
ISBN 5-03-002117-5
Книга является переводом седьмого тома 10-томной серии по инженерии знаний, написанной крупными японскими специалистами в области искусственного интеллекта. Она охватывает все современные проблемы архитектур ЭВМ, в частности рассматриваются архитектуры высокопроизводительных ЭВМ, модели обработки и вычислений, редукционные и потоковые машины, архитектуры памяти ЭВМ, • архитектуры Лисп- и Пролог-машин, а также машин баз данных.
Для разработчиков перспективных архитектур ЭВМ и студентов соответствующих специальностей вузов.
2404040000-165 А91-1302404040000-165 А91-130041(01)-93041(01)-93ББК 32.973ББК 32.973
2404040000-165 А91-130
2404040000-165 А91-130
041(01)-93
041(01)-93
ББК 32.973
ББК 32.973
Редакция литературы по информатике
ISBN 5-03-002117-5 (русск.)ISBN 4-274-07426-9 (япон.)ISBN 5-03-002117-5 (русск.)ISBN 4-274-07426-9 (япон.)© М. Амамия, 10. Танака. «Омся»,Токио, 1988.
ISBN 5-03-002117-5 (русск.)
ISBN 4-274-07426-9 (япон.)
ISBN 5-03-002117-5 (русск.)
ISBN 4-274-07426-9 (япон.)
© перевод на русский язык, Маха-радзе С. О., 1993
ПРЕДИСЛОВИЕ РЕДАКТОРА ПЕРЕВОДА
В последние годы благодаря разработке высокопроизводительных микропроцессоров облик вычислительной техники существенно изменился. Он характеризуется появлением персональных ЭВМ, супер-ЭВМ, а также сетей ЭВМ. Новые технические возможности вызвали к жизни ряд новых задач. В частности, расширился круг решаемых на ЭВМ задач — от инженерно-экономических и математических расчетов к обработке сложноорганизованных данных произвольной природы. Большое внимание уделяется созданию систем искусственного интеллекта, как наиболее сложного и перспективного направления в развитии информатики. Из этого направления в качестве самостоятельной линии выделились проблемы инженерии знаний, т. е. проблемы создания и функционирования баз знаний, относящихся к различным областям науки и техники.
Эти проблемы, являясь сложными и объемными, предъявляют жесткие требования к программному и аппаратному обеспечению, в частности, к быстродействию и объему памяти. В соответствии с этими требованиями был разработан ряд языков программирования (объектно-ориентированные и логические языки), дающих гораздо большие возможности в создании систем искусственного интеллекта по сравнению с обычными процедурными языками. Но при этом оказалось, что структура этих языков вошла в противоречие со стандартной (фон-неймановской) архитектурой ЭВМ, в основном приспособленной под нужды процедурных языков. Возникла необходимость в исследовании новых архитектур ЭВМ, учитывающих потребности задач искусственного интеллекта. В этом направлении ведется активный научный поиск во многих странах мира.
Предлагаемая вниманию советского читателя книга ведущих японских специалистов в области архитектур ЭВМ М. Амамии и Ю. Танаки представляет собой попытку анализа современных архитектур ЭВМ с позиций задач искусственного интеллекта. В книге большое внимание уделяется проблемам увеличения скорости обработки данных. Рассматриваются методы, основанные на использовании более совершенных конструкций микропроцессоров, а также идей конвейерной, параллельной, распределенной обработок. Анализируются современные методы организации памяти и доступа к ней, обеспечивающие высокую эффективность и быстродействие. Основная часть книги посвящена описанию архитектур ЭВМ, наиболее полно учитывающих интересы задач искусственного интеллекта и, в частности, инженерии знаний. Сюда относятся потоковые машины, редукционные машины и т. д.
Изложение ведется на доступном для начинающих уровне, требуется лишь знание основ устройства ЭВМ. Некоторые идеи
основаны на довольно абстрактных математических моделях, которые излагаются непосредственно в тексте. Для лучшего понимания содержания книги желательно знакомство с языками программирования Лисп и Пролог, хотя в большинстве случаев необходимые пояснения даются непосредственно в тексте. По моему мнению, книга вполне доступна студентам и аспирантам, специализирующимся в области архитектуры ЭВМ. и искусственного интеллекта, и будет полезна специалистам.
Н. Г. Волков
Глава 1ИСТОРИЧЕСКИЙ ОБЗОР АРХИТЕКТУР ЭВМИ ИХ КЛАССИФИКАЦИЯ
Одним из изобретений, совершивших небывалую техническую революцию в нынешнем столетии, является хорошо известный всем самолет. Тем нс менее техническая революция в области вычислительных машин еще более поразительна. Трудно представить, что ЭВМ, которая всего лишь 40 лет назад весила 30 т и занимала площадь 200 м2, теперь можно разместить на кремниевом кристалле площадью 5 мм2, а достаточно совершенные и быстродействующие ЭВМ можно приобрести по цене в несколько сотен иен. Вычислительные машины, для работы которых прежде необходимо было вводить коды, состоящие из единиц и нулей, сегодня доказывают теоремы, переводят тексты с одного языка на другой, производят спектральный анализ металлов, отображают на экране графического дисплея видимый из окна пейзаж и делают многое другое. В данной главе описаны этапы развития архитектур ЭВМ, отмечены основные тенденции в этом развитии, его движущие силы и перспективы на будущее.
ОСНОВНЫЕ ПОЛОЖЕНИЯ, КАСАЮЩИЕСЯ АРХИТЕКТУР ЭВМ
Специалисты по архитектуре ЭВМ называются архитекторами вычислительных машин. Задачей такого архитектора является разработка вычислительной машины, которая отвечала бы конкретным требованиям ее пользователей либо общим требованиям сегодняшнего дня. Пользователи ЭВМ, как правило, хотят иметь машину (1) как можно более универсальную, (2) способную решать как можно более сложные задачи, (3) как можно более быстродействующую, (4) как можно более надежную, (5) как можно более «дружественную», (6) как можно более дешевую.
В комбинации друг с другом эти требования являются взаимоисключающими. Например, если попытаться увеличить производительность машины, сохранив при этом ее функциональные возможности, неизбежно возрастает ее стоимость. Если же сделать ее более дружественной к пользователю при прежней стоимости, то получим явный проигрыш в производительности. То же самое можно сказать и о других комбинациях перечисленных требований.
Архитекторы ЭВМ ставят целью усовершенствование и обновление систем ЭВМ в каждом из 6 указанных направлений и в то же время хотят создать систему с оптимальным соотношением требований. Последняя работа называется «поиском компромисса», и для архитекторов ЭВМ это серьезный и весьма важный вид деятельности. Компромиссное решение, удовлетворяющее два противоречащих друг другу требования, во многом зависит от области применения ЭВМ, пользовательской среды и т. д. Главная особенность указанных требований заключается в том, что все они ничем нс ограничены. Поэтому и усилия архитекторов ЭВМ никогда нс прекратятся.
Среди перечисленных требований требования (2), (3), (4) и (6) допускают количественную оценку. Размер задачи можно выразить размером массива или области памяти. Единицей измерения быстродействия помимо известных MIPS (milllion instructions per second — миллион операций в секунду) hMFLOPS (million floating point, operations per second — миллион операций с плавающей запятой в секунду) является LIPS (logical inferences per second — число логических выводов в секунду) (для Пролог-машин, в частности). Надежность измеряется показателем MTBF (mean time between failures — среднее время между отказами). Стоимость выражается в иенах, долларах и других денежных единицах. Таким образом, характеристики, поддающиеся измерению, позволяют точно оценить степень усовершенствования и обновления системы.
Сложнее дело обстоит с «универсальностью» и «дружественностью», которые нельзя измерить количественно. Для того чтобы выполнить модернизацию системы, удовлетворяющую этим требованиям, архитектор ЭВМ должен обладать гибким мышлением и индивидуальной философией проектирования. Поэтому что касается этих двух требований, то здесь технологические аспекты возобладали над потребностями.
По упомянутым выше четырем направлениям японская технология занимает лидирующее место в мире, однако что касается «дружественности» и «универсальности», то ее отставание от США весьма ощутимо.
Под архитектурой ЭВМ обычно понимают внутреннюю структуру вычислительной машины, поэтому в Японии важное значение придают аппаратным средствам ЭВМ. Изначальная задача архитекторов ЭВМ заключалась в модернизации и обновлении системы путем поиска компромиссов между этими постоянно растущими требованиями таким образом, чтобы как можно в большей степени удовлетворить каждому из них. Для этого необходимы: усовершенствование нс только аппаратуры, но и программного обеспечения, а также модернизация на логическом и концептуальном уровнях, т. с. усовершенствование вычислительных моделей. Однако в отличие от программиста сфера деятельности архитектора ЭВМ при модернизации системы ограничивается лишь уровнем аппаратных средств, поэтому большинство методов модернизации рассматривается лишь с точки зрения аппаратуры. В такой ситуации важно нс упустить из виду модернизацию на более абстрактных уровнях, например уровне программного обеспечения, логическом и концептуальном уровнях.
В следующем разделе кратко описана история развития архитектур ЭВМ до середины 80-х гг., с тем чтобы заложить основы описания их современного развития и перспектив на будущее, которые приводятся в остальных главах книги.
ИСТОРИЯ РАЗВИТИЯ ВЫЧИСЛИТЕЛЬНОЙ ТЕХНИКИ ОТ МЕХАНИЧЕСКИХ МАШИН ДО ЭЛЕКТРОННЫХ
Появление машины, способной автоматически выполнять четыре арифметических действия — сложение, вычитание, умножение и деление, — датируется началом XVII в. В 1623 г. В. Шикард (1542—1635) изобрел машину, способную нс только суммировать и вычитать числа, но и частично перемножать и делить их. Однако, очевидно, об этой машине в то время было мало известно, поэтому более знаменитым считается настольный арифмометр на основе зубчатого колеса, созданный в 1642 г. великим французским философом и ученым Б. Паскалем (1623—1662). Ему пришла в голову идея механизировать канцелярские расчеты, которые проводил его отец, бывший муниципальным инспектором по налогообложению. В 1671 г. немецкий философ и математик Г. Лейбниц (1646—1716) создал «зубчатое колесо Лейбница», выполняющее четыре основных арифметических операции.
XIX век был веком значительных вычислений, выполняемых вручную, — это и составление таблиц логарифмов, и расчеты в астрономии, и многое другое. Задавшись целью автоматизировать процесс составления подобных числовых таблиц, английский математик Ч. Бэббидж (1791—1871) начал работать в 1823 г. над проектированием «разностной машины». По замыслу создателя эта машина с зубчатыми колесами должна была вычислять значения полиномов и печатать результаты на негативной пластине для фотопечати. Приводить в движение эту машину предполагалось с помощью парового двигателя. Однако реализовать машину имеющимися в то время техническими средствами нс представлялось возможным, кроме того, сам Бэббидж заинтересовался проектированием более мощной счетной машины, и в 1842 г. проект его первой машины был заморожен. Затем в 1837—1853 гг. С. Г. Шойц (1785—1873) создал несколько моделей разностной машины малого масштаба.
Новая счетная машина Бэббиджа получила название «аналитическая», и в 1834 г. он изложил се основные принципы. Эта машина впервые была применена в ткацком станке с псрфокарточным управлением, изобретенным французом Жаккаром. На одном таком станке можно было ткать различные по узору ткани в зависимости от комбинации отверстий, пробитых на перфокарте. По замыслу Бэббиджа такая машина должна была автоматически выполнять различные вычисления при последовательном вводе набора перфокарт, содержащих пары команд и данных, и изменять расположение отверстий на карте, а также порядок следования карт по мерс выполнения вычислений. Аналитическая машина — это программируемая автоматическая вычислительная машина с последовательным управлением, содержащая арифметическое устройство (mill) и память (store). Меценат проекта — графиня Ада Августа Лавлейс (1815—1852)—была программистом этой машины; она первая в мире женщина-программист, именем которой был назван разработанный уже в наши дни язык программирования Ада. Замыслам Бэббиджа нс суждено было воплотиться в жизнь из-за слабых технических возможностей того времени, и все завершилось лишь экспериментальной стадией, и то частично. К заслуживающим внимания отличительным чертам аналитической машины следует отнести внедрение команды условного перехода, изменяющей управление обработкой в зависимости от результатов вычислений.
Во второй половине XIX в. Г. Холлерит (1860— 1929) разработал машину с псрфокарточным вводом, способную автоматически классифицировать и составлять таблицы данных. Эта машина использовалась в 1890 г. в Америке при проведении переписи населения. Наличие-отсутствие отверстия в перфокарте обнаруживалось электрическими контактными щетками, а в счетчиках применялись реле. В 1896 г. Холлерит основал фирму, которая явилась предшественником знаменитой IBM (это название возникло в 1924 г.). Перфокарты, используемые в этой переписи
населения, были применены впоследствии фирмой IBM.
После смерти Бэббиджа заметного прогресса в опытном производстве универсальных вычислительных машин в Америке и Германии 30-х гг. нс было. В Германии в 1938 г. К. Цузе создал механическую вычислительную машину Z1. В Z1 в отличие от последующих машин, оперировавших с десятичными числами, впервые были использованы операции с двоичными числами. Модель Z3, разработанная позже, в 1941 г., была универсальной программируемой вычислительной машиной, се операционное устройство было выполнено на реле, и в машине применялись операции с плавающей запятой. В Америке Г. Айкен из Гарвардского университета (1900—1973) спроектировал релейную универсальную вычислительную машину, которая появилась на свет при содействии фирмы IBM в 1944 г. под названием Марк 1 (Harvard MarkI). На проект этой машины оказали влияние идеи Бэббиджа, поэтому она оперировала десятичными числами.
Скорость вычислений в механических машинах на основе зубчатого колеса и в электрических машинах, выполненных на реле, была ограничена, поэтому в 30-х гг. начались разработки электронных вычислительных машин (ЭВМ), элементной базой которых стала трехэлектродная вакуумная лампа — триод,— изобретенная в 1906 г. Лидом Форестом. Первая универсальная ЭВМ была разработана в Университете г. Пенсильвания (США) под руководством Дж. Маушли и Дж. Эккерта и называлась ЭНИАК (ENIAC). Разработка этой машины началась в 1943 г. и завершилась в 1946 г. Главной целью проектирования этой машины было составление числовых таблиц для вычисления траектории полета снарядов или ракет к цели. Машина весила 30 т, занимала площадь 200 м2, содержала 18 тыс. ламп и потребляла мощность 140 кВт. Кроме того, она использовала десятичные операции и ее программирование осуществлялось путем установки переключателей и коммутации разъемов.
СТАНОВЛЕНИЕ И УПРОЧНЕНИЕ ПОЗИЦИЙ АРХИТЕКТУРЫ ФОН НЕЙМАНА
С появлением машины ЭНИАК скорость выполнения операций стремительно возросла, но на программирование алгоритма вычислений, которое производилось путем установки переключателей и коммутации разъемов, уходило много времени, кроме того, еще одна проблема была связана с многочисленными ошибками, возникающими при этом. Джон фон Нейман (1903—1957), известный математик и физик, являвшийся в то время консультантом проекта ЭНИАК, предложил записывать алгоритм вычислений в память вместе с данными так, чтобы содержимое его можно было свободно изменять аналогично данным в соответствии с полученными результатами. Этот принцип получил название «принципа хранимой программы», он был использован в проектировании новой ЭВМ, названной ЭДВАК (EDVAC) в 1945 г.
В машине ЭДВАК применялась двоичная арифметика, в ее основной памяти были использованы элементы на ультразвуковых ртутных линиях задержки, и память была способна хранить 1024 44-разрядных слова. Операции выполнялись поразрядно, начиная с младшего разряда двоичного числа.
Машина ЭДВАК была введена в эксплуатацию в 1951 г., а первой ЭВМ с хранимой программой считается ЭДЗАК, работы над которой были завершены в 1949 г. М. Уилксом и др. из Кэмбриджского университета (Англия).
Историю вычислительных машин принято обсуждать по поколениям: первое, второе, третье и т. д., сейчас можно говорить о 3-м и четвертом поколении.
В 80-х гг. Япония предложила проект пятого поколения вычислительных машин, над разработкой которых интенсивно работают ученые нс только Японии, но и США и европейских стран. Классификация машин по поколениям показана в табл. 1.
Таблица 1.L История развития универсальных ЭВМ
Поколение (годы)
Элементная база
Переключательные элементы
Элементы памяти
Первое поколение (1945—1954)
Второе поколение (1955—1964)
Вакуумные лампы
Транзисторы
Ультразвуковые линии задержки, ЭЛТ
Память на магнитных сердечниках, магнитные диски
Третье поколение (1965—1974)
ИС (МИС, СИС)
ЗУ на магнитных сердечниках, ИС памяти
3,5-е поколение (1975—
1984)
БИС
БИС памяти
Четвертое поколение (1985—?)
СБИС
СБИС памяти
1.3.1. ПЕРВОЕ ПОКОЛЕНИЕ ЭВМ (1945—1954)
Первое поколение ЭВМ — это время становления архитектуры с хранимой программой, иными словами, архитектуры машин фон-неймановского типа. На рис. 1.1 в качестве классического примера архитектуры машин первого поколения показана архитектура машины IAS, разработанной Дж. фон Нейманом и др. в Принстоне. Эта машина имела память на ЭЛТ с произвольным доступом и в отличие от ЭДВАК, которая последовательно обрабатывала данные по одному двоичному разряду, составляющему слово, была параллельной машиной, одновременно обрабатывающей разряды данных. Машина состояла из трех структурных элементов: центрального процессора (ЦП), памяти и устройства ввода-вывода. В состав ЦП входило арифметико-логическое устройство (АЛУ) и устройство управления. Управление систе-
Отличительные черты
Аппаратные средства
Программные средства
Операционный блок с фиксированной запятой
Машинный язык, язык ассемблера
Операционный блок с плавающей запятой, индексный регистр, процессор ввода-вывода (ПВВ)
Языки высокого уровня, библиотека подпрограмм, монитор пакетного режима
Микропрограммное управление, конвейерная обработка, кэшпамять, мини-компьютеры, микропроцессоры
Мультипрограммирование, мультипроцессирование, операционная система (ОС), виртуальная память
Мультиплексный конвейер, встроенный матричный процессор, супер-ЭВМ, многопроцессорные системы, персональные компьютеры, рабочие станции
Многосегментная виртуальная память, виртуальные машины, базы данных, векторизатор, языки искусственного интеллекта
Компьютерные сети, разделение рабочих станций по назначению (проектирование, ИИ, коммерция), услуги компьютерных сетей
Виртуальная аппаратура, виртуальная машина, распределенные ОС, сетевая архитектура, экспертные системы
мой целиком было возложено на ЦП, и для пересылки данных пословно между устройством ввода-вывода и памятью также требовалось прямое управление со стороны ЦП. Машинная программа была уже составлена нс на машинном языке, а на языке ассемблера.
В это время, а именно в 1951 г., Эккерт и Маушли создали первую в мире коммерческую ЭВМ ЮНИ- ВАК 1 (UNIVAK1). Эта машина не была машиной с хранимой программой, и в 1952 г. фирма IBM создала первую в мире коммерческую ЭВМ IBM 701 с хранимой программой.
К передовым машинам этого поколения следует отнести Whirlwind I Массачусетсского технологического института (МТИ), в которой впервые была использована память на магнитных сердечниках, и машина АТЛАС (ATLAS) Манчестерского университета, в
которой была предпринята попытка использования одноуровневой памяти, по существу концепции виртуальной памяти, и индексных регистров.
Рис. 1.1. Архитектура ЭВМ IAS.
Для выполнения следующей последовательности операций: «для каждого г = 0 ~ 99 считать в аккумулятор (АС) содержимое адреса 1000 + /, к содержимому аккумулятора прибавить содержимое адреса
2000 + i и результат этой суммы записать по адресу 30000 + /» — в машинах этого поколения необходимо было либо последовательно записать эти три команды для каждого значения г, либо записать эти три команды для i = 0, а затем при изменении i перезаписывать поле битов в этих командах, показывающее адреса 1000, 2000, 3000. В первом случае необходима большая область памяти, а во втором — необходимо
ADD 100ADD 100100100ООПамятьПамятьСлагаемоеСлагаемоеПамятьПамять100100Индексный регистрИндексный регистрСлагаемоеСлагаемое
ADD 100
ADD 100
100
100
О
О
Память
Память
Слагаемое
Слагаемое
Память
Память
100
100
Индексный регистр
Индексный регистр
Слагаемое
Слагаемое
Рис. 1.2. Способы адресации.а — прямая адресация; б — косвенная адресация; в — индексная адресация.
перезаписывать программу после ее выполнения. Однако повторно выполнить такую же обработку было невозможно. Для решения этой проблемы и был введен индексный регистр.
Адрес слова, с которым в зависимости от команды выполняются операции считывания, записи и другие операции, называется адресом операнда. Этот адрес может быть прямо указан в командном слове (рис. 1.2, а); такой способ называется прямой адресацией. Если адрес операнда содержится в слове, которое хранится в памяти, то он может быть получек косвенным путем с помощью команды, указывающей 2—1145
адрес этого слова (рис. 1.2,6), — такой способ называется косвенной адресацией. Чем больше способов адресации имеет машина, тем легче составлять программу. В машинах, снабженных индексными регистрами, можно свободно устанавливать значение индексного регистра и использовать команды инкремента-декремента, поэтому для указания адреса операнда в различных командах можно указывать модификацию с помощью индексного регистра, т. с. значение, полученное в результате сложения адреса, прямо указанного в команде, и содержимого индексного регистра и есть адрес операнда (рис. 1.2,в).
В большинстве машин первого поколения индексный регистр отсутствовал. Кроме того, для вызова подпрограммы нс было предусмотрено команды, автоматически сохраняющей адрес возврата, когда осуществляется переход к подпрограмме.
ВТОРОЕ ПОКОЛЕНИЕ ЭВМ (1955—1964 гг.)
Второе поколение ЭВМ ознаменовало собой начало применения транзисторов, созданных в 1948 г. в «Bell Laboratories», вместо вакуумных ламп. На смену ЗУ (запоминающим устройствам) на ЭЛТ и ультразвуковых ртутных линиях задержки пришли ЗУ на магнитных сердечниках и магнитных барабанах, которые стали применяться в качестве основной памяти. Широкое распространение получили также индексные регистры и аппаратные средства для выполнения операций с плавающей запятой. Стали применяться и специальные команды для вызова подпрограмм. Были разработаны языки программирования высокого уровня, такие, как Алгол, Кобол, Фортран, которые позволили составлять программы, нс учитывая тип машины [9]. Кроме того, были внедрены специализированные процессоры (процессоры ввода- вывода), способные управлять различными по быстродействию устройствами ввода-вывода, что позволило освободить ЦП для выполнения основной обработки. В машинах первого поколения системное программное обеспечение почти нс применялось, а во втором поколении уже стали применяться компиля-
Исторический обзор архитектур ЭВМ и их классификация 19 торы, библиотеки подпрограммы, режим пакетной обработки и т. д.
Первая экспериментальная машина на транзисторах ТХ-0 была создана в 1953 г. в лаборатории имени Линкольна (МТИ), но, как уже говорилось, первой ЭВМ с отличительными чертами второго поколения была IBM 704 на лампах, выпущенная в 1955 г. Она имела индексный регистр и аппаратные средства для выполнения операций с плавающей запятой, а также первый вариант операционной системы (ОС). В машине IBM 700 — преемнике IBM 704 — был применен процессор ввода-вывода. Появились системы ЭВМ, и путем изменения конфигурации памяти или устройства ввода-вывода в одной и той же ЭВМ стало возможным построение различных систем ЭВМ, отвечающих конкретному приложению. Машины IBM 7090, IBM 7094 — это транзисторные модели IBM 709.
Процессор ввода-вывода (ПВВ). ПВВ — это специализированный процессор, управляющий обменом данных между устройствами ввода-вывода (УВВ) и основной памятью. Это управление осуществляется с помощью программы ввода-вывода, выполняемой ПВВ автономно. Программа ввода-вывода состоит из команд ввода-вывода, которые считываются ПВВ из основной памяти и выполняются им. ЦП только инициирует выполнение программы ввода-вывода в ПВВ. На рис. 1.3 показана структура ПВВ машины IBM 7094. Если обмен данными между ПВВ и основной памятью осуществляется по 36 бит одновременно, то обмен данными между ПВВ и УВВ осуществляется по 6 бит, поэтому ПВВ снабжен схемой для разбиения и повторной компоновки данных.
Регистр данных (РгД) выполняет роль буфера, а регистр команд (РгК) служит для хранения кода операции из выполняемой команды ввода-вывода (адрес операнда нс сохраняется). В счетчике данных (СчД) устанавливается число одновременно пересланных слов по команде пересылки данных. Программный счетчик (ПС) указывает адрес следующей команды ввода-вывода. Текущие состояния операции ввода-вывода последовательно устанавливаются в
регистре состояний (РгС). При инициировании операции ввода-вывода ЦП передает в ППВ имя соответ-
К аппаратуре ввода-выводаК аппаратуре ввода-вывода
К аппаратуре ввода-вывода
К аппаратуре ввода-вывода
363636
36
36
Шина данных памятиШина адреса памяти
Рис. 1.3. Процессор ввода-вывода ЭВМ IBM 7094.
ПС —программный счетчик — хранит адрес следующей выполняемой команды ввода-вывода; РгД —регистр данных; РгК — регистр команд (5 бит) — хранит КОП-команды ввода-вывода; РгА—регистр адреса (5 бит); СчД — счетчик данных — хранит число переданных слов; РгС - регистр состояний.
ствующего УВВ и начальный адрес хранения программы ввода-вывода. После этого программа ввода-вывода выполняется ПВВ, а ЦП может выполнять другую программу. По окончании операции ввода-вывода ПВВ
устанавливает РгС тем или иным способом в зависимости от нормального или аномального окончания и, послав в ЦП сигнал прерывания, извещает его об окончании ввода-вывода.
Пакетная обработка. В первых ЭВМ программы выполнялись поочередно, и каждый раз необходимо было вручную выполнять операции ввода программы и вывода ее результатов. Во втором поколении благодаря распространению ЗУ на магнитных лентах появилась возможность предварительно записывать на одну бобину с лентой несколько программ, автоматически выполнять их в том порядке, в котором они записаны на ленту, и результаты их выполнения последовательно записывать на магнитную ленту другого ЗУ. Такой вид обработки получил название пакетной обработки, а системное программное обеспечение, управляющее сю, стало называться монитором пакетного режима. Поскольку монитор пакетного режима должен был постоянно храниться в основной памяти, се объем пришлось увеличить.
Стековые машины. В это время появились ЭВМ, которые в основном использовали безадресные команды, т. с. команды, в которых нет поля адреса операнда. В машинах KDF-9 фирмы Electric (Великобритания) и В 5000 фирмы Burroughs (США) вместо аккумулятора (Акк) использовался стек, поэтому вместо команды помещения в Акк содержимого ячейки памяти X использовалась команда PUSH X, а вместо команды записи содержимого Акк в ячейку памяти X использовалась команда POP X. Для сложения значений X и Y использовались команды PUSH X и PUSH Y, с помощью которых значения X и Y последовательно помещались в стек. Затем по команде ADD они извлекались из стека и суммировались, а их сумма снова помещалась в вершину стека. Машины с такой конфигурацией получили название стековых машин. '
Первые суперкомпьютеры. Техника применения ЭВМ развивалась в направлении выполнения операций над числовыми значениями, поэтому необходимость решать более крупные задачи с более высокой
скоростью привела к разработке суперкомпьютеров, целью которых было ускорение вычислений. К первым машинам такого типа относятся LARC фирмы UNIVAC и Stretch (называемая также 7030) фирмы IBM. Эти машины нельзя назвать коммерческими, однако в них были применены методы параллельной обработки, увеличивающие число операций, выполняемых в единицу времени.
Один из таких методов заключался в одновременном выполнении некоторой команды и считывании из памяти следующей команды (считывание команды из памяти называется выборкой). Этот метод сейчас называется конвейеризацией команд. Другой метод заключался в параллельной обработке нескольких программ. Система, выполняющая параллельную обработку с помощью нескольких ЦП, получила название многопроцессорной (или мультипроцессорной) системы.
Разделение времени и мультипрограммирование. Смысл этих названий заключается в том, что одним ЦП выполняется параллельная обработка нескольких программ. Во-первых, множество пользователей, работая каждый на своем терминале, выполняют на одном и том же ЦП свои программы в диалоговой форме. Таким образом создастся видимость того, что каждый пользователь имеет собственную ЭВМ. Благодаря этому можно планировать эффективное использование такого ресурса, как ЦП. Во-вторых, когда некоторая программа ожидает окончания операции ввода-вывода, ЦП имеет возможность частично выполнять в это время другую программу, — таким образом можно повысить эффективность применения такого ресурса, как время ЦП. Такой режим работы называется мультипрограммированием. Чтобы работать в мультипрограммном режиме, необходимо обеспечить возможность временного прерывания текущей программы, перехода к выполнению другой программы, а затем возобновления выполнения прерванной программы. А для этого необходимо сохранить состояние выполнения программы, которое было до се прерывания, т. с. сохранить значение программ-
Исторический обзор архитектур ЭВМ и их классификация 23 ного счетчика (ПС) и различных регистров, и в первую очередь аккумулятора, причем эти значения необходимо сохранить до начала возобновления выполнения программы. Различные значения, сохраняемые в соответствующих регистрах, называются словом состояния программы (ССП).
ТРЕТЬЕ ПОКОЛЕНИЕ ЭВМ (1965—1974 гг.)
Переход к третьему поколению завершился к середине 60-х гг. Третье поколение характеризуется тем, что вместо транзисторов узлы ЭВМ стали строить на интегральных микросхемах (или интегральных схемах, ИС), которые по степени интеграции разделяются на малые ИС (МИС), средние ИС (СИС) и большие ИС (БИС), а также тем, что вместо памяти на магнитных сердечниках стала применяться полупроводниковая память. В это время для управления ЦП стали использовать метод микропрограммирования, который будет рассмотрен далее. Были доработаны и усовершенствованы методы конвейерной обработки, описанные выше применительно к суперкомпьютерам, и методы параллельной обработки — мультипрограммирование и мультипроцессирование,— которые стали широко применяться в универсальных ЭВМ. Были разработаны методы эффективного использования таких ресурсов, как время ЦП, пространство памяти и т. д. Среди них широкое распространение получил метод виртуальной памяти, целью которого было эффективное использование пространства памяти. Для повышения эффективности использования ЦП при параллельной обработке множества программ возникла необходимость в системной программе, управляющей ЦП. Так была создана операционная система (ОС).
Большинство машин, относящихся к третьему поколению по своим особенностям, входили в состав известной серии машин «System/ЗбО», выпущенной фирмой IBM в середине 60-х гг. Машины этой серии полностью взаимозаменяемы снизу вверх и образуют так называемое семейство ЭВМ.
Техника высокоскоростной параллельной обработки. Что касается области суперкомпьютеров, то здесь в.1964 г. была создана ЭВМ CDC6600, а в 1969 г. — CDC 7600, которые объединились в семейство CYBER. Для увеличения быстродействия машин путем одновременного выполнения множества операций стали использовать два главных способа — конвейерную обработку и обработку с помощью матричного процессора.
При конвейерной обработке операционный блок, как показано на рис. 1.4, разбивается на несколько (допустим, и) частей, и каждая операция последовательно выполняется в каждой такой части, начиная с первой по n-ю, причем как только одна операция заканчивает выполняться на некоторой части операционного блока, то эта часть начинает выполнять операцию, переданную с предыдущей части. Таким образом, все части операционного блока работают одновременно и выполняют п операций. Такой операционный блок называется конвейером. Допустим, что операционный блок спроектирован таким образом, что время прохождения одной операции до и после его разбиения на части одинаково и равно Т, а число операций, которые можно последовательно пропускать через конвейер, достаточно велико и равно N. В таком случае в исходном операционном блоке на выполнение одной операции потребуется время Т, но если используется n-звенный конвейер, то. на обработку N операций потребуется время (п + N) ■ (Т/n), т. е. на одну операцию потребуется время (л + М) -T/(n-N). Если отношение Nfn достаточно велико, то это время приближается к Т/л, т. е. скорость вычислений возрастает в п раз по сравнению со случаем без разбиения операционного блока на части. Конвейер, рассчитанный на выполнение однотипных операций, легче проектировать по сравнению с конвейером, рассчитанным на выполнение различных операций, при этом сокращаются затраты времени на разбиение операционного блока на части. .
Под матричным процессором понимается множество процессорных элементов, расположенных в виде
матрицы, так что обмен данными осуществляется между соседними элементами. Машины с матричными процессорами предназначены для решения численными методами задач, представленных дифференци-
Nujtyk” стадий
Время Г
4
б•
Рис. 1.4. Конвейерная обработка операций. а — до конвейеризации; б — после конвейеризации.
альными уравнениями с частными производными, и т. п.
Конвейерная обработка была внедрена в машинах STAR-100 CDC и ASC фирмы Texas Instruments. Попытка применения матричного процессора была предпринята в машине ИЛЛИАК-IV (ILLIAC-IV) Иллинойского университета (США). В этой машине 64 процессора под управлением главного процессора могут выполнять распределенную обработку одной задачи и работают одновременно.
Мини- и микроЭВМ. Этот период называется еще периодом зарождения мини-компьютеров. Фирма DEC выпустила в 1963 г. ЭВМ PDP-5, а в 1965 г.— PDP-8. Появление мини-компьютеров приблизило ЭВМ к научным сотрудникам и инженерам и расширило область их применения. Область применения ЭВМ теперь не ограничивалась только числовыми расчетами, она стала простираться до такой высокоуровневой обработки, как обдумывание ходов в шахматной игре, составление комбинаций из детских кубиков, лежащих на столе, путем управления схватом робота, снабженного органами зрения и проч. Стали интенсивно проводиться исследования в области создания искусственного интеллекта и быстро развиваться новая отрасль науки — информатика, задачей которой было более глубокое исследование возможностей ЭВМ и алгоритмов обработки. Мини-компьютеры явили собой самостоятельную вычислительную среду, на которую не распространяются ограничения сферы применения, будь то исследования по искусственному интеллекту или по вычислительной технике, и в этом смысле они внесли огромный вклад в развитие ЭВМ.
Быстрыми темпами развивалась и технология ИС: от малых ИС, содержащих 1—10 вентилей/кристалл, стал возможен переход к СИС, содержащим порядка 100 вентилей/кристалл, а в 70-х гг. произошел скачок к эпохе БИС, содержащих от нескольких сотен до нескольких тысяч вентилей/кристалл. Ускорителем такого развития была конкурентная борьба в погоне за увеличением емкости полупроводниковой памяти,
Исторический обзор архитектур ЭВМ и их классификация 27 а также уменьшением размеров и расширением функциональных возможностей карманных электронных калькуляторов.
В этой обстановке японские фирмы-изготовители электронных калькуляторов в целях создания многофункциональных калькуляторов, отвечающих разнообразным требованиям пользователей, стали обдумывать идею применения универсальной программируемой БИС, модификация функций которой была бы возможна путем изменения программы. Изложив эту принципиальную идею, одна из японских фирм заказала американской фирме Intel изготовить кристалл подобной БИС. Так, в 1971 г. появился первый в мире микропроцессор 4004. Микропроцессор 4004 оперировал словами длиной 4 бит, поэтому он получил название 4-разрядного микропроцессора. ЦП, реализованный на одном кристалле, был способен выполнять 45 видов команд. В 1973 г. эта же фирма выпустила 8-разрядный микропроцессор 8080, который оказал огромное влияние на последующее развитие микропроцессорной техники. 8080 был оснащен командами 72 типов, представленными 1—3 словами.
Микропрограммирование. Микропрограммирование— отличительная черта машин третьего поколения— как способ гибкого и систематического управления работой ЦП был предложен М. В. Уилксом в 1951 г., и в некоторых машинах первого и второго поколений была предпринята попытка использовать этот способ [10].
Выборка и выполнение команды ЦП осуществляются, как правило, по следующему алгоритму (рис. 1.5). Для выборки команды в основную память пересылается содержимое программного счетчика (ПС) в качестве адреса (стрелка (а)), одновременно в память выдастся сигнал, указывающий на то, что будет выполняться операция считывания. Результат считывания из основной памяти сохраняется в течение времени, необходимого для считывания, после чего с помощью управляющего сигнала пересылается в регистр команд (РгК) (стрелка (6)). В зависимости от длины командного слова к значению ПС
добавляется соответствующее целое число, и результат этой суммы есть начальный адрес следующей команды. Выполнение команды зависит от типа считанной
d
Рис. 1.5. Внутренняя структура и работа ЭВМ (упрощенный вариант).
ПС — программный счетчик; Акк — аккумулятор; РгК — регистр команд;
РгД— регистр данных; РгА — регистр адреса; ® вентиль (открывается/ закрывается управляющими сигналами).
команды. Если это команда перехода к адресу X, то X, находящееся в поле операнда РгК, пересылается в ПС (стрелка (с)) и осуществляется переход к операции выборки команды. Если команда, установлен-
ная в РгК, указывает на операцию сложения содержимого Акк и адреса X, то значение X в поле операнда РгК пересылается в качестве адреса в основную память (стрелка (d)), одновременно пересылается сигнал, указывающий на операцию считывания, и по истечении времени, необходимого для считывания, результат считывания посылается на один из входов АЛУ (арифметико-логического устройства) (стрелка (е)). Одновременно на другой вход АЛУ посылается содержимое Акк (стрелка (/)), а на управляющий вход АЛУ — сигнал, указывающий на выполнение операции сложения. Результат сложения поступает в сдвиговый регистр, после чего содержимое сдвигового регистра пересылается в Акк, обработка на этом завершается (стрелка (g)) и выполняется выборка следующей команды.
Роль ЦП заключается, собственно говоря, в пересылке данных из регистра в регистр и указании различным функциональным элементам типа АЛУ и памяти действий, которые им надлежит выполнять. Входы и выходы регистров, АЛУ и памяти соединены с другими регистрами. Эти соединения выполнены через отдельные вентили, и посредством передачи сигналов отпирания-запирания каждого вентиля осуществляется выбор только тех данных, которые надлежит подать на вход конкретного регистра, а также выбор одного или нескольких регистров, в которые нужно переслать данные. Управление выборкой команды и действиями ЦП, соответствующими команде, можно организовать при помощи стробирующих сигналов, управляющих пересылкой из регистра в регистр, и сигналов, указывающих действия различным функциональным элементам, передавая их последовательно в соответствующие временные интервалы. Одновременно выполняемые пересылки и операции с данными инициируются посредством одновременной передачи управляющих сигналов.
До внедрения метода микропрограммирования разработчики ЭВМ. проектировали последовательностные логические схемы, которые применялись для последовательной генерации этих сигналов. Входные сигналы этих схем соответствовали содержимому
регистра команд и части регистров, сохраняющих состояние ЦП, а выходные сигналы представляли собой стробирующие сигналы для пересылки данных из регистра в регистр и сигналы управления функциональными элементами. Система управления, основанная на использовании последовательностных логических схем, называется системой аппаратного управления.
Последовательностную логическую схему можно заменить на вычислительную машину. Это обстоятельство становится очевидным, если вспомнить, что в большинстве электронных устройств, где необходимы такие схемы, например в автоматах по продаже билетов, бытовой электроаппаратуре и т. п., используются микропроцессоры. Главными удобствами замены последовательностей логической схемы на ЭВМ являются простота проектирования и гибкость, обусловленная возможностью программирования.
Последовательностную логическую схему, управляющую работой ЦП, также можно заменить на ЭВМ. Другими словами, для управления ЦП главной ЭВМ можно использовать другую, встроенную ЭВМ. Такой способ называется микропрограммным управлением [11, 12]. В данном случае программа внутренней ЭВМ управляет действиями (микрооперациями) ЦП. Программа внутренней ЭВМ называется микропрограммой, а память, которую имеет внутренняя ЭВМ для хранения микропрограмм, называется управляющей памятью. Для обычных ЭВМ отсутствует необходимость изменения микропрограммы после окончания проектирования, поэтому в качестве управляющей памяти используют ПЗУ (постоянное запоминающее устройство, или ЗУ только для чтения). Для того чтобы содержимое управляющей памяти можно было изменять в зависимости от приложения, используют перезаписываемую управляющую память.
В машинах с перезаписываемой управляющей памятью систему команд (набор используемых команд) можно изменять путем перезаписи микропрограммы, хранимой в управляющей памяти. Таким образом, если в некоторой машине М перезаписать содержи-
Исторический обзор архитектур ЭВМ и их классификация 31 мое управляющей памяти и поместить в нее микропрограмму, позволяющую реализовать систему команд другой машины М2 на этой машине, то появляется возможность имитировать работу машины М2, т. с. выполнять на машине М объектную программу (код), составленную для М2, иначе говоря, программу, состоящую из машинных команд М2. Этот процесс называется эмуляцией. Микропрограммы, используемые для эмуляции различных ЭВМ, записываются в виде файлов во вторичное запоминающее устройство, затем из них выбирается одна микропрограмма и записывается в управляющую память, таким образом на одной ЭВМ можно имитировать работу нескольких машин.
Благодаря применению микропрограмм облегчается описание и тех команд, которые требуют выполнения сложных действий. Появляется возможность описания системы команд, повышающей эффективность применения специальных языков программирования высокого уровня. Кроме того, используя микропрограммы, можно так организовать управление ЦП, чтобы непосредственно на нем интерпретировать текст и выполнять программу, написанную на специальном языке высокого уровня или на соответствующем ему промежуточном языке. Машины, в которых реализована эта система, называются машинами языков высокого уровня [ 13].
Команда внутренней ЭВМ (называемая микрокомандой) состоит из поля кодов управляющих сигналов и поля управления переходом. Поле кодов управляющих сигналов содержит комбинацию нулей и единиц, показывающих включение/выключение линий управляющих сигналов. В этом поле можно использовать полную комбинацию нулей и единиц, один к одному соответствующую полному набору управляющих сигналов. Однако число разрядов поля кодов управляющих сигналов можно сократить, а значит, и сократить длину слова управляющей памяти, если сначала закодировать последовательность управляющих сигналов, а затем, после пересылки, декодировать их. Здесь следует заметить, что при пересылке данных в регистры и порты АЛУ нельзя одновре-
менно отпирать больше двух вентилей из тех, что расположены между этими регистрами и портами и соединенными с ними регистрами. Отсюда становится очевидным, что из полной комбинации нулей и единиц, соответствующей последовательности управляющих сигналов, одновременно используется только часть ее, и эту часть можно закодировать. Микропрограммы, в которых используется полная последовательность управляющих сигналов (т. с. полная комбинация нулей и единиц в поле кодов управляющих сигналов), называются горизонтальными микропрограммами, а микропрограммы с частичным кодированием комбинации нулей и единиц называются вертикальными.
В поле управления переходом указываются адрес следующей микрокоманды, подлежащей выборке, и тип перехода (условный/безусловный). При условном переходе начало перехода определяется сигналом состояния из ЦП и обычно, если условие нс установлено, путем перехода к следующей команде указывается только один начальный адрес перехода. К сигналам состояния ЦП относятся сигналы, указывающие на положительность/отрицательность результата операции в АЛУ, отсутствие нуля, наличие/ отсутствие переполнения и прочес.
В системе с вертикальными микропрограммами поле управления переходом можно закодировать вместе с полем управляющих сигналов.
Для посылки разных последовательностей управляющих сигналов, соответствующих выборке или выполнению разных типов команд, микропрограмма содержит разные начальные адреса. Внутренняя ЭВМ. выполняет микропрограмму, начиная с начального адреса, соответствующего выборке команды. В результате команда устанавливается в регистре команд (РгК), как это показано на рис. 1.5. С помощью декодера, например на базе быстродействующего ЗУ, содержащего таблицу декодирования, код операции (КОП) РгК (рис. 1.6) преобразуется в начальный адрес микропрограммы, соответствующей этой команде, и внутренняя ЭВМ выполняет микрокоманду, начиная с этого адреса. В самой последней микрокоман-
де в управляющей последовательности указывается безусловный переход к начальному адресу, соответствующему выборке команды, поэтому осуществляется возврат к операции выборки команды. Таким об-
РгК (регистр команд)
КОП Операнд
Микрооперация
Сигналы управления
Рис. 1.6. Принцип микропрограммного управления.
разом, действия, выполняемые внутренней ЭВМ, довольно просты и это управление можно реализовать на последовательностных логических схемах.
Архитектура памяти. В третьем поколении ЭВМ наряду с микропрограммированием были развиты и распространены различные архитектуры памяти. В частности, большое распространение получили архитектура с диспетчеризацией памяти, целью которой является повышение эффективности использования пространства памяти, расслоение памяти, целью которого является увеличение фактической скорости 3—1145
доступа к памяти, а также кэш-память. Более подробно об их особенностях изложено в гл. 6.
Для параллельной обработки нескольких программ методами мультипрограммирования и разделения времени ограниченное пространство памяти необходимо таким образом распределить между программами, чтобы избежать конфликтных ситуаций.
Рис. 1.7. Виртуальная и реальная память.
Обычно в основной памяти невозможно одновременно разместить области хранения и рабочие области всех программ, поэтому параллельная обработка осуществляется путем динамического распределения пространства памяти для каждой программы и пересылки информации между основной памятью и вторичной памятью. Если, добавив некоторый аппаратно реализованный механизм, сделать так, чтобы программисту казалось, будто для хранения программы данных имеется достаточно большое пространство памяти, то можно существенно облегчить его работу. Подобная система памяти получила название виртуальной памяти. В системе с виртуальной памятью основную память обычно называют реальной памятью.
Адреса виртуальной памяти не соответствуют адресам реальной памяти (рис. 1.7). Первые называются логическими адресами, а вторые — физическими адресами. Для указания адреса операнда в машинной команде используется логический адрес. Для преобразования его при выполнении команды в физический адрес необходим механизм трансляции адресов. Пространство виртуальной памяти обычно разбивается на несколько непрерывных областей определенного размера. Такие области называются страницами. Поэтому каждый логический адрес можно представить в виде двух составляющих: номера страницы и адреса внутри страницы (смещения). Номер страницы называется также адресом страницы. Трансляция адресов выполняется по страницам и для преобразования логического адреса страницы в физический адрес страницы используется специальная таблица. Адрес внутри страницы нс преобразуется. Болес подробно работа виртуальной памяти описана в разд. 6.3.
3,5-Е ПОКОЛЕНИЕ ЭВМ (1975—1984 гг.)
Развитие полупроводниковой технологии привело к появлению БИС (больших интегральных схем), содержащих от нескольких тысяч до нескольких десятков тысяч элементов на кристалле. Для построения памяти стали применять МОП БИС емкостью 16К—64К бит. Появились однокристальные 8- и 16- разрядные микропроцессоры (ЦП), и с невероятной быстротой расширился рынок персональных компьютеров, выполненных на их основе. Цены на БИС памяти быстро падали, и это дало новый толчок к увеличению степени интеграции микросхем.
К типичным универсальным большим ЭВМ этого периода относятся модели 158, 168, IBM 370, следующая за ними серия 303 X, M-серия фирмы «Хитати», серия PC фирмы «Фудзицу» и т. д. Для увеличения скорости векторной обработки старшие модели этих серий были снабжены встроенным матричным процессором.
Что касается области мини-компьютеров, то здесь были разработаны высокопроизводительные машины типа «System 20» серии VAX 11 фирмы DEC, которые стали называться супермини-компьютерами. Благодаря им существенно сократился разрыв между большими универсальными и мини-компьютерами. В целях повышения производительности некоторых персональных компьютеров были созданы так называемые рабочие станции, назначение которых — предоставление каждому пользователю вычислительных ресурсов высокопроизводительного мини-компьютера. В рабочих станциях существенная доля вычислительной мощности процессора используется для реализации высокоуровневой диалоговой функции, в них также широко используются такие технические приемы, как полиэкранный режим, манипуляции с изображениями и «мышь».
В отличие от первых ОС, главным назначением которых было эффективное использование вычислительных ресурсов, появление персональных компьютеров и рабочих станций привело к созданию ОС, для которых главное — это сделать ЭВМ «дружественной» к пользователю. Примером такой ОС является Юникс (UNIX).
В больших универсальных машинах стали применять многосегментную виртуальную память, кроме того, виртуализация коснулась нс только памяти, но и самих машин, другими словами, стала возможной реализация программным путем вычислительной машины.
Что касается области суперкомпьютеров, то здесь были разработаны машины типа CRAY-1, которая и поныне определяет структуру суперкомпьютеров, CYBER-205 и др. В конце этого периода в Японии также появились суперкомпьютеры: VP-100, VP-200 фирмы «Фудзицу», 810/10, 810/20 фирмы «Хитати» и т. д. Интенсивно проводились разработки векторизаторов, способных компилировать программы, написанные на Фортране, в форму, удобную для векторной обработки, и максимально использовать возможности суперкомпьютеров.
4-Е ПОКОЛЕНИЕ ЭВМ (С 1985 г.
ПО НАСТОЯЩЕЕ ВРЕМЯ)
Дальнейшее развитие полупроводниковой технологии сделало возможным создание СБИС (сверхбольших интегральных схем), содержащих свыше 100тыс. элементов на кристалле. Появились нс только 16-, но и 32-разрядные однокристальные микропроцессоры (ЦП) , а также БИС статического ОЗУ (СОЗУ) емкостью 256К бит и динамического ОЗУ (ДОЗУ) емкостью 1М бит. Все эти элементы были выполнены на основе кремния, однако создавались и другие интегральные схемы на основе полупроводниковых химических соединений, обладающие более высоким быстродействием, которые нашли применение в высокоскоростных АЛУ и регистрах.
Прогресс в микропроцессорной технике привел к появлению 16-разрядных персональных компьютеров, а затем и 32-разрядных машин этого типа. Стоимость рабочих станций постоянно снижается, и постепенно ликвидируется разрыв между высокопроизводительными персональными компьютерами и недорогими рабочими станциями.
Благодаря удобству в применении ОС Юникс, которая первоначально предназначалась для персональных компьютеров и рабочих станций, начали применять и в больших универсальных ЭВМ, а также суперкомпьютерах.
Компьютерные сети объединили существовавшие до сих пор разрозненно вычислительные машины, сделали возможной передачу файлов и сообщений и привели к развитию технологии распределенной обработки. На базе специализированных процессоров, которыми оснащались ЭВМ, объединенные в сети, возникли различные службы управления файлами, печати, электронной почты и т. д. Распределенная обработка через посредство сетей от обычной горизонтальной обработки (между ЭВМ сравнимой производительности) в последнее время ориентируется на вертикальную обработку, при которой можно использовать машины различной производительности, например мини-компьютеры, рабочие станции,
персональные компьютеры и проч. Для того чтобы ее можно было распространить не только на соединение машин одной фирмы, но и машин различных типов, продолжается внедрение стандарта OSI (соединение открытых систем) как стандартного сетевого протокола.
В области универсальных больших ЭВМ идея виртуализации распространяется нс только на память, но и на терминальные и периферийные устройства, а также на сами машины, что привело к возникновению концепции виртуальных терминалов и виртуальных машин. Если для каждой программы задать свою виртуальную машину, т. с. сделать так, чтобы одна -реальная машина соответствовала нескольким виртуальным машинам, то появится возможность реализации параллельной обработки. При решении проблемы увеличения размера основной памяти в суперкомпьютере неизбежно возникает другая проблема, связанная с увеличением времени доступа к дисковой памяти. Поэтому путем частичной замены вторичной памяти на полупроводниковую осуществляют так называемое расширение памяти. Создание многопортовых регистровых файлов, используемых в векторных регистрах, ускорило разработку многопортовых элементов памяти и, по всей видимости, окажет большое влияние на архитектуру ЭВМ в ближайшем будущем.
1.4. ИСТОРИЯ И КЛАССИФИКАЦИЯ
ПАРАЛЛЕЛЬНЫХ ЭВМ НЕЙМАНОВСКОГО ТИПА
ДВА ВИДА ТРЕБОВАНИЙ К ВЫСОКОСКОРОСТНОЙ ОБРАБОТКЕ
Постоянное требование решения проблемы увеличения быстродействия привело к созданию техники параллельной обработки. Это требование фактически состоит из двух различных требований. Первое заключается в том, как за более короткий интервал времени решить отдельную задачу. Второе — как за один и тот же интервал времени решить как можно
больше задач. Если выполнить первое требование, то второе выполнится автоматически, однако это не означает, что, выполнив второе требование, можно автоматически выполнить и первое. Если объем работ, необходимый для решения задачи, разделить на время, необходимое для ее решения, то получим скорость обработки. Однако это определение нс подходит как мера измерения того, в какой степени удовлетворяется второе требование. Поэтому рассмотрим значение W/T — отношение суммарного объема работ, необходимого для решения множества задач в течение времени Т, к этому времени. Возьмем в качестве меры измерения предельное значение W/T, когда Т стремится к бесконечности. Этот показатель называется производительностью. Производительность— это расширение понятия скорости обработки, и се еще принято называть эффективной скоростью обработки.
В зависимости от того, что необходимо увеличивать, скорость обработки или производительность, определяются и особенности архитектуры, отвечающей этим требованиям. Желательно, конечно, иметь архитектуру, удовлетворяющую обоим требованиям. Скорость обработки и производительность можно увеличить, либо заменив элементы, из которых состоит ЭВМ, на более быстродействующие, либо использовав какой-либо технический прием. Повысить скорость обработки за счет использования новой элементной базы обычно более сложно, чем повысить производительность. Следовательно, даже в тех случаях, когда повышение скорости обработки обеспечивается только на данном уровне развития архитектуры,— а в будущем оно считается трудноосуществимым, — следует в дополнение к этому рассмотреть возможные пути повышения производительности.
В частности, в настоящее время имеет смысл увеличивать производительность больших ЭВМ, которые являются общим инструментом для многих пользователей. Правда, в тех случаях, когда нет необходимости одновременно выполняемые программы выполнять на одной и той же машине, производительность можно повысить путем выполнения этих программ на
отдельных машинах. Следовательно, для того чтобы был смысл повышать производительность в пределах одной системы, необходимо создать условия для того, чтобы можно было понизить стоимость за счет совместного использования аппаратных или программных ресурсов, обеспечить доступ из каждой программы к совместно используемой информации, например к библиотекам программ или к базе данных, и обеспечить передачу данных между программами.
ДВА СПОСОБА ПОВЫШЕНИЯ СКОРОСТИ ОБРАБОТКИ
Для повышения скорости обработки и производительности желательно мультиплексировать устройство обработки либо выполнять множество операций одновременно на разных устройствах обработки. Этот способ называется параллельной обработкой. Иногда под параллельной обработкой подразумевается согласованная (concurrent) обработка, однако в этом случае нс обязательно используется множество устройств обработки, — этот термин означает, что множество программ выполняется на одном и том же устройстве обработки, но в каждый момент времени выполняется только одна из них. Однако если увеличить интервал наблюдения, то будет казаться, что множество программ выполняются одновременно.
Для того чтобы параллельная обработка была эффективной, необходимо, чтобы число одновременно выполняемых единиц обработки было достаточно велико. В противном случае увеличивается время простоя устройства обработки, а следовательно, снижается эффективность параллельной обработки. Одновременно выполняемые единицы обработки могут быть большими и малыми: к большим обычно относятся программы, а к малым — основные команды. Размер единицы обработки называется гранулярностью параллельной обработки.
Для одновременного выполнения единиц обработки существуют два способа (рис. 1.8). Первый заключается в том, что «каждый делает всю работу». Второй — в том, что «каждый делает определенный вид работы». Другими словами, в первом случае
каждое устройство обработки выполняет последовательно всю обработку от начала до конца. Прежде
Рис. 1.8. Два способа параллельной обработки. а — многоэлементная обработка; б — многостадийная обработка.
такой способ назывался узкопараллельной обработкой, но в этой книге он называется многоэлементной обработкой. Во втором случае все устройства обработки располагаются в ряд так, что Z-e устройство
выполняет Z-ю стадию обработки. Таким образом, множество объектов обработки запускаются с первого устройства, последовательно проходят через все устройства, т. с. через все стадии обработки. Такой способ параллельной обработки называется конвейерной обработкой (или конвейеризацией). Принцип конвейеризации операции как один из видов этой обработки уже был рассмотрен в разд. 1.3. В данной- книге конвейерная обработка называется еще многостадийной обработкой по аналогии с указанной выше многоэлементной обработкой.
При многостадийной обработке одновременно выполняемые объекты нс обязательно должны быть одного типа, но в таких случаях звенья конвейера проектируются таким образом, чтобы нс было сбоев в его работе.
КЛАССИФИКАЦИЯ ПАРАЛЛЕЛЬНЫХ МАШИН НЕЙМАНОВСКОГО ТИПА
Общепринятой классификацией параллельных машин неймановского типа является классификация, предложенная Флинном [14]. Он предложил классифицировать быстродействующие компьютеры по числу потоков команд и данных:
одиночный поток команд, одиночный поток данных (ОКОД);
одиночный поток команд, множественный поток данных (ОКМД); *
множественный поток команд, одиночный поток данных (МКОД);
множественный поток команд, множественный поток данных (МКМД).
(Среди перечисленных типов ОКОД-машины соответствуют обычному неймановскому компьютеру.)
Тем не менее классификация по Флинну является слишком примитивной и нс даст достаточно полного представления об отличительных чертах современных параллельных компьютеров неймановского типа.
Предпринимались попытки классифицировать по- другому параллельные компьютеры, и в данной книге
Исторический обзор архитектур ЭВМ и их классификация 43 описывается новый способ классификации, отличный от известных способов. Как уже говорилось, параллельную обработку можно выполнять двумя способами: многоэлементной обработкой и многостадийной обработкой — и в то же время использовать одновременно оба этих способа. Объекты одновременной обработки для каждого из этих способов можно, в свою очередь, разделить на три больших класса:
программы;
команды;
операции.
Первый класс помимо отдельных программ включает также процессы, состоящие из одной программы. Второй класс в отличие от третьего включает также операции считывания операндов из памяти и записи их в память. С точки зрения гранулярности для каждого способа — многоэлементной и многостадийной обработки — неймановские параллельные машины можно классифицировать следующим образом (см. табл. 1.2).
Таблица 1.2. Классификация параллельных машин неймановского типа
Гранулярность параллельной обработки
*Название класса
МногоэлементнаяМногостадийная
обработкаобработка
Программа
Команда Операция
Нет/команда/операция Многопроцессорная си-
Нет/операция Нет
стема
Матричный процессор
Процессор со многими
АЛУ'
Нет
Команда
Процессор с конвейеризацией команд
Нет/операция
Операция
Процессор с конвейеризацией операций
Если определена единица обработки, то можно определить и типы устройств обработки, работающих параллельно. Например, если гранулярностью многоэлементной обработки является программа, то каждое устройство обработки должно иметь по
крайней мере ЦП. Память и устройства ввода-вывода могут быть общими, но лучше, если каждое из устройств обработки будет иметь свои память и УВВ, которые называются соответственно локальной памятью и локальным УВВ. В локальной памяти, как и в общей, хранятся программы и данные.
Если гранулярностью является команда, то, поскольку последовательное управление выполнением программы осуществляется вне каждого устройства обработки, в качестве его следует использовать ЦП, лишенный функции последовательного управления. Такое устройство обработки называется процессорным элементом (ПЭ). ПЭ выполняет операции считывания и записи операндов в память, а также выполняет операции над операндами, хранящимися в памяти. Эти функции у АЛУ отсутствуют. ПЭ может быть дополнен локальной памятью, однако она не предназначена для хранения программ. Для управления УВВ необходима соответствующая программа, поэтому в данном случае локальное УВВ нс применяется.
Если гранулярностью многоэлсмснтной обработки является операция, то считывание/запись операндов выполняются вне устройства обработки, поэтому в качестве такого устройства можно использовать АЛУ либо РАЛУ (регистровое, т. с. дополненное регистрами, АЛУ).
МНОГОПРОЦЕССОРНАЯ СИСТЕМА
Многопроцессорные системы, как показано на рис. 1.9, классифицируются на системы с общей памятью и системы с коммутацией сообщений. Первый тип систем называют еще системами с сильной связью, а вторые — со слабой связью. Каждый процессор в многопроцессорной системе второго типа имеет особую память и особый канальный процессор. Структура с распределением функций между различными системами называется полипроцессорной. Каждый ЦП в многопроцессорной системе может выполнять многостадийную обработку, либо это может не предусматриваться.
В системах с общей памятью одно (единое) пространство памяти совместно используется всеми процессорами. Фактически общая память организуется с помощью сети связи, как это показано на рис. 1.10.
ПроцессорыПроцессорыОбщая памятьОбщая памятьЛокальная памятьЛокальная память
Процессоры
Процессоры
Общая память
Общая память
Локальная память
Локальная память
аб
Рис. 1.9. Структуры многопроцессорных систем.а — с общей памятью; б — с коммутацией сообщений.
Общее пространство памяти разбивается на множество ЗУ, которые соединяются с процессорами при
помощи сети связи. В разд. 6.4 подробно рассмотрены архитектуры общей памяти, использующей разные сети связи. Число процессоров, которое можно использовать для реализации многопроцессорной системы с общей памятью, ограничивается конфликтами при доступе к общей памяти, каждый процессор снабжают кэш-памятью либо локальной памятью.
В системах с коммутацией сообщений связь между процессорами осуществляется в форме передачи
сообщений через посредство портов ввода-вывода и процессорную сеть связи. В таких системах часто используется пакетный режим передачи. По сравнению с системами с общей памятью данным системам свойственен большой перерасход времени при передаче данных, поэтому их невыгодно использовать в тех случаях, когда сложные структуры данных обрабатываются совместно несколькими ЦП, однако, если частота передач и объем передаваемых данных небольшие, такую систему можно использовать даже при большом числе процессоров.
Для взаимосвязи между процессорами помимо многоуровневой сети связи, описанной в разд. 6.4, можно использовать полную сеть в виде полного графа, в узлах которого находятся процессоры, радиальную сеть, в центре которой находится один процессор, соединенный с остальными, сеть в виде решетки, тора, кольца, цепи, бинарного дерева, бинарную n-кубическую сеть, процессоры которой расположены в вершинах гиперкуба, сеть в виде гиперкуба, в вершинах которого расположены кольцевые сети, и т. д. (рис. 1.11).
Примерами систем с коммутацией сообщений являются Ст* [15] университета Карнеги — Меллона, так называемый «Космический куб» (Cosmic Cube) Калифорнийского университета, серия FPS-Т фирмы Floating Point и другие. В системе Ст* путем соединения процессоров по общей шине образованы кластеры, которые, в свою очередь, также соединены с помощью межкластерной шины. В системе Cosmic Cube используется сеть связи в виде двоичного шестимерного куба, которая связывает 64 процессора. Каждый процессорный элемент этой сети состоит из двух процессоров фирмы Intel: 8086 и 8087. В серии FPS-Т при максимальной конфигурации используются 16 384 процессорных элемента, соединенных с помощью двоичной 14-мерной кубической сети. Каждый процессорный элемент этой сети состоит из управляющего процессора и двух арифметических процессоров. В качестве управляющего процессора используется транспьютер фирмы «Ин- мос» [18].
Рис. 1.11. Типы сетей связи (только одноуровневые сети связи), а — с общей шиной; б — полная сеть; в — радиальная сеть; г — сеть в виде решетки; д — матричная сеть; е — линейная сеть; ж — кольцевая сеть; з — сеть в виде двоичного дерева; и — двоичная n-кубическая сеть; к — гиперкуб.
К многопроцессорным машинам с общей памятью помимо С. mmp [19] университета Карнеги — Меллона и S-1 Ливерморской лаборатории им. Лоуренса относятся еще несколько коммерческих машин. В системе С. mmp 16 машин PDP-11 и 16 банков памяти соединены при помощи матричного коммутатора. В системе S-1 16 процессоров MARK II А соединены через матричный коммутатор с 16 банками памяти. В сфере коммерческих машин различные фирмы-изготовители выпускают системы, содержащие 2—4 процессора для большой универсальной ЭВМ типа IBM 370 К 168 МР, 3081, 3084 и т. д. Известна также система на базе суперкомпьютера CRAY Х-МР, целью которой является безостановочная (non-stop) обработка (например, Tandem/16 [21]). В последние годы появились также коммерческие машины типа НЕР [22] фирмы Deneclor, содержащие 16 процессоров, взаимосвязанных с помощью сети с пакетной коммутацией и соединенных с таким же числом банков памяти; эта система способна осуществлять гибкую обработку типа ОКМД и конвейерную обработку типа МКМД.
О системах с общей памятью подробно изложено в разд. 6.4.
МАТРИЧНЫЙ ПРОЦЕССОР
Матричные процессоры разделяются на матричные ОКМД-процессоры и ассоциативные матричные процессоры. Последний тип указывает на архитектуру, в которой ассоциативный поиск в памяти осуществляется матричным процессором. Архитектура ассоциативной памяти подробно рассмотрена в разд. 6.5.
Матричные ОКМД-процессоры имеют структуры, показанные на рис. 1.12, а, б. Структуру, показанную на рис. 1.12, а, имеет машина ИЛЛИАК-1 [23—25], а показанную на рис. 1.12,6 — машины типа BSP [26—28]. В структурах обоих типов имеется множество процессорных элементов (ПЭ) и одно устройство управления (УУ). УУ передает всем ПЭ одновременно одну и ту же команду. Поэтому все ПЭ параллельно выполняют одни и тс же операции.
Управление.УправлениеУправление.Управлениеб
Управление.Управление
Управление.Управление
Рис. 1.12. Структуры матричного ОКМД-процессора.
4—11454—1145а — типа ILLI AG IV; 6 — типа BSP.
4—1145
4—1145
Поток команд в такой системе одиночный, и управление им производится при помощи УУ. Управление осуществляется следующим образом: если необходим переход по условию, соответствующему результату проверки каждого ПЭ, то сначала определенная операция выполняется в ПЭ, результат проверки которого был истинным, а затем другая операция выполняется в ПЭ, результат проверки которого оказался ложным. Такое управление можно осуществить, снабдив каждый ПЭ регистром состояний и используя способ выйблнения/останова команды в каждом ПЭ по значению этого регистра либо, в случае если команда генерируется УУ, используя способ одновременной посылки вместе с командой карты битов маски, показывающей, в каком ПЭ выполняется команда. Во многих ОКМД-машинах в УУ собирается по одному специальному биту регистра состояния от каждого ПЭ, где они анализируются.
При доступе к памяти из каждого ПЭ эта операция также указывается командой, передаваемой из УУ. В команде указывается только один адрес, но каждый ПЭ содержит индексный регистр, поэтому адрес, передаваемый из УУ, модифицируется в соответствующем индексном регистре, благодаря чему каждый ПЭ осуществляет доступ по своему адресу.
Связь между ПЭ осуществляется синхронно через сеть связи. Сети связи, как уже было описано в разделе, посвященном многопроцессорным системам, бывают одноуровневыми и многоуровневыми. По типу соединения сети связи подразделяются на сети с управляемой связью и фиксированной связью. В сетях с управляемой связью распределенное управление отсутствует, а УУ осуществляет централизованное управление, поэтому в таких сетях используется коммутатор каналов, а коммутатор пакетов — нет.
Во многих матричных ОКМД-процессорах каждый ПЭ обрабатывает одно слово данных, однако в последних моделях ПЭ способен вести побитовую обработку, поэтому предпринимаются попытки построения ОКМД-процессоров, содержащих от нескольких тысяч до нескольких сотен тысяч ПЭ на кристалле
(причем на одном кристалле БИС монтируется до нескольких десятков ПЭ). Эти процессоры называются разрядно-модульными матричными ОКМД-процес- сорами.
Устройство управления (УУ) Буфер данных Регистры
Рис. 1.13. Структура машины ILLI AC IV.
ЛБД — локальный буфер данных; АккР — аккумулятор и регистры; А — аккумулятор (64 бит); В — регистр операнда (64 бита); R— регистр маршрутизации данных (для пересылки данных между ПЭ) (64 бит); S — регистр общей памяти (64 бит); X — индексный регистр (16 бит); D — регистр режима (8 бит для хранения маски ПЭ).
Для рассмотрения примеров матричных ОКМД- процессоров обратимся к известным в прошлом проектам Unger [29] (1958 г.) и Solomon [30, 31], предложенному Слотником в 1962 г. Разработанная во второй половине 60-х гг. система ИЛЛИАК IV была 4*
преемником проекта Solomon, и в 1972 г. началась ее эксплуатация,
Система ИЛЛИАК IV была спроектирована в Ил- линойсском университете, а разработана в фирме Burroughs. Как показано на рис. 1.13, она имеет одно УУ и 64 ПЭ, причем каждый ПЭ содержит локальную память емкостью 2К слов. ПЭ этой системы соединены сетью связи, как это показано на
Рис. 1.14. Сеть связи между ПЭ в машине ILLI AC IV.
рис. 1.14. Программы хранятся в памяти каждого ПЭ, и УУ считывает программу по одной команде по шине УУ. Эти команды выполняются УУ, причем по типу они классифицируются на команды управления процессом выполнения программы и операционные команды, которые посылаются одновременно на все ПЭ и выполняются в каждом из них.
Поставив перед собой цель создать более высокопроизводительную систему, чем ИЛЛИАК IV, используя в то же время ее как базовый вариант, фирма Burroughs начала разработку системы BSP (Burroughs Scientific Processor — процессор для научных расчетов фирмы Burroughs) [26—28]. Однако, к сожалению, работы над ней были приостановлены в 1979 г. Структура BSP показана на рис. 1.12,6: 16 ПЭ соединены с 17 банками общей памяти через коммутирующую сеть. УУ дополнительно снабжено управляющей памятью, в которой хранятся программы. Коман-
ды, считанные при помощи УУ, преобразуются в 128битовые микрокоманды и одновременно посылаются на все ПЭ.
Отличительной особенностью системы BSP является то, что число банков памяти в ней равно 17, т. с. оно превосходит число ПЭ, равное 16, всего лишь на единицу. Такая система называется системой первичной памяти [28]. Благодаря такой структуре можно одновременно считывать данные с горизонтальных, вертикальных и диагональных элементов матрицы данных. На рис. 1.15 показан способ хранения элементов матрицы, делающий возможным подобный доступ для случая, когда число ПЭ равно 6, а число элементов матрицы — 7.
В лаборатории Ватсона фирмы IBM проводилась разработка матричного ОКМД-процессора, который сегодня известен под названием CF-11 [32]. CF-11 — это специализированная машина, разрабатываемая с целью выполнения со скоростью 11,5 GFLOPS сверхбольших расчетов для проверки гипотез в квантовой механике, на которые потребуется больше года. Она состоит из одного УУ и 576 ПЭ, взаимосвязанных по сети «Мемфис» (Memphis), которая рассмотрена в разд. 6.4. Каждый ПЭ представляет собой 32-разряд- ный процессор, который состоит из четырех операционных блоков с плавающей запятой, одного операционного блока с фиксированной запятой, регистрового файла объемом 256 слов, динамического ОЗУ объемом 256К байт и статического ОЗУ объемом 64К байт. ПЭ управляются одновременно при помощи команды длиной 180 бит, передаваемой из УУ.
В Японии в 1984 г. была разработана машина РАХ-128 (Университет г. Цукуба) [33, 34]. РАХ-128 содержит 128 процессоров, соединенных в виде матричной сети. Цель этой разработки — моделирование трехмерных непрерывных систем.
Примером разрядно-модульного матричного ОКМД-процессора является знаменитый МРР (Massively Parallel Processor — глобальный параллельный процессор), разработанный фирмой Goodyear по заказу NASA для обработки изображений, передаваемых из космоса [35—37]. МРР — это специализиро-
ванный процессор для обработки изображений, кото- рый состоит из УУ и 16384 ПЭ, соединенных в виде матрицы размерностью 128X 128. Каждый ПЭ в такой матрице связан только с четырьмя соседними
Xi 012 013 °14 OlS1<121 °22 0 2 3 ®24 °25<131 <132 а33* d34 а35\а41 а42 а 43 о44 а^/ аXi 012 013 °14 OlS1<121 °22 0 2 3 ®24 °25<131 <132 а33* d34 а35\а41 а42 а 43 о44 а^/ аСостояние сети связиСостояние сети связипоказываетпоказывает• Первая строка• Первая строкаО Первый столбецО Первый столбец△ Диагональный элемент△ Диагональный элементпараллельный доступ к первой строке бпараллельный доступ к первой строке б
Xi 012 013 °14 OlS1
<121 °22 0 2 3 ®24 °25
<131 <132 а33* d34 а35
\а41 а42 а 43 о44 а^/ а
Xi 012 013 °14 OlS1
<121 °22 0 2 3 ®24 °25
<131 <132 а33* d34 а35
\а41 а42 а 43 о44 а^/ а
Состояние сети связи
Состояние сети связи
показывает
показывает
• Первая строка
• Первая строка
О Первый столбец
О Первый столбец
△ Диагональный элемент
△ Диагональный элемент
параллельный доступ к первой строке б
параллельный доступ к первой строке б
Рис. 1.15. Способ хранения матрицы в первичной памяти,а — матрица размерностью 4X5; б — хранение матрицы (а)и параллельный доступ.
ПЭ. Ввод данных в матрицу ПЭ осуществляется для 128 крайних левых ПЭ, как показано на рис. 1.16, и последовательным продвижением вправо данные вводятся во все остальные ПЭ. На каждом кристалле смонтировано 8 ПЭ.
Помимо этой модели к разрядно-модульным матричным ОКМД-процессорам относятся CLIP-4 [38] Лондонского университета и DAP [39] фирмы ICL. В CLIP-4 ПЭ расположены в виде матрицы размерностью 96X96, и одновременно можно обрабатывать данные ПЭ 4- или 6-угольной решетки. На каждом
Рис. 1.16. Структура процессора МРР и ввод-вывод данных.
кристалле смонтировано 8 ПЭ. В лаборатории связи г. Ацуги (фирма NTT, Япония) был разработан кристалл, содержащий 64 одноразрядных ПЭ, на базе которого построен процессор ААР, состоящий из 256X256 ПЭ [40]. Каждый ПЭ может устанавливать связь с восемью соседними ПЭ.
ПРОЦЕССОРЫ С МНОГИМИ АЛУ
Процессоры этого типа содержат, как показано на рис. 1.17, множество параллельно соединенных АЛУ, а также многопортовый регистровый файл, совместно используемый этими АЛУ, либо регистровый файл, состоящий из множества банков, соединенных с помощью сети. Каждое АЛУ может автономно выполнять операции с двумя данными из регистрового файла и возвращать результат операции в регистровый файл. Для одновременного управления п АЛУ используются длинные микрокоманды, состоящие из п полей.
Поскольку обеспечить эффективную работу одновременно всех АЛУ весьма проблематично, такие процессоры используются для специальных видов обработки, например обработки сигналов, изображений, графической информации и т. д. В зависимости от вида обработки оптимизируются и микропрограммы в целях эффективного использования АЛУ.
Управляющий сигнал
Рис. 1.17. Структура процессора с многими АЛУ.
Процессор АМР, разработанный в 1973 г. в Арагонской национальной лаборатории (США) [41], содержит два АЛУ и предназначен для обработки в реальном времени графической информации и т. п. В Университете г. Киото (Япония) в 1976 г. был разработан процессор QA-1, а в 1983 г. — QA-2 [42, 43]. Оба процессора имели в своем составе по 4 АЛУ и предназначались для обработки сигналов или изображений. Длина команды в каждом составляла соответственно 160 и 256 бит. Процессор МС, разработанный в 1985 г. в радиотехнической лабора-
тории фирмы «Мацусита дэнки», содержал 5 АЛУ и предназначался для обработки графической информации. Длина команды для этого процессора составляет 96 бит [44].
ПРОЦЕССОРЫ С КОНВЕЙЕРИЗАЦИЕЙ КОМАНД
Выполнение команды осуществляется последовательно путем повтора операций выборки команды (IF), декодирования команды (D), преобразования адреса операнда (ОА), выборки операнда (OF), выполнения операции (ЕХ), сохранения результата (S)
Wa^^^г ма^^Манда 3
LTF[j)jO^OFl£y^
| IF j D IpaJOFI ЕХ| S I Машинная команда 1
| IF I D IoaIofIEXI S I Машинная команда 2
| IF | D |OA|OF|EX| S | Машинная команда 3
Рис. 1.18. Принцип конвейеризации команд.
а — последовательное выполнение команд; б — конвейерное выполнениекоманд.
(рис. 1.18, а). В первых ЭВМ управление осуществлялось таким образом, что выборка новой команды была возможна только по окончании прохождения всех перечисленных стадий выполнения текущей команды. Если организовать непрерывное выполнение команд, как это показано на рис. 1.18,6, то для одной команды потребуется время, затрачиваемое на прохождение одной стадии. Такой способ выполнения команд называется конвейеризацией команд [45].
Для реализации конвейера команд необходимо иметь независимые аппаратные средства для каждой
стадии обработки, чтобы можно было одновременно выполнять команды на разных стадиях. Конвейер команд работает наиболее эффективно, когда времена, требуемые для прохождения каждой стадии, равны, однако если есть некоторый разброс по вре-
УстройствоУстройство
управления командами Команды управления памятью
Операционное устройствоОсновная память
Рис. 1.19. Структура универсальной большой ЭВМ.
мени, то его можно устранить, установив в нужных местах буферы. На рис. 1.19 показана структура большой универсальной ЭВМ с конвейеризацией команд. Связь между функциональными блоками в данном случае осуществляется с использованием буферов.
Работа конвейера команд может быть нарушена ио многим причинам [46]. К наиболее важным относятся:
необходимость использования результата операции, выполненной в некоторой команде, в следующей команде;
определение адреса операнда в некоторой команде с помощью предыдущей команды;
изменение последовательности выполнения команд в результате проверки условия в команде условного перехода;
необходимость блочной пересылки из основной памяти в кэш-память (в системе с кэш-памятью, описанной в разд. 6.2), если в последней отсутствует команда или адрес операнда;
наложение стадий выборки команды, выборки операнда, сохранения результата, т. с. возникновение конфликтов при доступе к памяти;
возникновение прерываний, переключение процессов;
выполнение слишком длинной команды, для которой нс хватает времени обычной стадии выполнения
и т. п.
Причины (1), (2), (4), (5) можно в какой-то степени устранить, если пересылать некоторые данные отдельно от основного потока кратчайшим путем к местам, где они требуются, либо если установить буферы, разделить память и регистровый файл по назначению. Причину (7) можно устранить путем мультиплексирования АЛУ или его конвейеризации.
Если обнаруживается команда условного перехода, то адрес следующей команды определяется по результату се выполнения. В тех случаях, когда условие нс задано, порядок следования команд остается прежним, и поскольку следующая команда уже введена в конвейер, его работа не нарушается. Проблемы возникают в том случае, когда имеется некоторое условие. В таких случаях следующая по порядку команда, введенная в конвейер, является недействительной, поэтому конвейер необходимо перезапустить со стадии выборки команды.
Для решения этой проблемы предложены способы с использованием буфера цикла, множественного
потока команд, таблицы с предысторией переходов [47, 48].
Система с буфером цикла была использована в машине CDC 6600. Суть се в следующем. В машине имеется буфер команд большого размера, способный хранить весь программный цикл. Благодаря этому в тех случаях, когда условие задано, доступ осуществляется только к буферу цикла, а к основной памяти — нет.
Система с множественным потоком команд была использована в машине IBM 370/168. По этому способу машина оснащается двумя буферами команд: основным и вспомогательным. Основной буфер используется для выполнения стадий выборки команды, декодирования, преобразования адреса операнда, выборки операнда, когда условие нс задано, а вспомогательный буфер используется для параллельного выполнения аналогичной обработки последовательности команд, когда условие задано.
В машинах IBM 3033, IBM 3090 используются два и более вспомогательных буфера, и если обнаруживается другая команда условного перехода, то для последовательности команд, предусмотренных в этом условии, осуществляется прсдвыборка аналогичным путем с использованием другого буфера.
Система с таблицей предыстории переходов основана на использовании ассоциативной памяти, в которой в ходе выполнения программы запоминаются наиболее часто используемые переходы, встречающиеся в командах условного перехода. Таким образом, если снова обнаруживается некоторая команда условного перехода, то выполняется быстрый доступ к ассоциативной памяти, делается предположение о том, что начало перехода в данном случае является наиболее часто используемым началом перехода в данной команде, и осуществляется прсдвыборка команды.
Конвейеризация команд, которая первоначально использовалась только в больших универсальных ЭВМ, теперь широко используется и в универсальных микропроцессорах.
АРИФМЕТИЧЕСКИЙ КОНВЕЙЕРНЫЙ ПРОЦЕССОР
Процессоры этого типа имеют конвейерную организацию операционного блока, т. е. следующая операция начинает выполняться в нем до окончания предыдущей операции [49, 50]. Иначе говоря, операционный блок разбивается на несколько частей. На рис. 1.20 показана схема конвейерного сумматора с плавающей запятой.
В арифметическом конвейерном процессоре может также использоваться и конвейер команд. Часто такие процессоры имеют специализированные операционные блоки, рассчитанные на выполнение определенных операций. Добавим, что в современных суперкомпьютерах иногда используют множество одинаковых операционных блоков. Арифметические конвейерные процессоры предназначены для высокоскоростных вычислений, и можно привести множество примеров их использования в суперкомпьютерах [51]. В частности, процессоры, которые используются для матричных и векторных вычислений, называются также векторными процессорами.
В программах, используемых для векторной обработки, встречаются фрагменты, требующие последовательных действий, например при управлении потоком команд, вычислении скалярных констант. Эти фрагменты называют еще скалярными фрагментами. Векторные машины можно разделить на два больших класса в зависимости от того, обладает ли она возможностями скалярных вычислений или нет. Машины, способные выполнять скалярную обработку, называют суперкомпьютерами, а неспособные — присоединенными векторными процессорами. Изготовители вычислительной техники часто называют их матричными процессорами, однако в данной книге это название нс применяется, для того чтобы нс путать их с описанными выше матричными процессорами, в которых ПЭ расположены в виде матрицы.
Присоединенные векторные процессоры соединяют с помощью каналов ввода-вывода и каналов ПДП (прямого доступа к памяти) с ЭВМ типа мини-компьютера и используют в составе большой универсаль-
А = а х 2РА = а х 2РВ = b х 2qВ = b х 2q
А = а х 2Р
А = а х 2Р
В = b х 2q
В = b х 2q
Рис. 1.20. Конвейерный сумматор с плавающей запятой.
ной ЭВМ для выполнения векторных вычислений. Примером такого применения являются машина АР-120В фирмы Floating Point [52] (содержащая один сумматор и один умножитель для выполнения операций с плавающей запятой) и более усовершенствованные модели FPS-164 [17] (дополненная блоком для операций над целыми числами, например вычисления адреса), 3838 фирмы IBM [53] (четыре сумматора с плавающей запятой, один умножитель с плавающей запятой, один операционный блок для вычисления обратных чисел, один операционный блок для вычисления функций sin/cos), МАТР [54] фирмы Datawest (четыре конвейерных процессора) и т. д.
Примером встроенного векторного процессора является IAP (интегральный матричный процессор, используемый в машинах ACOS 1500, М-680Н, IBM 3090 и т. д.) [55].
СУПЕРКОМПЬЮТЕРЫ
Суперкомпьютер [56—59] состоит из трех главных элементов: блока векторной обработки, блока скалярной обработки и основной памяти. Блок векторной обработки имеет в своем составе АЛУ и регистровый файл. АЛУ обычно содержит несколько типов арифметических блоков с плавающей запятой и логический блок (блок для выполнения логических операций), причем каждый из этих компонентов АЛУ может быть мультиплексирован. Каждый операционный блок АЛУ имеет конвейерную организацию. Регистровый файл используется для сохранения текущих результатов вычислений для применения их в последующих операциях; из него одновременно извлекаются данные для операционных блоков, работающих параллельно, и одновременно помещаются результаты операций. Регистр, размер которого позволяет хранить от нескольких до нескольких сотен векторов, состоящих из нескольких десятков слов, называется векторным регистром.
Начальные формы подобной структуры проглядываются в первых суперкомпьютерах типа STAR 100
[60] фирмы CDC и ASC [61] фирмы TI, однако полностью сформировалась она только в машине CRAY-1 фирмы Cray Research [62]. Архитектуры появившихся следом машин Cyber 205, S-810 («Хитати»), серии VP («Фудзицу»), NEC SX-2 базируются целиком на архитектуре CRAY-1. В последние годы проводятся исследования по объединению двух — четырех таких суперкомпьютеров в систему с общей памятью (сильной связью) в целях еще большего увеличения производительности. Примером тому является система CRAY Х-МР [63].
На рис. 1.21 показана структура машины VP-200 фирмы «Фудзицу» [64]. Узел векторной обработки состоит из трех конвейерных операционных блоков: сложения/логических операций, умножения и деления, два из которых могут работать параллельно. Основная память и векторный регистр соединены при помощи двух конвейеров загрузки и хранения. Эти конвейеры работают параллельно с конвейерами операций.
Конвейер сложения/логических операций и конвейер умножения имеют производительность 267 Мфлопс, а конвейер деления — 38 Мфлопс. Поскольку два конвейера могут работать параллельно, то максимальная суммарная производительность составляет 534 Мфлопс. Каждый из конвейеров за- грузки/хранения имеет скорость передачи в обоих направлениях 267 Мслов/с, т. е. в сумме 534 Мслов/с, поэтому при работе с максимальной производительностью скорость выполнения операций и скорость подачи данных из основной памяти совпадают. Для реализации такой скорости передачи данных основная память расслоена на 256 каналов. О расслоении памяти подробно рассказано в разд. 6.2.
Векторный регистр состоит из 256 страниц по 36 слов в каждой. Для того чтобы векторные операции можно было выполнять только для нескольких выбранных элементов, а не для всех сразу, регистр имеет функцию маскирования векторной операции. Кроме того, он имеет функцию формирования коротких векторов путем последовательного сбора только тех элементов заданного вектора, которые выби-
Блок векторной обработки
Рис. 1.21. Структура ЭВМ. VP-200 фирмы «Фудзицу».
раются при помощи заданной маски, а также функцию выполнения обратной операции. В функции его входит также косвенная адресация вектора для обработки типа A(I) = B(IND(I)), где А, В — векторы, IND — вектор положительных целых чисел.
Для обеспечения параллельного функционирования множества арифметических конвейеров, как, например, в машине VP-200, часто используют функцию,
5—1145
называемую настройкой. Например, когда с помощью пяти векторных регистров выполняются вычисления V3^Vi*V2, Vs^-Vs + V^ и если сделать так, чтобы следующую команду можно было выполнять, нс ожидая окончания первоначальной команды, т. с. с момента получения первого элемента вектора V3(l) результата операции V3, и сначала вычислить VsU)-^ ^~V3(1) +V4(l), то соединив конвейер умножения с конвейером сложения, можно создать один конвейер и тем самым повысить производительность. Функция, которая позволяет сделать это, называется функцией автоматической настройки.
ПЕРЕСМОТР ПРИНЦИПОВ НЕЙМАНОВСКОЙ АРХИТЕКТУРЫ И ОЖИВЛЕНИЕ В СФЕРЕ НЕНЕЙМАНОВСКИХ АРХИТЕКТУР
ПРОБЛЕМЫ, С КОТОРЫМИ СТОЛКНУЛАСЬ НЕЙМАНОВСКАЯ АРХИТЕКТУРА
Все архитектуры, рассмотренные выше, можно объединить одним названием «неймановская архитектура». К ее особенностям относятся:
хранимая программа: программы вместе с данными хранятся в памяти;
линейная память: линейное пространство адресов, которым присваиваются порядковые номера 0, 1,2,...;
последовательное выполнение программы: каждая программа выполняется последова- ► тельно, начиная с самой первой команды, если нет специальных указаний. Для изменения этой последовательности с помощью команды перехода указывается адрес начала перехода;
отсутствие различий между данными и командами;
отсутствие различий в семантике данных.
В 70-х гг. начался активный пересмотр принципов неймановской архитектуры, причинами которого были:
понимание неизбежности кризиса программного обеспечения;
расширение приложений, требующих высокой надежности;
сложность задач и сложность обеспечения параллелизма при их обработке;
проблема с пересылками «процессор — основная память»;
развитие СБИС-технологии.'
Среди этих причин первые две были связаны с ростом потребностей пользователей ЭВМ, (3) — осознанием проблем в сфере программного обеспечения, (4) — осознанием проблем в сфере архитектуры ЭВМ и (5)—стимулировалась развитием элементной базы. Все эти причины возникли почти одновременно, что привело к многочисленным предложениям архитектур, в которых какой-либо из перечисленных принципов неймановской архитектуры был улучшен с точки зрения какой-либо из данных причин. Поскольку это были уже архитектуры других типов, то их объединили названием «ненеймановские архитектуры».
СЕМАНТИЧЕСКИЙ РАЗРЫВ И ТЕГОВЫЕ МАШИНЫ
В стоимости компьютерной системы доля программных средств год от года увеличивается, что обусловлено резким повышением расходов на содержание персонала, многообразием приложений, расширением функциональных возможностей систем и т. д. Многообразие приложений и расширение функциональных возможностей систем делают более заметной тенденцию к выпуску сложных программных изделий малыми партиями с широким ассортиментом. Число программистов, требуемое для разработки программного обеспечения, увеличивается с каждым годом, и если эта тенденция сохранится, то в XXI в. оно превысит численность населения Японии. В то же время благодаря прогрессу в СБИС-технологии стоимость аппаратных средств постоянно снижается. Следовательно, в будущем необходима такая архитектура, которая за счет некоторого увеличения 5*
числа аппаратных средств (несмотря на увеличение при этом стоимости аппаратуры) позволит упростить программы, а следовательно, и снизить затраты на разработку программного обеспечения.
Одним из факторов, усложняющих разработку программного обеспечения, является наличие большого различия между понятиями операций и их объектов на языке программирования высокого уровня и понятиями операций и их объектов, определяемыми архитектурой компьютера. Это отличие носит название семантического разрыва [65]. Иначе говоря, если на языке высокого уровня можно описать различные операции и типы данныхг то в неймановской архитектуре разницы между программами и данными нет, как нет и разницы между типами данных. Это обстоятельство тяжелым бременем ложится на плечи программиста при составлении программы. И впоследствии оно является причиной усложнения отладки программы. Из-за отсутствия различий в типах данных и между программами и данными нельзя обнаружить, была ли ошибка связана с выполнением команды или с обращением к данным. Нельзя также обнаружить, выполняются ли данные в качестве команды или что к команде осуществляется обращение, как к данным.
Для решения этой проблемы Илифф предложил с помощью некоторого алгоритма добавлять ко всем данным информацию, необходимую для того, чтобы идентифицировать их как данные, использовать вместо линейного адресного пространства памяти структурированное пространство и добавлять к каждому элементу памяти информацию, показывающую атрибут этого элемента [66]. Эта дополнительная информация получила название «тег» Ч Машины, основанные на этом принципе, называют теговыми машинами [67]. Так, различные типы данных характеризуются своими тегами, а однотипные команды, отличающиеся только типами операндов, никак нс различаются. Например, программисту нет необходимости разли-
!> Тег (tag) в переводе с английского означает «признак».—
Прим, перев.•
чать команды ADD (сложения) с плавающей и фиксированной запятой: машина это сделает автоматически, проверив типы операндов. В случае обращения с массивами данных добавляется такая теговая информация, как длина, ширина массива, индексы, а выход за пределы массива "автоматически контролируется машиной при обращении к данным.
Машина Илиффа получила название Бейсик-машины [66]. Аналогичные идеи проглядываются и в архитектуре машин фирмы Burroughs. Эти машины относятся к классу стековых, хотя они используют теги, называемые дескрипторами, для поддержки структурированной памяти [68]. Майерс предложил проект SWARD-м'ашины, в которой эти идеи были развиты.
В SWARD-машине данные представлены структурным элементом, называемым ячейкой. На рис. 1.22 приведены различные типы ячеек. Каждая ячейка состоит из поля тега и поля данных. Численные значения представлены в двоично-десятичном коде, и один разряд десятичного числа представлен четырьмя двоичными разрядами (битами). Память разбита на 4-разрядные единицы, которые называются признаками. Разрядность данных, указанных в поле тега, выражается числом признаков. Положительный знак числа выражается кодом 0000, отрицательный — 0001. Если используются массивы данных, то в поле тега указываются размерность массива, тип ячейки элемента массива, длина каждого измерения. Если элементом массива является целое число, то к типу ячейки после 1111 добавляется информация о длине числа. В SWARD-машине теговая информация используется не только применительно к данным, но и применительно к программным модулям. Структурный элемент, в котором хранится программный модуль, называется «модулем».
Для того чтобы еще больше сократить семантический разрыв, было предложено проектировать машины таким образом, чтобы они были пригодны для прямого выполнения программ, написанных на специальном языке высокого уровня или на промежуточном языке. Такие машины получили название
моментаЦелое числоДробное числомоментаЦелое числоДробное число«машин языков высокого уровня» [13, 69]. Если прежде подобные машины разрабатывались в расчете на применение таких высокоуровневых языков, как Кобол, Фортран, АПЛ, Алгол, то особенностью текущего является разработка машин, и в частности
момента
Целое число
Дробное число
момента
Целое число
Дробное число
| 1111 | Длина | Знак |Значение
| 1110 | ДлинаЗнак I Знание '.
запятой)1111——4
СимволI 1011 I Код символа I
Массив
[^__01JlJ^H^Длина одномерного массива|
|Длина n-мерного массива|
vJОдномерное значение ^*[
1 V111
1
ЧастьДвумерное значение.|
данных’ L " " 11 ■1 "V-'— " —■ -*
С]n-мерное значение|
Рис. 1.22. Представление данных в машине SWARD.
^Х™™0^! ООП |^
рабочих станций, для применения языков искусствен-
ного
интеллекта типа Лиспа и Пролога. Лисп- и
Пролог-машины имеют большой семантический разрыв с традиционными неймановскими машинами. Архитектуры машин языков искусственного интеллекта типа Лиспа и Пролога подробно рассмотрены в гл. 7, здесь же отмстим лишь, что помимо большого пространства виртуальной памяти они имеют большое пространство реальной памяти, стековый механизм и другие особенности, которые свойственны теговым машинам.
ОТКАЗОУСТОЙЧИВОСТЬ И МАНДАТ
Расширение приложений, требующих высокой надежности, ускорило развитие высоконадежных архитектур [70]. Высокая надежность характеризуется тремя факторами: (1) правильностью результатов обработки, (2) нс требующим останова обработки техническим обслуживанием и (3) гарантией защиты программ и данных от несанкционированного доступа. Для обеспечения правильности результатов обработки необходимо помимо повышения надежности используемых элементов вводить в архитектуру дополнительно различные диагностические средства, чтобы можно было обнаружить неисправность. Один из способов — использование двух или трех процессоров.
Для повышения эксплуатационных характеристик необходимо либо увеличить среднее время между отказами (MTBF), либо сократить среднее время для восстановления (MTTR). Для увеличения MTBF используют способ мультиплексирования устройств, при котором отказавшее устройство заменяется на резервное; способ мажорирования, при котором одну и ту же обработку выполняют несколько одинаковых устройств; способ амортизации отказов, который заключается в том, что в случае отказа одного из нескольких однотипных устройств, выполняющих разную обработку, это устройство отключается, остальные устройства перестраиваются (система реструктурируется), и обработка продолжается, несмотря на некоторую потерю в производительности. Машины, спроектированные с увеличенным временем MTBF, получили название «безостановочные машины» (nonstop). Широко известна серия NON-STOP-компью- теров фирмы TANDEM, выпущенная в 1976 г. впервые в мире [71].
Для сокращения времени MTTR необходимы методы, позволяющие быстро выполнять следующую последовательность действий: локализация неисправности, ее устранение, реконфигурация системы. Совокупность методов, с помощью которых увеличивается время MTBF и сокращается время MTTR, называется
техникой обеспечения отказоустойчивости, а компьютеры, эксплуатационные характеристики которых повышены благодаря использованию этой техники, называются отказоустойчивыми компьютерами.
Еще один фактор надежности машин касается обеспечения защиты программ и данных от посторонних, которая может быть достигнута двумя путями: (1) добавлением атрибутов, обеспечивающих защиту нужного объекта, и (2) введением правил, касающихся доступа к объекту и операций над ним.
Первый способ называется объектно-ориентированной защитой [72], а второй — защитой, основанной на использовании мандата [73]. Мандат показывает право доступа, т. с. указывает путь доступа к объекту и разрешенные над ним операции. Информация, которую имеет сторона, осуществляющая доступ в отношении различных объектов, называется списком мандатов. Поскольку право на доступ к каждому объекту передается обязательно с адресом этого объекта, то, нс имея права на доступ, невозможно определить и место хранения объекта. Такой способ адресации называется адресацией, основанной на использовании мандата, или мандатной адресацией. Принципы мандатной адресации были предложены в 1966 г. Деннисом и Ван Хорном.
При мандатной адресации память рассматривается как множество объектов, которым присвоены имена. Программа может осуществлять доступ к каждому объекту, используя его имя, причем место хранения этого объекта она может и нс знать. Мандат содержит специфичное имя объекта и информацию, касающуюся права на доступ к нему. Когда программа генерирует некоторый объект, то машина автоматически присваивает ему специфичное имя и выдает программе мандат на доступ к этому объекту. Программа делает копию мандата и может передать ее другой программе, однако генерация и изменение мандатов осуществляются только в ядре системы, а программа делать этого не может. Когда осуществляется доступ к объекту на основании мандата, то сначала исследуется право доступа к этому объекту: если доступ разрешен, то местоположение
объекта в памяти определяется начиная с его имени.
К типичным машинам с мандатной адресацией относятся IBM System 38 [75] и iAPX 432 фирмы Intel [76, 77].
ВЫСОКОПАРАЛЛЕЛЬНАЯ ОБРАБОТКА И ФУНКЦИОНАЛЬНЫЕ ЯЗЫКИ
По мере продвижения исследований в области параллельной обработки помимо явно выраженной параллельности задач и обрабатывающих алгоритмов получила довольно широкое распространение неявно выраженная параллельность, поэтому стало очевидным, что для повышения производительности за счет параллельной обработки необходимо нс только обращать внимание на первый тип (явно выраженную форму), но и эффективно использовать и второй тип. В параллельных машинах с неймановской архитектурой можно реализовать первый тип параллельности — это соответствует векторной обработке; однако второй тип, скрывающийся за скалярной обработкой, реализовать невозможно. Повышение скорости скалярной обработки и теперь остается серьезной задачей суперкомпьютеров с неймановской архитектурой.
Причиной, затрудняющей извлечение параллельности, содержащейся в алгоритмах обработки, и реализацию параллельной обработки на неймановском компьютере, является необходимость описания обработки на процедурном языке. Особенности процедурных языков: (1) в описании операции располагаются в некотором порядке, и последовательность выполнения операций в основном совпадает с последовательностью их описания, (2) выполнение обработки определяется как последовательное изменение состояния машины путем перезаписи памяти. Вторая особенность означает нс только, что по входным данным генерируются выходные данные, но также и просто изменение состояния машины. Это явление носит название побочного эффекта (side effect). Для описания на процедурном языке параллельной обработки
нужно четко описать, как из одномерного описания образуется многомерное описание. "
Помимо процедурных языков для описания алгоритмов обработки можно использовать функциональные языки типа Лиспа. Строго говоря, функциональный язык нс имеет побочного эффекта. Программа на таком языке представляется некоторой функцией Д а выполнение программы определяется как результат действия этой функции (ее оценка) f(x) по отношению к входу х. В определении функции f можно использовать другую функцию или саму эту функцию. Например, если f = Хх g(h(x), k(x)), то f(x) = = g^h^x), k(x)). Если эту оценку можно получить из оценки внешней величины g, то се можно получить, разумеется, из оценок внутренних величин h^ и к^, а значит, h^ и к^х) можно оценить одновременно. В строгом функциональном языке гарантируется одинаковость результатов оценки, полученных при использовании любой из этих различных последовательностей оценки. Это свойство указывает на возможность описания параллельной обработки. Иначе говоря, это указывает на то, что посредством описания алгоритма на функциональном языке можно использовать неявно выраженную параллельность для реализации параллельной обработки.
Неймановская архитектура в том виде, в котором она существует, нс годится для параллельной обработки на функциональном языке [78]. Поэтому в 70-х гг. начались интенсивные исследования архитектур, удовлетворяющих этому назначению. Результатом их было появление потоковых и редукционных машин. Об этих машинах подробно изложено в гл. 4 и 5 соответственно.
УЗКИЕ МЕСТА ФОН-НЕЙМАНОВСКОЙ АРХИТЕКТУРЫ
В неймановских машинах программы и данные нс разделяются и хранятся в одной и той же памяти; основу их действия составляют последовательная обработка на процедурном языке и выполнение вычислений с побочным эффектом — перезаписью памяти. Поэтому для выполнения одной операционной коман-
ды необходимы по меньшей мере два доступа к памяти: для считывания команды и для считывания операнда. Если для указания операнда используется косвенная адресация, то с каждым разом число доступов к памяти увеличивается на 1. Поскольку вычисления выполняются с побочным эффектом, то результат операции нужно каждый раз записывать в память. Следовательно, в неймановских машинах пересылки данных между ЦП и памятью выполняются довольно часто. В то же время эти пересылки выполняются поочередно, и так как ширина канала, по которому пересылаются данные, мала, то здесь и образуется «узкое место». Его еще называют «узким местом фон-неймановской архитектуры» [78].
Для решения этой проблемы были предложены три главных способа. Первый, и наиболее простой, заключался в том, чтобы расширить канал передачи данных между ЦП и памятью. Второй — в том, чтобы отказаться от обработки с побочным эффектом, и, наконец, третий — в том, что данные, считанные однажды из памяти, должны пройти как можно больше этапов обработки, прежде чем они снова попадут в память.
Первый способ можно реализовать путем увеличения быстродействия памяти и использования многопортовой памяти. Он описан в гл. 6. Второй способ можно реализовать с помощью архитектуры, основанной на использовании функционального языка. Функциональный язык нс имеет побочного эффекта, а также нс связан последовательным считыванием и выполнением команд. Этот способ подробно изложен в гл. 3—5.
Третий способ можно рассмотреть на примере систолической матрицы, предложенной Кунгом в 1978 г. [79, 80]. В неймановских машинах данные, считанные из памяти, обрабатываются один раз в АЛУ, после чего снова возвращаются в память (рис. 1.23,67). Иначе говоря, каждый раз при обработке в АЛУ данные необходимо извлечь из памяти и возвратить в память. Кунг предложил устранить узкое место неймановской архитектуры, сделав таким образом, чтобы данные на пути от их считывания из
памяти до возвращения в память пропускались через как можно большее число АЛУ (рис. 1.23,6). Если сравнить память с помпой, перекачивающей данные, то применительно к живому организму ей можно отвести роль сердца, множеству АЛУ — роль тканей,
Сердце
б
Рис. 1.23. Принцип действия систолической матрицы.
а — машина неймановского типа; б — принцип действия систолической матрицы.
а поток данных рассматривать как циркулирующую кровь. Отсюда и происходит название «систолическая матрица» (от лат. systol — пульсация). Последовательную обработку данных множеством АЛУ нельзя представить в другой форме. Систолические матрицы эффективны для выполнения микроопераций, например матричных вычислений, обработки сигналов, сортировки и т. д. Используемые при этом АЛУ образуют специальную схему для выполнения однотипной
обработки, и их расположение является регулярным. По этой причине систолические матрицы, имеющие архитектуру, подходящую для реализации на СБИС, было предложено специализировать на выполнение различных микроопераций. Подробное описание систолических матриц дано в разд. 2.2.
ВЛИЯНИЕ РАЗВИТИЯ ТЕХНОЛОГИИ СБИС
Во второй половине 70-х гг. и в начале 80-х гг. в США произошло формирование среды Опытного производства заказных СБИС, что сделало возможным их применение и разработчиками вычислительной ' техники, работающими в университетах [81]. В подобной ситуации зародилось несколько новых направлений и в исследованиях архитектур ЭВМ. Результатом одного из них явилось создание специализированных СБИС систолических матриц, упомянутых выше. Нс меньшего внимания заслуживают компьютеры с RISC-архитектурой (RISC — reduced instruction set computer — компьютер с сокращенным набором команд), память с интеллектуальными ячейками и т. д. К сожалению, в Японии подобные идеи до сих пор нс нашли должного распространения.
RISC-компьютеры имеют архитектуру с универсальным процессором, работающим с высокой скоростью [82]. По мере расцвета эпохи неймановских машин увеличивалось многообразие команд, они становились более сложными. Вычислительная машина, снабженная набором сложных команд, называется CISC-компьютером (CISC — complex instruction set compiler— компьютер с полным набором команд) [83, 84].
Наличие полного набора команд в CISC-компьютере позволяет удовлетворить разнообразным требованиям пользователей. Однако составление программы, в которой непосредственно используются эти команды, является задачей системного программиста, и большинство программистов пишут программы на языке высокого уровня, которые затем компилируются машиной. Для быстрого выполнения программы,
написанной на языке высокого уровня, не нужны сложные командные слова — гораздо более важно сократить время выполнения наиболее часто используемых команд. Этот принцип был положен в основу RISC- архитектуры, которая представляет собой улучшенный вариант неймановской архитектуры. Благодаря сокращению набора команд упрощаются аппаратные схемы, а значит, обеспечивается оптимизация выполнения часто используемых команд. Кроме того, за счет применения большого числа регистров уменьшается частота (число) доступов к памяти, что также позволяет повысить скорость выполнения команды. Типичные представители этих машин: компьютер RISC [85] Калифорнийского университета в Беркли, IBM 801 [86], MIPS [87] Станфордского университета, pt3L [88] Университета шт. Юта, RIDGE 32 [89] фирмы Midge, Pyramid 90Х [90] фирмы Pyramid и др. RISC-архитектуру имеет и транспьютер фирмы «Инмос»— 32-разрядный процессор, спроектированный с оптимальным набором команд, позволяющим использовать язык высокого уровня Оккам. Используя комбинации из транспьютеров в качестве стандартных блоков (building block), можно строить цифровые системы [91].
Память с интеллектуальными ячейками — это память, ячейками которой являются одноразрядные процессоры, т. с. каждая ячейка наделена интеллектуальными способностями. Такую память можно разбить на два класса: универсальная память с интеллектуальными ячейками (разрядно-модульный матричный ОКМД-процессор), используемая в машине DAP [92] фирмы ICL, и память с семантической структурой, используемая в машине Connection Machine (Машина соединений) фирмы Thinking Machine [93]. Первый тип памяти можно рассматривать как разновидность обычного матричного процессора, но в будущем по мере увеличения числа ячеек ее можно принять за новое направление в развитии архитектур памяти.
Память второго типа используется для хранения семантической сети — одного из средств представления знаний в искусственном интеллекте; это память,
в которой осуществляется ассоциативный поиск по семантической сети. Подробное описание этой памяти приведено в разд. 6.5.
АРХИТЕКТУРЫ ДЛЯ ОБРАБОТКИ ЗНАНИЙ
В 1982 г. Министерство внешней торговли и промышленности Японии учредило Комитет по разработке компьютеров новых поколений (ICOT), который разработал национальный проект, нацеленный на создание в течение 10 лет ЭВМ пятого поколения.
Современные компьютеры можно назвать компьютерами «3,7-го» поколения или даже четвертого поколения. Особенностью четвертого поколения является использование СБИС-элементов, однако с точки зрения архитектуры трудно пока систематизировать особенности этих ЭВМ. В качестве новых идей, характеризующих особенности архитектуры, можно привести виртуализацию, которая охватила нс только память, но и аппаратные средства и даже всю машину, распределенную обработку, сетевую архитектуру и т. п.
С первого по четвертое поколение ЭВМ прогресс был связан только с развитием элементной базы. Что же касается перехода от четвертого к пятому поколению, то здесь внимание акцентируется нс столько на элементной базе, сколько на переходе от архитектуры, ориентированной на обработку данных, к архитектуре, ориентированной на обработку знаний. Обработка знаний — это одна из сфер практического применения искусственного интеллекта, предполагающая использование компьютером знаний, которыми владеет человек, для решения проблем и принятия решений. '
В современных ЭВМ для того, чтобы выполнить некоторую обработку, программист должен написать алгоритм обработки в виде программы, которую нужно ввести в компьютер. Если попытаться этим методом разработать систему обработки знаний, осуществляющую медицинскую диагностику либо диагностику неисправностей в автомобиле, то можно столкнуться со следующими проблемами.
Слияние знаний с механизмом логического вывода.
Знания об объекте и механизм логического вывода, использующий эти знания, нс отличаются друг от друга и представляются в виде цельной процедуры, таким образом, они растворяются в программе.
Сложность обновления знаний.
Пополнение, уничтожение или изменение знаний, касающихся объекта, означает изменение программы, и трудно точно определить, до какой части программы распространяется это влияние.
Эти проблемы можно в некоторой степени разрешить, если разработать систему с модульным представлением знаний, с языком программирования, имеющим функцию получения выводов на основании этих знаний, и т. п.; однако семантический разрыв между языком и архитектурой становится при этом больше, чем при обработке данных. Поэтому и возникла необходимость разработки архитектуры, отвечающей требованиям обработки знаний. Общим названием таких архитектур является «архитектура ЭВМ пятого поколения».
Фурукава и др., являющиеся руководителями этого проекта, поставили целью решить две проблемы— увеличения семантического разрыва при обработке знаний и сложности реализации высокоуровневой параллельной архитектуры, основанной на архитектуре фон-Неймана, — и осуществить обработку знаний с помощью сверхпараллельной архитектуры. Они выдвинули гипотезу, основанную на парадигмах логического программирования, которая позволяет одновременно решить обе проблемы. Логические языки, как будет показано в гл. 3, обладают параллельностью, которая называется ИЛИ-параллель- ностью и И-параллельностью. Фурукава и др. избрали в качестве логического языка Пролог и на нем описывали знания об объекте и механизм логических выводов.
Проект ЭВМ пятого поколения состоит из трех этапов: начального (1982—1984), промежуточного
(1885—1988) и заключительного (1989—1991). Если излагать только то, что имеет отношение к архитектуре, то нужно отмстить, что на начальном этапе были разработаны Пролог-машина PSI с последовательной обработкой и машина Delta с реляционной базой данных. PSI — это теговая машина с микропрограммным управлением, содержащая стек. Delta — это машина базы данных, имеющая специальный механизм для поточной обработки бинарных операций. Обе эти модели имели ярко выраженный характер средств разработки, однако оригинальностью нс отличались.
На промежуточном этапе было запланировано разработать параллельную машину логического вывода и параллельную машину базы знаний, а на заключительном — разработать объединенную машину, в которой эти машины соединялись с помощью подсистемы. Первоначально исследования сверхпараллельной обработки на основе потоковой архитектуры были успешными, однако оставалось множество нерешенных проблем, поэтому в настоящее время планируется изучение реализации параллельной машины вывода на основе множества машин PSI, использующих параллельный кэш. В составе такой системы предполагается использовать от нескольких десятков до сотни PSI. Что касается машины базы знаний, то здесь изучается возможность применения многопортовой памяти со страничной организацией, предложенной Танакой. Изучается возможность применения в этой машине архитектуры, состоящей из множества соединенных механизмов для быстрой обработки унификации— базовой операции языка Пролог. Механизм унификации — это, как правило, линейный сортировщик совокупности последовательностей символов переменной длины, причем изучается возможность видоизменения пирамидального сортировщика последовательностей символов переменной длины, предложенного Танакой, в битональный сортировщик слиянием (см. разд. 2.3).
Если критически взглянуть на проект, то можно заметить попытку отхода от первоначальных задач,
касающихся параллельной обработки, и вместе с тем заметить, что целевая система отходит от систем, основанных на знаниях, в сторону высокопроизводительных систем обработки сигналов, основанных на использовании языка Пролог. Однако думается, что таким путем будет сложно ликвидировать семантический разрыв в обработке знаний, что было по сути главной целью.
Глава 2ВЫСОКОСКОРОСТНАЯ ОБРАБОТКАИ АРХИТЕКТУРА СБИС
В разд. 1.4 предыдущей главы были рассмотрены два вида параллельной обработки, предназначенные для повышения скорости обработки. В ней обсуждалась параллельная обработка гранулярностей (единиц обработки), больших по размеру, чем операции. В настоящей главе будет рассмотрена высокоскоростная обработка самих операций.
Операции, которые в процессе некоторой обработки (1) используются наиболее часто и (2) занимают сравнительно большое время обработки, называются «примитивными операциями». К примитивным операциям принято относить четыре арифметических действия, которые используются в обычных числовых расчетах, вычисление скалярного произведения, используемое в матричных расчетах, операцию сортировки при работе с базами данных и т. д. Среди перечисленных операций скалярное произведение и сортировка разлагаются обычно в ЭВМ на более мелкие операции, поэтому они называются примитивными макрооперациями.
Прогресс в технологии СБИС, который наблюдается в последние годы, сделал возможным проектирование и использование специализированных аппаратных средств, выполняющих с высокой скоростью примитивные операции и макрооперации. В данной главе рассмотрены алгоритмы операций, используемые в этих аппаратных средствах, и структуры этих средств.
ПОВЫШЕНИЕ СКОРОСТИ ВЫПОЛНЕНИЯ
ЧЕТЫРЕХ АРИФМЕТИЧЕСКИХ ДЕЙСТВИЙ
ПОВЫШЕНИЕ СКОРОСТИ ВЫПОЛНЕНИЯ ОПЕРАЦИИ СЛОЖЕНИЯ
Базовой операцией в четырех арифметических действиях, выполняемых в цифровой машине, является сложение. Вычитание сводится к сложению с
использованием дополнительного кода числа. Умножение выполняется путем сложения нескольких чисел, полученных последовательным сдвигом множимого. При делении используются операции сдвига и вычитания, а также операция умножения. Для выполнения с высокой скоростью этих операций необходимо ускорить выполнение операций сложения. При сло- жении/вычитании необходимо принимать в расчет ускорение выполнения операции сложения двух чи-
C + S(-A+B+D)C + S(-A+B+D)+ + О 1 + ++ + О 1 + +^ + + + й; 1 о о^ + + + й; 1 о оA + B+D =C+S=10001010A + B+D =C+S=10001010Рис. 2.1. Сумматор с сохранением переноса (СА).Рис. 2.1. Сумматор с сохранением переноса (СА).Л =
C + S
(-A+B+D)
C + S
(-A+B+D)
+ + О 1 + +
+ + О 1 + +
^ + + + й; 1 о о
^ + + + й; 1 о о
A + B+D =C+S=10001010
A + B+D =C+S=10001010
Рис. 2.1. Сумматор с сохранением переноса (СА).
Рис. 2.1. Сумматор с сохранением переноса (СА).
В =
+)+)Сложение в каждом л — разряде и
+)
+)
сел, в то время как при умножении/делении необходимо учитывать ускорение сложения более чем трех чисел. В соответствии с этими требованиями используются два типа сумматоров: с распространением переноса (CPA —carry propagation adder) и с сохранением переноса (CSA — carry save adder). В сумматор с распространением переноса вводят два числа, а на выходе получают их сумму и переполнение в самом старшем разряде. В отличие от этого в сумматор с сохранением переноса вводятся, например, три числа, А, В, D, (см. рис. 2.1) и для каждого разряда вычисляются сумма соответствующих разрядов трех чисел S и перенос С. Поскольку S является суммой в каждом разряде, то она отличается от полной суммы трех чисел. Правильное значение суммы чисел А + В + D равно S + С причем эту сумму
(S + С) получают с помощью сумматора типа СРА. В сумматоре типа* CSA отсутствует необходимость распространения переноса, как в СРА, т. с. операции в нем выполняются с более высокой скоростью, чем в СРА. Поэтому при сложении более чем трех чисел
Рис. 2.2. CSA-дерево.
а — 6-входная схема сложения, выполненная только на СРА-сумматорах (время задержки = ЗГ(2рд):б — 6-входная схема сложения с помощью
CSA-дерева(время задержки=37'csa+ ^СРА)ф ^СРА- время задерж
ки в сумматоре СРА, ^CSA— время задержки в сумматоре CSA.
скорость вычислений можно увеличить за счет использования сумматоров типа CSA и лишь на самой последней стадии использования сумматоров типа СРА. На рис. 2.2 приведено сравнение случаев с использованием только CPA-сумматоров и с использованием CSA- и CPA-сумматора для 6-входовой схемы. Многоступенчатое соединение сумматоров CSA, показанное на рис. 2.2,6, называется CSA-деревом. CSA-дерево с поразрядной организацией называется деревом Уоллеса [3].
Увеличение быстродействия CPA-сумматора достигается путем сокращения длины распространения переноса. Для этого существуют способ обнаружения
окончания переноса, способ сложения суммы условий, способ выбора переноса, способ предсказания переноса, и др., которые изложены в специальной литературе [1].
ПОВЫШЕНИЕ СКОРОСТИ ВЫПОЛНЕНИЯ ОПЕРАЦИИ УМНОЖЕНИЯ
Используя CSA-дерево, можно построить конвейерный умножитель, как показано на рис. 2.3. Л — множимое, В — множитель, который представляет собой двоичное число b^b^b^b^b^by длиной 6 бит. Wi— это число, которое при bi = 0 равно 0, а при bi = 1 равно Л, сдвинутому влево на (/—1) разрядов. Каждое значение IF, можно получить путем задержки А, В в одном каскаде вентиля. Установив фиксаторы до и после CSA-сумматоров и CPA-сумматоров каждого блока формирования Wi, можно разбить схему на каскады и реализовать конвейерную обработку.
Если число разрядов множителя велико, то, как показано на рис. 2.4, он разбивается на 4-разрядные секции, которые суммируются с помощью CSA-дерева с четырьмя разрядами сдвигаемого множимого. Результат сложения — частичная сумма и перенос снова поступают на вход CSA-дерева, затем таким же образом обрабатываются следующие 4 бита множителя, т. с. для множителя любой длины можно организовать конвейерную обработку. Схема с такой структурой называется итеративным CSA-depe- вом [2].
Технология БИС сделала возможным применение модуля скоростного умножения, структура которого показана на рис. 2.5. Он представляет собой разновидность сумматора с массивом повторяющихся ячеек, который называется модулем умножения без сложения (NMM — Nonadditive Multiply Module). FA — это полный сумматор. Каждая строка в матрице FA, исключая самую нижнюю, состоит только из CSA-сумматоров. В самой нижней строке используются СРА-сумматоры.
Модуль NMM имеет ограничение на число разрядов вводимых чисел, однако, комбинируя такие мо-
дули, можно построить умножитель двух входных чисел, которые имеют достаточно большое число раз-
Р = А х В
Рис. 2.3. Конвейерный умножитель на основе CSA-дерева.
рядов [3]. На рис. 2.6 показан пример построения умножителя 8X8 разрядов на основе четырех модулей типа 4X4. Множимое Л разбивается на 4 старших
XZZZZZZZZZZZZZZZZZZZZZZ^ZZZ^ Фиксатор
Р-АхВ
Рис. 2.4. Конвейерный умножитель со сдвигом^ выполненный наоснове CSA-дерева.
разряда и 4 младших разряда (Л£). Множитель В таким же образом разбивается на части Вн и BL. Четыре модуля NMM вычисляют соответственно про-
МножимоеМножимоеаз«2«1«о
Множимое
Множимое
X) 63ЪгЬхbo
«эбо агАо а\Ьо «око аД Огб) 016) Ооб] 03 62 02 63 0162 Ooba
Р7 Ро Р* Р. Рг Рг Pt РйР7 Ро Р* Р. Рг Рг Pt Рй4") азЬз а^Ьз О]6з аоЬз
Р7 Ро Р* Р. Рг Рг Pt Рй
Р7 Ро Р* Р. Рг Рг Pt Рй
изведения АНХВН, AHXBU ALXBH. ALXBL. На выходах модулей получаются 8-разрядные результаты, которые соответствуют частичным произведениям в разрядах 215 — 28, 211— 24, снова 211 — 24, 27 — 2°. Результат получается путем суммирования этих четырех чисел, причем для каждого из разрядов 215—2°
Вн
2» 2м 2й 2“ 211 2ю 2е 2е 27 2е 2е 2*23 21 21 2°
\/
16-разрядный выход (произведение)
Рис. 2.6. Умножитель типа 8X8, выполненный на базе четырех модулей NMM. типа 4 X 4 и дерева Уоллеса.
используется дерево Уоллеса. С помощью этого метода можно для любого целого числа п построить умножитель типа 4пХ4п.
ПОВЫШЕНИЕ СКОРОСТИ ВЫПОЛНЕНИЯ ОПЕРАЦИИ ДЕЛЕНИЯ
Остановимся на одном из способов с использованием умножения. Этот способ, получивший название «деление методом последовательного умножения»,
применялся во многих моделях системы IBM 360/370, в машине CDC 6660/7600 [4]. Рассмотрим случай, когда для двух чисел N и D определяется частное от деления Q = N/D. Предположим, что после нормализации каждого числа выполняется неравенство 0,5 ^N <£)<!. Определим величину б как 6 = = 1—D. Тогда справедливо соотношение 0 < 6 < < 0,5. Определим величину Ri как
R{ = \ +62*-1, /=1, 2, к.
Тогда
л — N — ^ X R\X R^X ---XRr _ D — DXR1XR2X ...XRk "
=_jo<!L±J!LL±^Jld^^
(1 — д)(1 + б)(1 + б2) ...(ц-д2*1-1)
= (Ц-б2»)-1ХЛ^Х(1+6)(1+д2)(1+б2*-1).
При довольно больших значениях £(1—62fe) — 1, поэтому достаточно вычислить только произведение Q = NXRxXRtX ...XRk-
Помимо этого метода ускорения операции деления существует множество других методов, все они описаны в соответствующей литературе [1].
ПОВЫШЕНИЕ СКОРОСТИ ВЫПОЛНЕНИЯ
МАКРООПЕРАЦИЙ
СИСТОЛИЧЕСКИЕ МАТРИЦЫ
Кунг из университета Карнеги — Меллона выдвинул идею систолической матрицы [5, 6] как метода решения проблемы узкого места в неймановской архитектуре (см. разд. 1.5). В основу этого метода был положен принцип размещения как можно большего числа операционных устройств на пути прохождения данных: от считывания их из памяти до возвращения обратно в память. Подобная обработка потока данных, последовательно проходящего через множество операционных устройств, необходима, когда выполняются макрооперации.
К настоящему времени выпущено уже множество разнообразных систолических матриц, ориентированных на выполнение таких макроопераций, как матричные вычисления, обработка сигналов, поиск, сортировка и т. д., причем некоторые из них уже применяются на практике [7]. Операционные устройства, используемые для выполнения макроопераций, представляют собой специализированные схемы, предназначенные для однотипной обработки, которые имеют регулярное расположение — одномерное (линейное) или двухмерное (плоское). Систолические матрицы удобно реализовать на СБИС.
ПЕРЕМНОЖЕНИЕ МАТРИЦ И ВЕКТОРОВ
Для того чтобы пояснить основную идею систолической матрицы, обратимся к рис. 2.7, где показана такая матрица, используемая для перемножения матрицы специального вида (см. рис. 2.7, а) с вектором.
Цикл используемой операционной схемы (см. рис. 2.7, б) определяется двумя тактовыми импульсами. По первому тактовому импульсу слева поступает входной сигнал X, справа — У, а сверху — А и вычисляется выражение У-^-А*Х. Следующим тактовым импульсом результат этой операции выводится влево и одновременно вправо выводится значение X.
Как показано на рис. 2.7, а, эти схемы расположены в один ряд и слева по одному в каждом цикле вводятся значения х в последовательности хь х2, • • •, сверху в каждом цикле вводится по одной строке элементов матрицы в том порядке, в котором они показаны на рисунке, а справа, также в каждом цикле, вводится значение 0.
Принцип ДействияПринцип Действия
Принцип Действия
Принцип Действия
(1) Г^у;х*-х:л*-а
Y*-Y-VA*X
Шаги
(У1=О)
yi^-yi + airxi (Vi^an-xi)
/ У1—аи-х\ + аи-х2 'Jfe = 021**1/
/ Ih^r^r х^агг*Х2\
\Уз = о31-ж1)
Рис. 2.7. Систолическая матрица, вычисляющая произведениематрицы и вектора.
Работа систолической матрицы в первые пять циклов показана на рис. 2.7, в. Работа систолической матрицы напоминает работу сердца, где пульсу соответствует тактовый ■ импульс, с помощью которого поток данных продвигается последовательно вперед. Результирующий вектор получается в виде выходного потока данных: на вход поступает поток данных, первоначальное значение всех элементов которого равно 0; этот поток преобразовывается по мере прохождения через систолическую матрицу, и на выходе получается конечный результат.
Особенность систолической матрицы, как видно из приведенного примера, заключается в том, что она представляет собой матрицу однотипных операционных схем, все обрабатываемые данные представлены в виде потоков, тактовым импульсом эти потоки продвигаются на один шаг вперед и результат операции также представлен в виде потока данных, выходящего из матрицы.
2.2.3. ПЕРЕМНОЖЕНИЕ МАТРИЦ
На рис. 2.8 показан пример более сложной систо-
Каждый элемент этой матрицы имеет три входа ain, bin, cin и три выхода aou/, 6ОМ/, cout и производит вычисления aout = ain, bout = bin, cout = cin + ain *bin. Как показано на рисунке, на каждый вход систолической матрицы с помощью тактовых импульсов вводятся элементы перемножаемых матриц. В качестве
Сц всегда вводится 0. Таким образом, сверху выводятся элементы результирующей матрицы.
БЫСТРОЕ ПРЕОБРАЗОВАНИЕ ФУРЬЕ
Быстрое преобразование Фурье (БПФ) также реализуется параллельной обработкой с использованием макроопераций. Для этого предложены способ многоэлементной обработки, в котором используется матричный ОКМД-процессор или соединение в виде сети процессоров с перераспределением обмена, а также различные способы конвейерной обработки (многостадийной).
Рис. 2.10. Систолическая матрица для 8-точечного БПФ.
8-точечное БПФ, как известно, вычисляется по диаграмме, показанной на рис. 2.9. На этой диаграмме участки, напоминающие по форме крылья бабочки, обозначают операции, называемые butterfly («бабочка»). На рис. 2.10 показана систолическая матрица, с помощью которой реализуются эти операции [8].
2.3. УСКОРЕНИЕ ПОИСКА И СОРТИРОВКА
Системные программы для ЭВМ и ее внутренний механизм выполняют операции табличного поиска и сортировки. В различных прикладных областях, например в системах баз данных, системах составления таблиц, а также графических системах, широко используются эти операции. Для быстрого выполнения их было предложено множество специальных аппаратных средств [9—11].
УСКОРЕНИЕ ОПЕРАЦИИ ПОИСКА
К аппаратным средствам, предназначенным для быстрого поиска в таблице, относится ассоциативная память. Ассоциативная память подробно описана в разд. 6.5, здесь отмстим лишь, что она позволяет с высокой скоростью выполнять табличный поиск путем обнаружения заданных ключей, при этом существует возможность обновления таблицы. Однако по сравнению с обычным ЗУ с произвольной выборкой ячейки ассоциативной памяти значительно сложнее, поэтому в настоящее время она используется там, где требуется сравнительно небольшая емкость.
Предположим, что таблица упорядочена по значениям ключей. В таких случаях можно использовать метод двоичного поиска. Предположим далее, что обновление таблицы нс производится. Кроме того, будем рассматривать случай пакетной обработки поиска со многими ключами поиска в одной и той же таблице (а не случай поиска только с одним ключом). Такая обработка называется групповым поиском. Групповой поиск можно реализовать с высокой скоростью, используя для этого конвейеризацию.
I i 45
На рис. 2.11 показана структура механизма поиска, предложенного Танакой из Университета Хоккайдо [9, 12]. Каждый уровень механизма поиска состоит из схемы сравнения и памяти, причем память z-ro уровня имеет емкость 2*-1 слов. В памяти хранится
Рис. 2.11. Структура механизма поиска.
таблица. Предположим, что содержимое таблицы упорядочено по значениям ключей, как это показано на рис. 2.12, а. Ключ z-ro адреса таблицы (Ki^ располагается в памяти каждого уровня способом, представленным на рис. 2.11. Таким образом, в ходе обработки возможно переключение банков памяти по отношению к последовательно вводимым значениям Ко, Кь К^ ... . Таблицы, хранимые в механизме поиска, логически представлены в виде двоичного дерева (см. рис. 2.12). Такое двоичное дерево называется двоичным деревом с заполнением слева. Поскольку данные помещаются в таблицу, начиная с самого
левого узла (0) в порядке (1), (2), ..., то правые нижние узлы данного маршрута остаются пустыми, поэтому проверяется наличие данных только в самом нижнем левом узле.
ТаблицаТ
Адрес
0123456789 10
Данные
3 4 7 11 15 20 22 24 27 28 30
а
.б
Рис. 2.12. Табличный поиск с помощью механизма поиска. ■а — таблица; б — процесс поиска.
Значения узлов этого дерева для Z-ro уровня последовательно помещаются в память этого уровня, причем крайний левый узел соответствует нулевому адресу. Рассмотрим в качестве примера последовательность поиска значения 28. Сначала в схеме сравнения первого уровня сравниваются значения 24 и 28. Поскольку значение 28 больше, поиск осуще- 7*
ствляется вправо вниз. Для аппаратных средств пг ремещение влево вниз означает «0», а перемещение вправо вниз — «1». Значит, в данном случае в качестве адреса для второго уровня передается «1». В схеме сравнения второго уровня используется переданный адрес «1» и из его памяти считывается содержимое этого адреса. Однако поскольку данные по этому адресу отсутствуют, то поиск продолжается влево вниз. В схеме второго уровня значение «0», показывающее поиск влево-вниз, приписывается справа к «1», представляющей текущий адрес, и полученный новый адрес «10» передается на третий уровень. На третьем уровне считывается содержимое памяти по адресу «10» (т. с. в десятичной системе счисления это 2) и получается значение 28. Поскольку это значение равно ключу поиска, то устанавливается флаг, показывающий, что поиск завершился успешно. При обнаружении ключа, равного ключу поиска, поиск продолжается влево вниз. На четвертый уровень передаются адрес 100 и флаг. На этом уровне считывается содержимое памяти по адресу 100 (или 4 в десятичной системе счисления) и получается значение 27. Значения 28 и 27 сравниваются и поиск продолжается вправо вниз. Адресом для аппаратных средств является значение 1001, при этом осуществляется вывод установленного флага. Это значение (1001) соответствует 9 в десятичной системе счисления, и, как видно из рис. 2.12,6, это является минимальным адресом ключа, равного 28. Если флаг не установлен, иначе говоря, ключ поиска нс обнаружен, выдаваемая информация показывает минимальный адрес ключа, который больше ключа поиска и присутствует в таблице.
В описанном выше примере использовался один ключ поиска, однако, когда ключ поиска 28 передастся на второй уровень, схема сравнения первого уровня может приступить к обработке следующего ключа поиска. Таким образом можно организовать конвейерную обработку со степенью параллелизма, равной числу уровней. При этом механизм поиска можно рассматривать как конвейер, в котором поток ключей поиска преобразуется в поток адресов та б-
лицы и флагов. Способ обработки в таком механизме поиска носит название двоичного пакетного конвейерного поиска.
Этот алгоритм можно расширить до разрядно-модульного типа, он был предложен Танакой в 1982 г. [1.3].
УСКОРЕНИЕ СОРТИРОВКИ
Аппаратные средства, предназначенные для высокоскоростной сортировки, можно классифицировать по трем величинам: числу используемых схем сравнения Л, максимальному времени обработки t и максимальной временной задержке D от момента завершения ввода данных об объекте до момента начала вывода результата сортировки. Иначе говоря, аппаратные средства разделяются на типы1) О (Л (и)), О (/(и)), 0(0 (и)), в которых h, D и t являются функциями к^пУ /(n), D^n) от числа объектов п. В табл. 2.1 показана эта классификация [9, 10].
Рассмотрим для сравнения три алгоритма начальной группы в данной таблице, которые являются программными алгоритмами. Конвейерная сортировка слиянием и конвейерная пирамидальная сортировка (в следующей группе) выполняются линейным сортировщиком, который использует О (log и) схем сравнения и заканчивает сортировку за время О (и). При этом в конвейерной пирамидальной сортировке время, требуемое только на обработку, т. с. исключая время последовательного ввода-вывода данных, равно 0. Сортировщики такого типа называются сортировщиками с нулевым временем. Сортировщики следующей группы — параллельные сортировщики с перестановкой четного-нечетного и параллельные дре- новидные сортировщики — по своей производительности уступают основным типам. Сортировщики параллельных вычислений, сортировщики методом рикошета, конвейерные сортировщики пузырьковым методом, относящиеся к следующей группе, являются сорти-
п Подразумевается порядок величины параметра, которым характеризуется данное аппаратное средство. — Прим. ред.
Таблица 2.1. Аппаратные средства для различных видов сортировки
h
t
D
Сортировка
С присвоением номера
Примеры
1
п2
п2
О
Пузырьковая сортировка
1
п \о^2п
п log2п
о
Битональная сортировка ^
1
log га
п log п п
га log га log га
о
о
Пирамидальная сортировка !>
Конвейерная сортировка слиянием
log га п
п
п
0
п
о
о
Конвейерная пирамидальная сортировка Параллельная сортировка с перестановкой четного-нечет- ного
п
п
п
п
log га 0
о
О
Параллельная древовидная сортировка Сортировка с параллельным вычислением
п
п
0
о
Сортировка методом рикошета
п
п
п
0
"Уп
о
о
Конвейерная пузырьковая сортировка
Битональная сортировка по решетке
п
п2
log2 га
log га
log2 га
log га
о
о
Битональная сортировка с перенастраиваемой связью Теоретическая Мюллера—Препарата
п
log га
log га
о
Теоретическая Хирш- берга (1)
Продолжение табл. 2.1.
н
t
D
Сортировка
С присвоением номера
Примеры
п} + Ук
к log п
к log п
О
Теоретическая Хирш- берга (2)
n log п
log га
log га
О
Теоретическая Препарата (1)
nwlk
к log п
к log п
о
Теоретическая Препарата (2)
Примечание. Пузырьковая, битональная и пирамидальная сортировки являются программно-реализованными -алгоритмами, но для сравнения они показаны вместе.
h— число компараторов; t— время обработки; к — любое значение, большее 1; D—задержка времени от окончания ввода данных до начала ввода данных.
ровщиками с нулевым временем типа (п, п. 0), однако количество аппаратных средств, используемых ими, больше чем О^пу Битональные сортировщики по решетке и битональные сортировщики с перемещаемой связью (shuffle connect) относятся к группе самой скоростной обработки среди остальных практически используемых аппаратных средств, которые содержат менее О (и) схем сравнения. Однако нужно отмстить, что когда ввод-вывод данных сортировщика выполняется последовательно, возрастает доля времени ввода-вывода в общем времени обработки, поэтому получить высокую скорость нс удастся. К последней группе относятся сортировщики, имеющие более чем О (и) схем сравнения, причем используемые ими алгоритмы по своим характеристикам близки к нижнему теоретическому пределу времени обработки. С точки зрения теории такие сортировщики имеют смысл, но с практической стороны они не представляют интереса. Ниже будут рассмотрены только типичные сортировщики.
Конвейерная сортировка слиянием [14]. Сортировка может выполняться методом периодического
Вход
I e
\d
»!•/!!»!
Слияние верхней и нижней nap
Получаются четыре последовательности длиной 2
(ed)
(hg) (fc) (ba).
Поочередно разбивается на две последовательности
Получаются две
последовательности длиной 4
*~(hged) (fcba)
Поочередно разбивается на две последовательности
Слияние верхней и нижней лар
I (hg) 11 (ba) 1 (ed) 11 (fc) L_
j (fcba) p
1 (hged) L
*-(hg(edc ba)
Окончание сортировки слиянием
m. Устройство B : Буфер слияния
Рис. 2.13. Конвейерный сортировщик, использующий метод слияния, а — сортировка слиянием; б — структура конвейерного сортировщика, использующего метод слияния.
слияния двух последовательностей, при котором длина подпоследовательностей, расположенных строго по порядку, увеличивается на 1, 2, 4, ... (см. рис. 2.13). Такую обработку можно осуществить конвейерным способом с помощью структуры, показанной на рис. 2.13,6. Устройство слияния каждого каскада начинает слияние (объединение), как только из предыдущего каскада поступят заголовки двух подпоследовательностей. Принцип такой конвейерной обработки показан на рис. 2.14. Этот алгоритм был предложен Тоддом в 1978 г., а в 1982 г. Танака расширил его до разрядно-модульных структур [13].
Конвейерная пирамидальная сортировка [12]. Конвейерная пирамидальная сортировка представляет собой разновидность пирамидальной сортировки. Это алгоритм, который с помощью аппаратных средств реализуется методом параллельной обработки. Как алгоритм механизма сортировки он был предложен Танакой из Университета Хоккайдо в 1980 г. В этом алгоритме используется пирамидальная (древовидная) структура данных, как показано на рис. 2.15, а. В этом дереве все данные на пути от корня к каждому листу расположены в порядке возрастания. Структура механизма сортировки схожа со структурой механизма сортировки, показанной на рис. 2.11, и на каждом уровне имеет независимые память и схемы сравнения.
С вводом данных размеры пирамиды увеличиваются от верхнего уровня к нижнему, а внутри уровня они растут слева направо. В каждом узле пирамиды в начальном состоянии хранятся данные, большие любых других данных, которые являются объектами сортировки. На рисунке эти данные обозначены символом «оо» (бесконечность). Узел, в котором каждый раз при вводе следующих данных они подставляются вместо бесконечности, называется «следующим узлом». Для ввода данных в пирамиду, выросшую до размеров, показанных на рис. 2.15, а, следует считать данные, расположенные на маршруте, проходящем от корня через следующий узел и достигающем крайнего левого нижнего узла, в направлении, указанном стрелкой на каждом уровне, затем
Рис. 2.14. Процесс сортировки методом слияния, выполняемой конвейерным сортировщиком, структура которого показана на рис. 2.13. Ро — расщепитель; Pz (t^l): устройство слияния+ расщепитель.
Входные данные *5
б
Рис. 2.15. Операция ввода при конвейерной пирамидальной сортировке. а — до обновления; б — после обновления.
в последовательность считанных таким образом данных нужно вставить заново вводимые данные, а уча-
Рис. 2.16. Процесс вывода данных при конвейерной пирамидальной обработке.
стки считывания повторно перезаписать (см.
рис. 2.15,6). Результатом также является пирамида.
Вывод данных из пирамиды в порядке возрастания выполняется, как показано на рис. 2.16. По-
скольку минимальные данные расположены в корне, то сначала выводится корневое значение и в этом месте возникает пустота. Таким образом, если на некотором уровне возникает пустота, то на следующем уровне из памяти считываются данные узлов, расположенных слева внизу и справа внизу от этой пустоты; наименьшее из этих данных передается на верхний уровень и производится регистрация того, что в выбранном узле возникла пустота. На верхнем уровне переданные данные записываются в пустое место. Если подобную обработку выполнять параллельно на всех уровнях, то можно организовать конвейерную обработку типа той, что показана на рис. 2.16. Добавим, что при возникновении пустотьГ на самом нижнем уровне в этом месте записывается оо. Благодаря этому по окончании вывода данных пирамида возвращается в свое первоначальное состояние. Для инициализации пирамиды следует ввести минимальные значения данных объекта только в том количестве, которое позволяет емкость механизма сортировки, и вывести только это число данных. При этом каждый узел пирамиды инициализируется в оо. Этот алгоритм был усовершенствован Танакой в 1985 г. для возможности использования данных переменной длины [15].
Битональная сортировка [16]. Если члены некоторой последовательности (а0, а\, ..., ап-0 удовлетворяют условию
^^tii ^ ... ^А/ ^а/+1 ^ ... ^ап_Х)
то эта последовательность, а также последовательности, полученные ее циклическим сдвигом, называют битональными. Если битональную последовательность (Ко, Кь • ., Кп-х), где м = 2/п, преобразовать с помощью (программы)
for /= 0 to т — 1 do
begin
х <-min (Ki, Ki+m)',
Кi-x-m^ max (Ki, Ki-vmY»
Ki <- x;
end;
то первая и вторая подпоследовательности (^o, К\» . .., Кт-1), (Кт» Кт+1» ...» Кп-1) ВО ВНОВЬ ПОЛученной последовательности являются битональными, причем максимальное значение в последовательности /Со, Кг» ...» Km-i будет меньше минимального значения в последовательности Кт» Кт-\» ...» Кп-\. Это можно проиллюстрировать графически, например как
Рис. 2.17. Принцип битональной сортировки.
а — пример битональной последовательности; б — пересечение первой половины второй половиной; в — разделение на минимальное и максимальное значения каждого элемента последовательности.
показано на рис. 2.17. Допустим, имеем битональную последовательность (1, 3, 4, 6, 9, 5, 2, 0), которая после указанного выше способа преобразования принимает вид (1, 3, 2, 0, 9, 5, 4, 6). При этом ее первая половина (1, 3, 2, 0) и вторая половина (9, 5, 4, 6) являются битональными, и, как видим, максимальное значение первой половины (3) меньше минимального значения (4) второй половины.
Если п является степенью 2, то, используя элемент наподобие показанного на рис. 2.18, а, битональную последовательность можно преобразовать в последовательность, которая сортируется (упорядочи-
вается) с помощью сети, структура которой показана на рис. 2.18, б.
—► д£ —*- Минимальное (А, В)
—► ВН —►- Максимальное (А, В)
ар а2' —< a2m ' битональная последовательность с1<с2<-с2т
Рис. 2.18. Структура битонального сортировщика.
а — базовый элемент; б — структуры битонального сортировщика с 2твходами.
Обычно набор входных данных не является бито- нальной последовательностью, поэтому, чтобы использовать сеть, показанную на рис. 2.18, входные данные необходимо привести к виду битональной после-
Рис. 2.19. Структура 8-входового сортировщика, выполняющего битональную сортировку.
Рис. 2.20. Битональный сортировщик с перенастраиваемой связью.
довательности. При битональной сортировке в этой части также используется базовая сеть, показанная на рис. 2.18, и, как показано на рис. 2.19, сортировщик строится по методу последовательного увеличения длины битональной последовательности путем умножения на степень 2, начиная с 21. Если п— это степень 2, то в используемой сети по вертикали расположено в ряд п/2 элементов, показанных на рис. 2.18,о, а по горизонтали—(log2 п + log п)/2 элементов. Сортировщик, в котором каждый уровень такой сети накладывается на все начальные уровни, а число базовых элементов ограничено п/2, называется битональным сортировщиком типа (n, log2 n, log2 п). При такой структуре связь между элементами сильно усложняется, однако вместо увеличения числа шагов обработки эту связь можно сделать достаточно гибкой (перемещаемой) (shuffle) (рис. 2.20) [17]. Поскольку порядок требуемого на сортировку времени сохраняется в пределах O(log2n), то этот случай также относится к типу (n, log2n, log2n). Перемещаемая связь эквивалентна связи в гиперкубе, поэтому бито- нальный сортировщик типа (n, log2n, log2n) можно реализовать и с помощью структуры гиперкуба, расположив в каждом его узле базовый элемент.
Глава 3
ВЫЧИСЛИТЕЛЬНЫЕ МОДЕЛИИ МЕТОДЫ ОЦЕНКИ
Для описания процесса вычислений в настоящее время используются в основном четыре типа моделей: императивные, функциональные, объектно-ориентированные и логические модели. Кроме того, если в вычисления ввести неопределенность и параллельность, то каждый из этих типов можно разбить на два подтипа: неопределенные вычислительные модели и параллельные вычислительные модели. Для каждой модели существует соответствующий метод оценки. Эти методы разделяются на три основных типа: с потоком управления, потоком данных и редукционные. В процессе оценки необходимо осуществлять обмен информацией. Для этого используются способы вызова по значению, вызова по ссылке, вызова по тексту, вызова по имени, вызова по запросу и т. д. В неймановской архитектуре используются императивная вычислительная модель, метод оценки с потоком управления, а обмен информацией выполняется главным образом на основе вызова по значению и вызова по ссылке. Различные виды ненеймановских архитектур можно рассматривать с точки зрения применения различных вычислительных моделей, методов оценки и способов передачи информации.
ВЫЧИСЛИТЕЛЬНЫЕ МОДЕЛИ
Как уже упоминалось выше, существует 4 основных класса вычислительных моделей: императивные, функциональные, объектно-ориентированные и логические. Алгоритмы, используемые в этих моделях, реализуются с помощью языков программирования 4 типов: императивных, функциональных, объектно-ориентированных и логических.
ИМПЕРАТИВНАЯ ВЫЧИСЛИТЕЛЬНАЯ МОДЕЛЬ
Неймановская архитектура предполагает последовательное расположение команд ЦП в программе. ЦП последовательно по одной считывает эти команды из памяти и в соответствии с имеющимися в них указаниями считывает данные, хранящиеся по некоторому адресу в памяти, выполняет заданные операции и записывает результаты операции в некоторый адрес памяти. Содержимое памяти соответствует состоянию машины, а вычисления выполняются путем последовательного изменения этого состояния. Таким образом, выполнение вычислений сопровождается побочным эффектом.
Такая вычислительная модель называется императивной моделью. Языки программирования такие, как Фортран, Алгол, ПЛ/1, Паскаль и др., основываются на этой вычислительной модели и объединяются под названием «императивные языки» !). В императивных языках побочный эффект представлен оператором присваивания, который указывает подстановку некоторого значения в переменную.
Программа, написанная на императивном языке, выполняется последовательно по одному оператору, т. с. в соответствии с последовательностью описания, но для изменения такого порядка выполнения можно использовать операторы if и goto, которые указывают на условный или безусловный переход, оператор while, используемый для создания программного цикла, и т. д. Кроме того, в тех случаях, когда одна и та же обработка выполняется часто, используют процедуры, функции и способы их вызова, т. с. такая обработка описывается в виде модуля и программа составляется таким образом, что различные модули ее вызываются по мере надобности.
Если некоторая процедура Р(%ь х2, • , ^) и функция f(xi, х2, • • •, хт) представляются в виде Р(Уь У2, •Уп) и f(yb у^ ..., уту то каждое значение Xi называется формальным параметром, а каждое значение yi — реальным параметром. При
11 Другое название — процедурные языки. — Прим. ред.
вызове необходимо связать реальный параметр с фор мальным параметром, для чего существуют такие способы, как вызов по значению, вызов по ссылке, вызов по тексту, вызов по имени и проч.
В вызове по значению формальный параметр xt является локальной переменной, которая используется только в процедуре или функции, и при запуске процедуры или функции значение реального параметра yi подставляется в формальный параметр xt в качестве начального значе ния.
При вызове по ссылке если реальный параметр yi является переменной, то формальный параметр х^ отождествляется с переменной уь Таким образом, если в инициированных процедуре или функции значение формального параметра Xi обновляется, то автоматически обновляется и значение переменной уь
При вызове по тексту выражение, написанное в качестве реального параметра, записывается в том же самом виде в позицию соответствующего формального параметра. Если в записанном выражении имеются локальные переменные, используемые только в процедуре или функции, и другие переменные с такими же именами, то при вызове по тексту (поскольку это выражение в таком же виде записано в процедуре и функции) эти переменные используются в качестве локальных переменных. Допустим, например, что для формального параметра х существует реальный параметр у-\-z, а также что до вызова значения у и z были равны 1 и 2 соответственно, а у — это также имя локальной переменной в вызываемой процедуре. Тогда если сама процедура имеет вид
yv=3; print (х),
то на печать будет выводиться нс 3, а 5, но при этом значение у = 1 в вызывающей процедуре нс изменяется даже после окончания вызова.
Для того чтобы избежать конфликтных ситуаций, связанных с одинаковостью имени переменной, используемой локально, и именч, вводимого извне при вызове по тексту, используется вызов по имени, кото-
рый накладывает некоторые ограничения на вызов по тексту. При этом способе формальный параметр также заменяется на текст выражения, которое является реальным параметром, однако при оценке внутри процедуры или функции подставленного выражения используется связь между переменной и ее значением до вызова. То есть в приведенном выше примере на печать будет выведено значение 3.
ФУНКЦИОНАЛЬНЫЕ ВЫЧИСЛИТЕЛЬНЫЕ МОДЕЛИ
Вычислительная модель, в которой программа рассматривается как множество определений функций, называется функциональной моделью. Для описания функциональных моделей используются два метода: первый основан на использовании апплика- тивного языка, а второй — на использовании языка с однократным присваиванием. Отличительной чертой этих моделей является то, что в основу их положена простая и четкая математическая модель, называемая «лямбда-исчислением». Примерами аппликативного языка являются «чистый» Лисп, предложенный Маккарти [1], ISWIM Ландина [2], SASL Тернера [3], FP Бэкуса [4] и др. К языкам с однократным присваиванием относятся Id Арвинда [5], VAL Аккермана и Денниса [6], LUCID Ашкрофта [7] и др.
Лямбда-исчисление. В выражении f(x), которое используется обычно для представления функции, неясно: то ли оно означает функцию f, то ли ее значение при заданном значении параметра х. Поэтому для четкого описания функции f было введено выражение Xx^xY То есть, когда выражение М хотят рассматривать как функцию от х, следует использовать запись ХхМ. Получение выражения ХхМ из выражения М называют «лямбда-абстракцией». Таким образом, выражение Хх(х + у) является функцией от х, а нс от у. При этом х называется связанной переменной, а у — свободной переменной. Если f = ХхМ, то подстановка выражения А в х внутри М называется применением А к f и записывается как fA.
Если переменная х в выражении N заменяется на выражение Z, то результат N' подстановки \ZJx\N определяется следующим образом:
Если N — переменная:
при N = х № = Z;•
если N =N х, то N' остается равным N.
Если N имеет вид ХуМ:
если у является той же переменной, что и х, то N' = N;
если у — переменная, которая отличается от х:
1) если х нс является свободной переменной выражения М, либо у нс является свободной переменной выражения Z, N' = Xy\Zjx\M.
б — 2) в противном случае N' = XZ\ZJxV •(U/ylM), где Z— переменная, которая не фигурирует ни в ^, ни в Z.
Если N имеет вид FA, то N' = ([Z/x]F) • •([Z/x]A). В лямбда-исчислении определены ' три правила преобразования.
a-правило (замена имени связанной переменной)
Если у не является свободной переменной выражения М, то ХхМ <=>- Ху [у/х] М.
p-правило (подстановка).
kXxMN^\N!xA М.
е (3) -q-правило (расширение)
Если х не является свободной переменной М, то Хх (Мх) <=> М.
Если р- и трправило использовать слева направо, то можно упрощать выражения. Такое использование правил называется p-редукцией и трредукцией, а формы XxMN и Xx(Afx), являющиеся симметричными в приложениях, называются редексом.
Оценка выражений в лямбда-исчислении выполняется путем периодического повторения р- и 11-редукции. В результате получается выражение, к которому невозможно применить указанные выше правила редукции. Такое выражение называется простым. Оценка выражения М завершается после того,
как оно станет простым выражением М\ при этом М' считается результатом оценки М. Однако это не означает, что простое выражение существует для каждого выражения.
Способ редукции некоторого заданного выражения, очевидно, зависит от порядка выбора редекса. Однако если при различных порядках преобразования получаются две простые формы, то они преобразуются друг в друга с помощью a-преобразования по крайней мере теоретически. Существует способ, по которому обычно выбирается самый левый (самый внешний) редекс. Этот способ называется редукцией нормального порядка. Если для заданного выражения X существует простая форма У, то существование редукции нормального порядка из X в У гарантируется теоретически.
Если отложить оценку параметра при вызове функции и приступить к оценке самой функции, то потребуется оценка тех ее частей, в которых имеется ссылка на параметр, поэтому оценка нормального порядка соответствует оценке параметра. Это похоже на вызов по имени.
Порядок редукции, при котором в отличие от нормального порядка, прежде чем приступить к редукции редекса XxMN (который является объектом Р-редукции), необходимо оценить значение N, называется аппликативным порядком, он соответствует вызову по значению. При нормальном порядке оценка может закончиться даже при неопределенных значениях параметра, что невозможно при аппликатив- ном порядке. Однако если при аппликативном порядке оценка параметра производится только один раз, то при нормальном порядке каждый раз, когда необходимо значение параметра, нужна переоценка этого значения. Поэтому с точки зрения эффективности почти во всех языках программирования функционального типа используется способ оценки с помощью аппликативного порядка.
Аппликативным язык и язык с однократным присваиванием. В аппликативных языках оператор присваивания нс используется. Программа состоит из
множества равенств, определяющих функции, и описаний приложений этих функций при вводе данных. Например, в языке SASL3 функция fact, вычисляющая факториал, определяется следующим образом:
fact п where fact 0 = 1
fact п = п * fact (n — 1)
В аппликативных языках допускается присваивание имени значению. Эта операция представлена в форме оператора присваивания, однако если значению присвоено имя, то в ячейку данных с уже присвоенным именем нельзя подставлять новые значения, поэтому смысл этого оператора присваивания несколько отличается от традиционного. Оператор присваивания можно использовать в качестве формы представления, однако в этих случаях его роль нужно ограничить присваиванием значению, стоящему в правой части, имени, указанного в левой части. Для реализации этого ограничения следует использовать правило, которое гласит, что «присваивание имени одной и той же переменной допускается только один раз». Это правило называется «правилом однократного присваивания», а язык программирования, в котором это правило используется, называется «языком с однократным присваиванием». Таким образом, языки с однократным присваиванием по существу нс отличаются от аппликативных языков.
Для описания циклической обработки необходимо сделать возможным неоднократное присваивание значения одной и той же переменной цикла. В языках с однократным присваиванием эта проблема решается обычно путем автоматической модификации переменной в каждом цикле. Рассмотрим для примера программу, написанную на языке Id [5], которая вычисляет сумму чисел от 1 до 11 (см. рис. 3.1). В этой программе старые и новые переменные цикла разделяются с помощью оператора, таким образом в пределах одного цикла можно применять правило однократного присваивания.
В языках с однократным присваиванием используется такое же формальное описание, что и в им-
перативных языках, однако в отличие от императивных языков порядок расположения операторов присваивания в программе нс имеет значения. Порядок оценки определяется нс последовательностью описания, а зависит от данных. Например, оператор 5:=Х+У можно выполнять только после оценки значений X и У. Поскольку значение S можно оценить только после выполнения этого оператора, то
(initial /<- 1; / <- О while I^N do new / <- / + 1; new / <- / + 1;
return /)
Рис. 3.1. Программа на языке Id, вычисляющая сумму чисел от 1 до N.
выполнить оператор присваивания, в правой части которого содержится S, до выполнения этого оператора нельзя.
В аппликативных языках возможна параллельная оценка множества параметров. Что же касается языков с однократным присваиванием, то здесь возможно параллельное выполнение всех операторов присваивания, для которых завершена оценка всех переменных, содержащихся в правой части. Нужно отмстить, что оба этих языка нс имеют побочного эффекта. Благодаря этому свойству оба языка пользуются большим вниманием при создании вычислительных моделей высокопараллельных машин.
Оценка с задержкой и вызов по запросу [8].
Если при оценке применений f(g(tz), h(a)) функции
f (х, (/) = if х>0 then 1 else t/-(t/ + l)
к g^, h(a) выясняется, что gW^O, то оценивать h^a^ нет необходимости. Однако при оценке в ап- пликативном порядке в подобных случаях оценка h^ необходима. Для того чтобы избежать ненужной оценки, программист должен указать, что оценка параметра откладывается до тех пор, пока в ней не возникнет потребность. Это можно сделать, указав
перед параметром «delay». Наоборот, для принудительного выполнения задержанной оценки используется указание «force». С помощью этих указаний эту функцию можно определить следующим образом:
f (х, у) = if (х>0 then 1 else (force у) ((force у) + 1),
и записав f^g^a^, delay (А (а)), оценку h^ можно задержать до принудительного выполнения ее по указанию force. Такой способ оценки называется «оценкой с задержкой». Иногда при этом способе бывает необходимо провести оценку одного и того же параметра (оценка которого была задержана) два и более раз. Приведенный выше пример является как раз таким случаем. Для повышения эффективности можно использовать способ, который заключается в том, что значение, полученное при первой принудительной оценке, сохраняется и используется в остальных случаях, если оценка выполняется два и более раз. Подобный способ передачи параметра называется вызовом по необходимости.
Одним из преимуществ оценки с задержкой является возможность конвейеризации передачи бесконечного списка. Если функция
intlist (n) = cons (n, intlist (п+1)),
генерирующая бесконечный список целых чисел, начиная с п, применяется для целых чисел, то выполнение ее нс останавливается. Используя указание delay, запишем эту функцию как
dintlist (n) = cons (n, delay dintlist (n + 1)),
а функцию sum определим следующим образом: '
sum (n, /) = if п —О then О
else саг (/) + sum (п — 1, force cdr (/)).
Тогда при оценке sum (Л, dintlist (1)) каждый раз при рекурсивном вызове sum элементы dintlist (1) последовательно оцениваются, начиная с первого, и в качестве результата определяется значение 1 + 2 + + ... + к. В этом случае оценку dintlist и оценку sum можно рассматривать как два параллельных процесса, причем dintlist последовательно генери-
рует целые числа и передает их процессу sum, который их последовательно использует и определяет полную сумму. Таким образом, между двумя этими процессами существует поток данных, и можно считать, что оба этих процесса выполняют конвейерную обработку. Подобный режим обработки, существующий между двумя параллельными процессами, называется потоковой обработкой.
ОБЪЕКТНО-ОРИЕНТИРОВАННЫЕ ВЫЧИСЛИТЕЛЬНЫЕ МОДЕЛИ
В императивных и функциональных вычислительных моделях операция принимается за субъект, а вычисления представляются в виде использования операций с некоторых объектов. Однако если сделать наоборот, т. с. объект операций принять за субъект, то можно построить такую вычислительную модель, в которой применение операции рассматривается как передача запроса объекту, а интерпретация запроса и действия, предусмотренные в нем, выполняются самим объектом, принявшим запрос, который считается субъектом. Такая модель называется объектно-ориентированной моделью. В объектно-ориентированных моделях вычисления моделируются с помощью множества объектов, передающих друг другу запросы. Итак, «объектом» называется объект операций, который в данной модели считается субъектом.
В объектно-ориентированной модели операция «3 + 4» представляется как передача объекту «3» запроса «+» от другого объекта «4», выступающего в качестве параметра. Предполагается, что объект «3» сам знает, какую обработку ему нужно делать по этому запросу. В результате обработки генерируется новый объект «7».
Объект обладает следующими особенностями. Он имеет внутреннее состояние, которое при приеме запроса становится активным. Управлять внутренним состоянием объекта извне можно только посредством передачи ему запросов. В ходе вычислений объект может передавать запросы другим объектам.
Объекты одного типа определяются как класс, и из этого класса можно генерировать другие объекты (классы).
Объект можно рассматривать как новый абстрактный тип данных. Кроме того, если сделать возможным одновременный переход в активное состояние множества объектов, то объект можно рассматривать как процесс. Примером объектно-ориентированного языка программирования является в первую очередь PLASMA [10], основанный на теории actor [9], языки Mesa [11], CLU [12], Смолток [13, 14], LOOPS [15] и др. В модели actor объекты рассматриваются как процессы, и с ее помощью можно описывать параллельные процессы.
ЛОГИЧЕСКИЕ ВЫЧИСЛИТЕЛЬНЫЕ МОДЕЛИ
Модели, в которых вычисления представляются с помощью логики предикатов, называются логическими, а язык программирования, используемый для описания вычислений, называется логическим языком [16]. Типичным примером такого языка является Пролог, основанный на хорновской логике, представляющей собой подмножество логики предикатов первого порядка.
Предикат (Л, /2, ..., М в Прологе называется литералом. Параметр ti может быть константой, переменной или структурным элементом типа списка, но все эти его формы объединяются общим названием «термЬ. Если считать Pi и Q/ литералами, то множество высказываний в логике предикатов первого порядка можно представить в виде множества высказываний, имеющего форму (QiAQ2A ... AQn)-> (Pi V Р2 V-v. V Рту Это представление называется клаузальным представлением, а форма высказывания называется клаузальной формой. Высказывание в такой форме называется предложением. В хорновской логике используются только тс предложения, для которых т ^ 1. В Прологе это описывается как Р\;— Qi, Q^ . • ., Qn, и для оценки Pi достаточно оценить Qi, 'Q2, ..., Qn.
Предложение для m = 0 соответствует запросу и представляется как «?— Qb Q2, • Qn>. Это предложение называется целевым и соответствует основной программе. Оно интерпретируется как «пусть оценивается Qb Q2, ..., Qn>. Предложение для п = О при т = 1 записывается как Р\, оно показывает факт, что существует Р\, и вместе с тем показывает, что оно оценено как Р\. Предложение при m = 0 и п = 0 называется пустым и обозначается □.
Структурный элемент имеет вид <функтор> (<терм)ь <терм>2, <терм>*). Список, который является примером структурного элемента, можно представить как соп8(<терм)ь <терм>2), а в Прологе это записывается как [<терм)11 <терм)2]. Это соответствует записи (<терм>1 <терм>2) на языке Лисп. Список (<терм>ь <терм>2, ..., <терм>*) выражается как [<терм)ь <терм>2, ..., <терм)&].
Программа на языке Пролог представляется в виде совокупности предложений, одно из которых целевое. Рассмотрим в качестве примера следующую программу:
? - append (X, У [1, 2, 3, 4]), У = [2 | _]
append ( [ ], X, У).
append ([^|Х], У, [У | Z]):-append (X, У, Z)
Здесь символ «_» в списке [2|_] показывает переменную, нс имеющую имени. Эта программа среди способов разделения списка [1, 2, 3, 4] на два списка X и Y определяет такой способ разделения, при котором начальный элемент в списке У является 2. Во второй и третьей строке дастся определение append.
Оценка целевого предложения начинается с оценки головного литерала. Для оценки выражения append (X, У, [1, 2, 3, 4]) нужно выбрать такое предложение, которое можно было бы унифицировать с левой частью путем подстановки в переменную соответствующего значения. Поиск такого предложения выполняется по порядку, начиная сверху. Выбрав вторую строку, получим Х=[ ], У = [1, 2, 3, 4]. Для оценки переходим ко второму литералу в целевом предложении, однако решение противоречит
У= [2|_], поэтому оно недействительно. Попытаемся отыскать другое решение для головного литерала. Такой поиск называется перебором с возвратами. На этот раз выберем третью строку и оценку append (X, У, [1, 2, 3, 4]) заменим на оценку (XI, У, [2, 3, 4]). В этой унификации предполагается подстановка Х = [1 | XI]. При оценке нового литерала попытаемся также проделать унификацию с левой частью в последовательности «вторая строка, третья строка». Подставив во второй строке XI = [ ], У= [2, 3, 4], убеждаемся, что'унификация прошла успешно и можно перейти к оценке следующего литерала У = [2|-]. Поскольку на этот раз противоречия нет, то принимаем его за решение, т. с. решение определяется как У = [2, 3, 4], X = [1 | XI] = [1]. Таким образом, выполнение программы на языке Пролог отличается использованием операций унификации и перебора с возвратами.
В указанной выше программе правильное решение можно определить даже в том случае, если поменять местами первый и второй литералы целевого предложения. Далее, если рассматривать литералы как процессы, то возможна их параллельная оценка. Эта параллельность называется И-параллельностью. Кроме того, для оценки предложения append (X, У, [1, 2, 3, 4]) необходимо попытаться провести унификацию второй и третьей строк, причем это можно проделать параллельно. Такая параллельность называется ИЛИ-параллельностью.
Язык программирования, в котором впервые были применены средства описания этих параллельностей, называется Парлогом (PARLOG) [18] (предложен Кларком). В Парлоге запятая, разделяющая литералы, означает И-параллельность, а точка, разделяющая предложения, означает ИЛИ-параллель- ность. Эти параллельности могут обрабатываться одновременно. Последовательно обрабатываемые Ии ИЛИ-параллельности обозначаются соответственно «&» и «;».
Введение ИЛИ-параллельности приводит к получению множества решений, но из них принимается только первое решение, а остальные отбрасываются.
В И-параллельности сторона, вводящая в переменную значение, и сторона, использующая это значение, разделяются. В языке Парлог это разделение выполняется путем описания режима и указания ввода- вывода относительно переменной. Сначала при определении предиката нужно обязательно описать режим в виде отношения Р(Я1, 02, . ., cuY Режим описывается с помощью символов «?» и «~», которые ставятся перед каждым а^ причем «?» означает ввод, а «~>—вывод. При вызове этого предиката входная переменная указывается как «X?», а выходная переменная — «Х^». В случае когда при последовательной операции И указывается р(Х~)& q(X), то на стороне р оценка нс выполняется до тех пор, пока на стороне q нс потребуется значение, т. е. выполняется оценка с задержкой.
Язык Парлог имеет оператор, который соответствует оператору сечения языка Пролог, он обозначается символом «|». Таким образом оценка Р | Q означает, что сначала выполняется оценка Р, первое полученное решение считается действительным, все остальные отбрасываются, а затем выполняется оценка Q.
Шапиро исключил последовательные операции И и ИЛИ из Парлога и создал язык, получивший название «Параллельный Пролог» (Concurrent Prolog) [29]. В этом языке предикат, который сам себя рекурсивно вызывает и в то же время продолжает выполняться, рассматривается как процесс. При указании ввода-вывода переменной только входная переменная разделяется символом «?». Приведем для примера следующие два процесса:
out ([X I У]): — print (X), out (У).
in ([X | У J): — read (X), in (У).
out — это процесс, осуществляющий вывод, a in — процесс, осуществляющий ввод. Когда вызываются процессы in(X) и out(X?), то из процесса in в процесс out последовательно передается по одному символу и между обоими процессами реализуется потоковая обработка.
В ICOT описание параллельной обработки, присутствующее в Параллельном Прологе, было еще более усовершенствовано и выдвинута концепция «охраняемого хорновского предложения» [20] (CHG). Предложение CHG имеет вид Н: -G [ В, где часть G называется «сторожем». «|» имеет такой же смысл, что и в языках Парлог и Параллельный Пролог. Таким образом, указанные выше процессы in и out с помощью GHC-предложения записываются как
out ([X J Г] ): - true! print (X), out (У).
in (Z): - true ] read (X), Z = [X|y], in (У).
В «охраняемом хорновском предложении» нс используются указание режима и указание ввода-вывода переменной. Вместо этого считается, что переменная, стоящая слева от вертикальной черты «|»,— входная, а справа — выходная. Так, в процессе out [X | У] считается входной переменной. В процессе in входной переменной считается X, а поскольку Z = [X \ У] находится справа от вертикальной черты, то по требованию Z Z = [X | У] и выводится [X | У]. Предложение GHC также можно использовать для описания потоковой обработки.
МОДЕЛИ ВЫЧИСЛИТЕЛЬНЫХ МЕХАНИЗМОВ
Если рассматривать оценку вычислений с точки зрения механизма обработки, то последний можно представить состоящим из двух компонентов: механизма управления и механизма данных. Механизм управления определяет, каким образом каждое вычисление запускает выполнение другого вычисления. Механизм данных определяет, как используются данные в различных вычислениях.
Механизмы управления можно разделить на три класса: с управлением с помощью формирователя последовательности, с управлением по готовности и управлением по необходимости. При управлении с помощью формирователя последовательности заранее определяется последовательность вычислений, и они выполняются в этой последовательности с помощью формирователя последовательности. В маши-
нах с неймановской архитектурой формирователю последовательности соответствует программный счетчик. При управлении по готовности выполнение каждого вычисления начинается только после того, как будут определены все его входные параметры. При управлении по необходимости когда запускается некоторое вычисление, то до его выполнения запускается вычисление, которое определяет значения входных параметров первого вычисления. Только после этого возможно его выполнение. Механизмы данных можно разбить на два типа: совместного использования по значению и совместного использования по ссылке. В первом случае все данные копируются для каждого вычисления, для которого они являются входными, и в каждое из них передается эта копия. Во втором — значения данных накапливаются в одном месте и в вычисление, для которого они являются входными, передается только информация, указывающая место хранения этих значений. -
На основании классификации этих двух типов механизмов (управления и данных) вычислительные механизмы можно классифицировать, как показано в табл. 3.1. Рассмотрим подробно каждый механизм, взяв для примера вычисление а = (Ь + с) * (Ь — с).
Таблица 3.1. Классификация вычислительных механизмов
Механизмы данных
к Я я <V
Совместного использования по значению
Совместного использования по ссылке
оз СО О.
3
Я Я
С формирователем последовательности По готовности
С потоком данных системы копирования
Неймановского типа
С потоком данных структурированной системы
X о>
По необходимости
Строчной редукции
Графовой редукции
Модель с потоком управления — это модель вычислительного механизма неймановской машины. 9—1145
Модель с потоком данных можно представить в виде направленного графа, вершины которого показывают функции, а ветви — передачи данных. На рис. 3.2 показан пример процесса вычислений с помощью модели с потоком данных. Черный кружок на ветви направленного графа называется фишкой!) (token) данных, которая означает передачу значения данных и передачу управления. Каждый узел становится выполнимым, когда на всех его входных ветвях существуют фишки данных. По мере выполнения вычислений фишки исчезают с входных ветвей и результат вычислений выводится в виде фишки. Если данные, подлежащие передаче, являются структурированными, то при передаче непосредственно их значений эффективность системы ухудшается, поэтому можно сделать таким образом, что будут передаваться только указатели значений этих данных. Такая расширенная система называется структурированной системой совместного использования. В отличие от нее стандартная система, в которой передаются непосредственно сами значения, называется системой копирования. Машины, основанные на модели с потоком данных, называются потоковыми машинами, они подробно описаны в гл. 4.
Наряду с потоковыми машинами в последние годы интерес стал проявляться к так называемым редукционным машинам, которые подробно описаны в гл. 5. Вычислительные механизмы редукционных машин основаны на принципе редукции (сокращения) посредством перезаписи строк символов в программе и графов.
В редукционной модели запуск вычислений осуществляется при необходимости данных. Способы ре-
п Фишка—это термин, относящийся к теории сетей Петри. Означает наличие на входе некоторого блока сигнала, кода, лексемы, данных и др. условий, разрешающих срабатывание этого блока. После начала работы блока разрешающие условия на входе аннулируются, а по завершении работы разрешающие условия появляются на выходе и передаются на входы других блоков, связанных с данным. Процесс перемещения условий срабатывания напоминает перемещение фишки на игровом поле. — Прим, ред.
дукции подразделяются на два класса: строчную редукцию и графовую редукцию в зависимости от того, что передается в функцию: скопированные значения данных или же только указатели, указывающие места хранения данных.
ггРис. 3.2. Пример вычислений с помощью потоковой модели.Рис. 3.2. Пример вычислений с помощью потоковой модели.
г
г
Рис. 3.2. Пример вычислений с помощью потоковой модели.
Рис. 3.2. Пример вычислений с помощью потоковой модели.
На рис. 3.3 показан процесс вычислений с помощью строчной редукции. Если требуется значение а (см. рис. 3.3, а), то копируется граф программы,
определяющий вычисление а (см. рис. 3.3,6). При этом запускается вычисление «*». Поскольку это вычисление невозможно без предварительного расчета двух параметров, то запускаются вычисления «+> и «—>. При этом получается редуцированный граф (с ветвями «6» и «2»), который показан на рис. 3.3, в. 9*
Результат получается, путем дальнейшей редукции (см. рис. 3.3, г).
На рис. 3.4 показан пример процесса вычислений с помощью графовой редукции. В этой модели, когда требуется определить значение а, определение вычис-
Рис. 3.4. Процесс вычислений с помощью модели с графовой редукцией.
ления а нс копируется, а передастся указатель определяющей программы. При достижении узла «*> на-
правление переданного указателя меняется на противоположное для того, чтобы запомнить место, из которого будет выдаваться результат вычисления (рис. 3.4,6). Далее, путем повторения операции смены направления указателя (текущего указателя) на противоположное получается граф, показанный на рис. 3.4, в. Операции «+> и «—> можно выполнять, граф редуцируется до рис. 3.4, г, а затем — до рис. 3.4, д.
Глава 4
РЕДУКЦИОННЫЕ МАШИНЫ
В этой главе в доступной форме рассмотрена модель лямбда-исчисления, которая положена в основу редукционных машин. Редукционными называются машины, выполняющие вычисления в соответствии с этой моделью лямбда-исчисления.
Модель лямбда-исчисления [1, 2] позволяет с помощью довольно простых синтаксиса и семантики представлять все функции функциональных программ. Кроме того, семантизация вычислений выполняется полностью унифицированно на основе базового понятия, называемого «перезаписью».
СИНТАКСИС ЛЯМБДА-ИСЧИСЛЕНИЯ
Выражение в лямбда-исчислении представлено в префиксной форме, т. с. вначале располагается оператор, например (+58). Таким образом, в префиксной форме арифметическое выражение, например я/6 + 6 X с, будет представлено как (+(/#Ь) (ХЬс)). На функциональном языке все программы представляются в виде выражений, а процесс выполнения программы заключается в определении значения этого выражения (это называется оценкой выражения). Оценка выражения производится путем повторения операции выбора и упрощения тех частей этого выражения, которые можно упростить (такая часть выражения называется редексом, причем сам редекс также является отдельным выражением). Операция упрощения называется редукцией.
Преобразование некоторого выражения Е в выражение F посредством многократной редукции записывается как E-*F. Процесс редукции завершается, когда выражение, преобразованное редукцией, нс содержит больше рсдскса. Выражение, нс содержащее редекса, называется нормальной формой (нормаль-
ная форма является результатом оценки). Процесс редукции выражения A (=Л1), при котором последовательно получаются выражения А2, Дз, ..., Ап (—В), записывается в виде Д (=Д1)~^ Д2-^Дз-* ^_.^АД=Ву
Например, при оценке выражения (+(/6 2)(Х 2 5) сначала выбираются его редуцируемые части (/6 2) и (X 2 5) и упрощаются соответственно до 3 и 10). При этом нс имеет значения очередность редукции частей (/6 2) и (Х2 5). Кроме того, обе части могут быть прорсдуцированы одновременно. Если редукция выполняется последовательно слева направо, то процесс оценивания записывается следующим образом:
(+ (/ 6 2)(Х 2 5))^(+3(Х 2 5))->(+ 3 10)
Полученное в результате редукции выражение (+310) также является редуцируемым, поэтому имеем
(+ 3 10)^13
Результат 13 невозможно упростить, поэтому он считается нормальной формой.
ПРИМЕНЕНИЕ ФУНКЦИИ ^
В лямбда-исчислении применение функции является чрезвычайно важным понятием. Применение функции f к аргументу х обозначается как (fx). Если функция применяется к нескольким аргументам, то она представляется, например, следующим образом:
(/(я, У. z))
Однако если разложить функцию на несколько элементарных функций от одного аргумента, то функцию от нескольких аргументов можно интерпретировать как результат синтеза функций от одного аргумента. Например, если выражение (+3 5) рассматривать как ((+3)5), то (+3) можно интерпретировать как функцию прибавления к некоторому аргу-
п Другое название — аппликация. — Прим. ред.
менту значения 3, а саму эту функцию можно считать результатом применения функции + к аргументу 3. Поскольку (+ 3) невозможно редуцировать, то оно используется в качестве нормальной формы; применяя его к значению 4, выполним редукцию ((+3)4)—►- 7. Обращение со всеми функциями с помощью функций от одного аргумента называется карризацией ° (по имени первооткрывателя этого метода — X. Карри [3]).
О СКОБКАХ
Слишком большое число скобок затрудняет восприятие выражения. Поэтому желательно сократить их число настолько, чтобы нс было двусмысленности выражения. Например, в выражении ((+3)5) можно опустить внутренние скобки и представить его в виде (+3 5). Кроме того, можно опустить и внешние скобки и представить в виде + 3 5. В качестве других примеров: ((((a b)c)d)e) можно представить как а b с d е, а (И(+^)3) ((g х)у)) можно представить как (/(+ 4 3) (g х у)) или f(+43) (gxy). '
ВСТРОЕННЫЕ ФУНКЦИИ И КОНСТАНТЫ
Далее будут использоваться встроенные функции и констайты, Например арифметические операторы типа +, —, X, /, целочисленные значения (0, 1, 2, ...), логические операторы типа И, ИЛИ, НЕ, логические значения (истина, ложь), последовательности символов (’a’, ’dog’, ...) и др. Например, оператор «—> и правило редукции И могут быть использованы в следующих выражениях:
(-62)-4
(и истина ложь)->-ложь
Кроме того, функция условия if (если) может быть использована как встроенная функция, с помощью которой правило редукции определяется сле-
*> Другое название — оптимизация Карри.—Прим, перев.
дующим образом:
(if true Ех Е<^->ЕХ
(if false Ei E2)-+E2
Для обращения co структурами данных здесь используются встроенные функции cons, head, tail (они соответствуют функциям cons, car, cdr языка Лисп), с помощью которых правило редукции определяется следующим образом:
(head (cons а b))->a
(tail (cons a b^->b
. Аналогично языку Лисп в «-исчислении используется пустой список (nil) в качестве константы.
На практике в целях повышения эффективности системы лямбда-исчисления при необходимости могут быть введены дополнительно специальные встроенные функции..
ЛЯМБДА-АБСТРАКЦИЯ
В лямбда-исчислении можно определять новые функции, используя для этого механизм, который называется лямбда-абстракцией. Лямбда-абстракция — это одно выражение, определяющее функцию. Например, выражение
(U. + x 1)
определяет функцию прибавления к переменной х единицы. Хх показывает, что это выражение является лямбда-абстракцией, формальным параметром которой является х. Выражение, которое следует за точкой, в данном случае это (+х1), называется телом лямбда-абстракции. Телом лямбда-абстракции может быть любое выражение. Тело лямбда-абстракции — это максимальное выражение после точки. Например, в лямбда-выражении
(^.Ху. + (X X уИ1 у х))(3 7)
тело лямбда-абстракции есть не + и не + (Х ху), а +(Х ху) Цуху
Если упорядочить все вышеизложенное, то синтаксис лямбда-выражения можно задать следующим образом, используя для этого метод описания Бэкуса.
(выражение) ::= | (константа)
| (переменная)
| (выражение) (выражение)
| X (переменная), (выражение)
СЕМАНТИКА ЛЯМБДА-ИСЧИСЛЕНИЯ
Используя лишь описанный выше метод редукции, нельзя смоделировать обычное лямбда-исчисление, включающее лямбда-абстракцию. В данном разделе рассмотрены три правила преобразования лямбда- выражений. Но сначала речь пойдет о переменных лямбда-выражения.
СВЯЗАННАЯ И СВОБОДНАЯ ПЕРЕМЕННЫЕ
Рассмотрим следующее лямбда-выражение:
(Хх. + х у) 3
Для оценки этого выражения необходимо, чтобы у уже имело какое-либо значение. Что касается х, то из записи Хх ясно, что это формальный параметр, и когда лямбда-выражение применяется к аргументу 3, то его значение задастся как 3. Таким образом, переменная, которая явно является формальным параметром (обозначенным стоящей впереди буквой X), называется связанной переменной, и в случае применения лямбда-выражения определение се значения называется связыванием переменной и значения. В отличие от нес переменная, нс связанная с X, например у, называется свободной переменной. Обычно значение свободной переменной некоторого лямбда- выражения определяется во внешнем выражении, которое включает это лямбда-выражение, поэтому значение лямбда-выражения определяется в зависимости от этого выражения.
Если для некоторой переменной существует лямбда-выражение, которое либо включает эту переменную, либо связано с ней, то эта переменная является связанной переменной, в противном случае — свободной переменной. Например, в выражении
Хх. + ((^У. + У z) 7) х
х и у являются связанными переменными, а г— свободной переменной.
Обратите внимание на тот факт, что переменная, описанная одним и тем же символом, может быть как связанной, так и свободной в зависимости от местоположения ее в выражении. Например, в выражении
+ x((U +х 1) 4)
первая переменная х является свободной, а вторая — связанной переменной (обратите внимание на тот факт, что это совершенно различные переменные).
Определение свободной переменной
Переменная х является свободной в выражении, состоящем только из нее самой.
Переменная х является свободной в выражении Е или выражении F, ■<=> х — свободная переменная в выражении кЕ Fy
Допустим, есть две переменные, х и у, и х— свободная переменная в выражении Е, <=>х является свободной переменной в выражении ХуеЕ.
Определение связанной переменной
Переменная х является связанной переменной в выражении Е или выражении F. ч=>х является связанной переменной в выражении (ЕРУ
Переменные х и у одинаковы, и х является свободной переменной в выражении Е или связанной переменной в выражении Е. -<=>х является связанной переменной в выражении ХуЛ
(Примечание. -<=> обозначает необходимое и достаточное условие.)
0-ПРЕОБРАЗОВАНИЕ <
Как уже говорилось ранее, лямбда-абстракция — это формализм для определения функции. Здесь необходимо пояснить, что такое применение функции, определенной лямбда-абстракцией, точнее, что такое правило применения этой функции к аргументу. Например, в выражении
(Ах. + х О 4
записаны последовательно лямбда-абстракция (Ах. + + х!) и аргумент 4, и эта запись означает, что лямбда-абстракция (Ах. + х 1) применяется к аргументу 4.
Правило этого применения является простым и заключается в следующем. «Результатом применения лямбда-выражения к аргументу является тело выражения (называемое реализацией (instance)), полученное путем замены связанной переменной (формального параметра) лямбда-абстракции (которая в теле лямбда-выражения является свободной переменной) на аргумент».
В приведенном выше примере при замене х на 4 получим выражение (+4 1). Это правило преобразования называется ^-преобразованием. Редукция с помощью p-преобразования описывается с помощью символа -> следующим образом:
(Ах. + х 1) 4-> + 4 1
Рассмотрим простые примеры p-преобразования:
(Ах. + х х) 5-> + 5 5
->10
(Ах.З) 5->3
^xAMJ У *))2 6^(Ау./ у 2) 6
->/6 2
->3
Как будет показано в следующем примере, аргументом может быть любое выражение:
W.f 3)(Лх. + х 1)->(Хх. + х 1) 3
->+ 3 1
—>4
При замене связанной переменной на аргумент необходимо обратить внимание на следующий факт. Одно и то же имя может быть присвоено как связанной, так и свободной переменной, но операцию замены нельзя проводить для переменной, которая является связанной в теле лямбда-выражения. Например, в процессе редукции
(U.(U +(- х 1))х 3) 9
-^(^. + (- х 1)) 9 3
^+ (- 3 1) 9
->1 1
в теле лямбда-выражения (Ххе + (—х 1))хЗ самая первая переменная (подчеркнутая) является связанной, поэтому при первом 0-преобразовании она не была объектом замены.
Обычно в лямбда-выражении, имеющем вложенную структуру, например
(ХхДХуДХг.Е)^
можно опустить скобки, при этом в полученном представлении
^Ххе Хуе Xze Е)
неоднозначного толкования нс возникает.
Несколько усложним p-преобразование и рассмотрим пример обработки структуры д енных. Упомянутые выше в качестве встроенных функций функции cons, head, tail нс обязательно являются таковыми, их можно определить с помощью лямбда-абстракции следующим образом:
cons = (Ха. Xb. Xf. f а b)
head = (Лс. с (Ха. ХЬ. а))
Xa\\ = (Xc.c(Xa.Xb. 6))
Эти лямбда-абстракции удовлетворяют правилам редукции cons, head, tail, описанным выше. Например,
head (cons р q)
= (Лс. с(Хае М. a)) (cons р q)
->(cons р q^Xa.Xb.a)
= ^XaeXbeXfef a b)p q^XaeXbea^
-ЦМЛ P q)(Xa.kb.a)
-> (ha. Xbe a) p q
-AMj.pt q
->P
ПРЕОБРАЗОВАНИЕ, РЕДУКЦИЯ, АБСТРАКЦИЯ
Использование p-преобразования, описанного в предыдущем разделе, в обратном порядке, например
(U +х 1) 4<-+ 4 1,.
называется р-абстракцией. -<это символ абстракции, а ->—символ редукции. Обычно р-преобразова- ние означает либо абстракцию, либо редукцию и обозначается двунаправленной стрелкой -<->-. Кроме того, для Того чтобы подчеркнуть, что это преобразование является именно p-преобразованием, под стрелкой приписывается буква р, например
+ 4 1 *-^(U +* 1) 4. Р *
P-преобразование используют для того, чтобы показать эквивалентность выражений (одинаковость их смысла), несмотря на различия в форме этих выражений, обусловленные преобразованием в процессе вычислений. В отличие от этого р-редукцию (->) используют для того, чтобы показать процесс лямбда- исчисления.
Помимо P-преобразования существуют также а- и ^-преобразования.
«-ПРЕОБРАЗОВАНИЕ
В лямбда-абстракциях
(Ах. + х 5)'
(Ау. + у 5)
используются разные связанные переменные х и у, однако результаты p-преобразования, полученные путем применения этих абстракций к любому аргументу, одинаковы. Иначе говоря, имя связанной переменной нс имеет существенного значения. Таким образом, если допустить регулярное изменение выражения так, чтобы нс было противоречий между формальным параметром и связанной переменной, то смысл выражения не изменится. Преобразование с изменением имени формального параметра или связанной переменной называется а-преобразованием. Пример:
(Ах.+ х 5) *-* (Ау. + У 5)
Отметим, что новое имя переменной, вводимое при a-преобразовании, не должно использоваться в качестве имени свободной переменной в теле исходной лямбда-абстракции, a-преобразование используется для предотвращения возникновения конфликта имён при замене имени в ходе p-преобразования.
Например, если выполнить p-преобразование выражения (Луе (Лх. Хуе (—ху) у) 4 5) (подчеркнутой его части), то получим
(Ау.(Ах.Ау(— х у) у) 4 5
-^кМАМЛ- у у)) 4 5)->0
В этом случае первая переменная у (подчеркнутая) является связанной во внутреннем лямбда-выражении, что приводит к неправильному результату. Поэтому сначала выполняем а-преобразование:
(Ау.(Ах. Ау.(— х у) у) 4 5).
>(Ау. (Ах. Az. (— х z) у) 4 5)
а затем, используя 0-преобразование, получаем правильный результат:
(Ху.(Хх. Xz.(— х z) у) 4 5)
-*<ХуА^А— У z)) 4 5)
-*(ХгА- 4 z) 5)
^(- 4 5)
->— 1
В показанном ниже примере также — при невнимательном отношении к оценке необходимости выполнить сначала p-преобразование— возникает конфликт имен, результатом которого является неправильный результат:
twice = (Xf. Xx. f У х))
Рассмотрим p-редукцию twice twice *>;
twice twice = (Xf. Xx. f (f (x)) twice
> (Xx. twice (twice x))
= (Xx. twice ((Xf. Xx. f (f x)) x))
> (Xx. twice (Xx. x (x x)))
Этот результат ошибочен. Для получения правильного результата необходимо прежде выполнить а-пре- образование, для того чтобы избежать конфликта по х:
twice twice = (Xf. Xx.f(fx)) twice
* (Xx. twice (twice x))
-*(Xx. twice ((Xf. Xx. f(f x)) x))
-*(Xx. twice ((Xf.Xyjy y)) x))
♦ (Xx. twice (Xx. x (x y)))
^-ПРЕОБРАЗОВАНИЕ
т]-преобразование является эффективным правилом преобразования для упрощения сложной Х-аб- стракции. Рассмотрим для примера следующие два
° Имеется в виду применение функции twice к значению аргумента, равному также twice. — Прим. ред.
выражения:
(Zx# + 1 х)
(+ О
Если оба этих выражения применить к произвольному аргументу, то результатом будет прибавление к этому аргументу единицы. Иначе говоря:
(Хх + 1 х) 5->(+ 1 5)—>6
(+ 1) 5 = (+ 1 5)^6
Другими словами, можно говорить о некотором преобразовании (Лхв + 1х)«-* (+1), учитывающем подобную эквивалентность. Это преобразование носит название т]-преобразования, ^-преобразование эффективно с точки зрения упрощения лямбда-абстракции.
Обычно правило т]-преобразования трактуется в следующей форме: «если переменная х нс является свободной переменной в выражении F и F обозначает функцию, то (Лхв Ех)^> F".
СВОДКА ПРАВИЛ ПРЕОБРАЗОВАНИЯ
Попытаемся систематизировать все вышесказанное и формализовать правила преобразования.
Для формализации введем прежде всего представление замены, а именно:
Е[М1х},
это означает, что свободная переменная х в выражении Е заменяется на М.
Определение Е[М/х]
х[М[х} = м
с[М/х] = с (где с —- любая переменная, отличная
от х или константа)
№ [Mix} = Е[М[х\ F[M(x}
[Ххе Е^[М1х} = Хх.Е
\Хуе Е) [Л4/х] (у отличается от х)
= Хуш Е[Л4/х] — если х несвободная переменная 10—1145
выражения Е, либо у —- несвободная переменная выражения М
= Xze (E[z/y]) [М/х] —- в других случаях
(здесь 2—-новая переменная, которая нс является свободной в выражениях Е или М).
a-преобразование: если у нс является свободной переменной в Е, то ^Ххв Е) <-> (Xz. Е[у/х]) (3-преобразование: (Лхв Е)М<-> Е[М/х]
трпреобразование: если х не является свободной переменной в Е и Е —- это функция, то (Хх* Ех) ч-> Е.
ПОРЯДОК РЕДУКЦИИ
Как уже говорилось ранее, выражение обычно содержит несколько редексов, поэтому существует множество порядков редукции в зависимости от того, какой редекс выбирается. Например, редукция выражения (+ (Х4 5) (/8 2)) может выполняться следующими способами:
(+ (X 4 5)( / 8 2))->(+ 20( / 8 2)
-*(+ 20 4)
.->24
либо ■
(+ (X 4 5)( / 8 2))->(+ (х 4 5)4)
^(+ 20 4)
—>24 либо■
(+ (X 4 5)( / 8 2)->(+ 20 4)
—>24
(обратите внимание, что в последнем случае редукция двух частей (Х4 5) и (/8 2) выполняется одновременно).
Кроме того, необязательно, чтобы все выражения имели нормальную форму. Иначе говоря, редукция не всегда выполняется конечным числом операций. На-
пример, редукция выражения (D D), где D = (Xxexx), продолжается бесконечно:
(D D) = (Ххе х х) (Хх, х х)
->(Лхе х х^Хх.х х)
->^Ххвх х^Хх.х х)
Это соответствует бесконечному циклу в программе процедурного типа.
Обычно от способа выбора редекса зависит возможность определения нормальной формы. Например, если для выражения
(ЛхЗ)(ОО)
сначала выполняется редукция (ОО), то из-за того, что это выражение не имеет нормальной формы, процесс редукции получается бесконечным. Если же перед редукцией (О О) применить лямбда-абстракцию (Лх.З) к аргументу (ОО), то сразу же получим нормальную форму 3.
Таким । образом, для определения нормальной формы очень важное значение имеет способ выбора редекса.
Итак, относительно способа выбора редекса и полученной нормальной формы возникает вопрос: равны или нет нормальные формы, полученные из одного выражения двумя разными порядками редукции? Ответ на этот вопрос даст теорема (ы) Черча — Россера.
Теорема Черча-Россера I.
Допустим, что Е\ ++ Ейч Тогда существует выражение Е, такое, что Ех-^Е, Е^-^Е.
Из этой теоремы вытекает следующее утверждение.
Утверждение
Никакое выражение нельзя преобразовать в две разные нормальные формы (с точностью до а-пре- образования).
ю*
Это утверждение показывает, что для любого процесса редукции, которая заканчивается при конечном числе операций, получается одна и та же нормальная форма. Таким образом, процесс редукции имеет важное свойство, которое формулируется в виде следующей теоремы.
Теорема Черча-Россера II
Допустим, что Ei -^Е^ и Е^ является нормальной формой. Тогда существует редукция нормального порядка из Е\ в £2.
Эта теорема утверждает, что если существует нормальная форма, то обязательно существует и способ редукции, с помощью которого получается эта нормальная форма (этот способ называется редукцией нормального порядка). По этому способу сначала выбирается крайний левый редекс выражения и в первую очередь выполняется редукция этого редекса. Например, в приведенном выше примере (Лх,3)(£) D) сначала был выбран крайний левый редекс Хх, что позволило получить правильно нормальную форму.
Следующий вопрос касается оптимальности редукции нормального порядка, а именно: как получить нормальную форму при минимальном числе шагов? Обычно редукция нормального порядка нс является оптимальным способом редукции. Тем нс менее из описываемых ниже процессов редукции графов и редукции на основе комбинатора мы узнаем, что редукцию нормального порядка можно оптимизировать.
Помимо редукции нормального порядка существует еще редукция аппликативного порядка. При таком способе редукции выбирается самый внутренний редекс. Преимуществом этого способа является простота управления, когда редукция аппликативного порядка выполняется непосредственно на ЭВМ. Однако существенным его недостатком является отсутствие гарантии получения нормальной формы. Вернемся к примеру (Лх. 3) (DD). Если выполняется
редукция аппликативного порядка, то сначала выбирается редекс (DD), но в этом случае получить нормальную форму нельзя,
РЕКУРСИВНЫЕ ФУНКЦИИ
Важным понятием в функциональных программах является понятие рекурсии. В этом разделе будет рассмотрен механизм обращения с этим понятием в лямбда-исчислении.
Прежде всего рассмотрим для примера следующую рекурсивную функцию:
• FAC = (Xn if(= п 0)1 (X n(FAC(— п 1)))).(I)
В этом лямбда-выражении присваивается имя и в процессе лямбда-абстракции к этому имени осуществляется обращение. Однако в самой системе лямбда-исчисления нет подобной функции определения имени. В лямбда-абстракции используются только безымянные функции. То есть проблема заключается в том, каким образом представить подобную рекурсию в системе лямбда-исчисления. Ниже рассмотрен способ этого представления.
Сначала выполним 0-абстракцию определения рекурсии FAC, где
FAC = Xn (--- FAC •-)
В результате преобразования получим
FAC = (V.(^.(-‘- f ---)))FAC
и представим его следующим образом:
РАС = Я FAC,
где Я = (ХЛМ(--^---)))-(2)
Здесь Н определяется как лямбда-абстракция. Кроме того, обратите внимание на тот факт, что выражение (2) является математическим уравнением, например оно может быть такого же вида, что и х2 — 2 = х. В данном случае лямбда-выражение есть корень этого уравнения.
Смысл уравнения FAC = //FAC заключается в том, что когда фукнция Н применяется к FAC, то результатом этого является нс что иное, как FAC. При этом FAC называется неподвижной точкой функции Н. У функции может быть несколько неподвижных точек (это очевидно из того, что уравнение х2 — 2 = х имеет два корня, х =—1, х = 2). Например, функция ^кх .Хх х\ определяющая вторую степень, имеет две неподвижные точки, 0 и 1.
Итак, если задать функцию У, такую, что она является входом, а се неподвижная точка — выходом, то это будет выглядеть следующим образом: YH = = H^YHy Здесь У называется комбинатором неподвижной точки. Если предположить, что подобный комбинатор У существует, то решение уравнения (2) можно получить следующим образом, нс используя для этого рекурсивное выражение:
FAC = УЯ
Н = ЦЗпЛЦ= п 0) 1 (Xn(f(~ п 1)))
Попытаемся убедиться в правильности этого определения путем доказательства, что (FAC 1)-^-1.
ЕАС=УЯ1
=H(YH)1
=(А/.Ап. if (=т? 0)1
(*nV(-n«YH)l
-^(Хп. if (=п 0) 1
—if (=1 0)1(*1(УЯ(-И)))
'-♦1(УЯ0)
-♦1(Я(УЯ) 0)
= * l^Xf.Xn. if (= п 0) 1
•(*п(/(-п1))))(УЯ)0)
-♦ *1(Лп. if (=и0) 1*
(♦и(УЯ(-л1))))0)
*lif (=00) 1 (*о(УЯ(-о 1)))
->♦11
-^1
Таким образом, комбинатор У, такой, что YH = = H(YH), обычно задается с помощью следующего лямбда-выражения:
У = (ЛЛ. (Лх,Л(х.х))(ЛхвЛ(х х)))
т. с. фактически
УЯ = (Лй.(Лх й(х х))(Лх.й(х х^Н
^►^Хх^Н^х х))(Хх.Н(х х))
^Н^Хх.Н^х х))(Хх.Н(х х))
<-*Я(У Я)
откуда следует, что равенство YH = H(YH) выполняется.
Таким образом, смысл определения рекурсивной функции, при котором в лямбда-абстракции задастся имя, полностью соответствует лямбда-исчислению.
Ниже будет показано, что существует способ описания, при котором лямбда-выражению присваивается имя и используется выражение (1), определяющее функцию.
Возможен также способ описания, при котором формальный параметр располагается в левой части, например
FUNC = (U3y.5)
можно представить так же, как FUNC х у = Я.
РЕДУКЦИЯ ГРАФОВ
Выражение, подлежащее редукции, можно запомнить в памяти компьютера в виде графовой структуры и путем упрощения этой структуры реализовать эффективную редукцию выражения [4]. Кроме того, с точки зрения гарантии окончания вычислений (т. с. если существует нормальная форма, то процесс редукции обязательно завершится) желательно использовать редукцию нормального порядка, для реализации которой также подходит графовая редукция.
Самой простой графовой структурой является древовидная структура. В частности, выражение, нс содержащее рекурсии, удобно представлять с помощью
древовидной структуры. Листья дерева соответствуют константам, встроенным функциям (+, —, /, X и др.) либо именам переменных. Например, применение функции f к аргументу х может быть представлено графом, показанным на рис. 4.1. Вершина @ на этом рисунке показывает факт применения этой
Рис. 4.1. Применение функции.
функции. Когда функция методом карриации применяется к нескольким аргументам, например (f Xi х2 ... хл), то ее можно представить с помощью графа, показанного на рис. 4.2. В данном случае f сначала применяется к хь получается функция (fxi),
Рис. 4.2. Граф функции.
затем эта функция применяется к х2, получается функция ((fxi)x2) и результат применяется к х3. Повторяя эту операцию, в заключение применяем полученную функцию к аргументу хп. Если обозначить через а и b любые выражения, а через f—функцию, то выражение (f а Ь) можно представить в виде графа, показанного на рис. 4.3. Например, выражение (+(—ab)(Xc(—de))) показано в виде графа на рис. 4.4.
Рис. 4.4. Граф выражения (+(—а 6)(Хс(—^ е))).
Рис. 4.5 Граф лямбда-абстракции.Рис. 4.5 Граф лямбда-абстракции.
Рис. 4.5 Граф лямбда-абстракции.
Рис. 4.5 Граф лямбда-абстракции.
cons Е\
Рис. 4.6. Граф выражения (cons£i £2).
Рис. 4.7. Ячейка cons.
Лямбда-абстракцию (Хх. тело) можно представить в виде графа, показанного на рис. 4.5. Здесь Хх показывает, что ниже этой вершины находится лямбда- абстракция и что формальным параметром является х. '
Граф выражения (consfi^) показан на рис. 4.6, а результатом оценки этого выражения являются структурированные данные (ячейка cons). Ячейка cons показана на рис. 4.7, и она отличается от графа (consfi f2). Символ : означает, что это ячейка cons.
«ЛЕНИВОЕ» ВЫЧИСЛЕНИЕ
В процедурных программах, например Паскаль- программах, при выполнении (команды) вызова функции сначала выполняется оценка ее аргумента (реального параметра). Такой способ вызова называется вызовом по значению. Однако поскольку в теле функции нс всегда используются все аргументы, то оценка всех аргументов является нерациональной. В данном случае более эффективным является способ выполнения оценки функции без предварительной оценки аргументов в момент, когда возникает необходимость в значении аргумента. Такой способ вызова называется вызовом по необходимости. Однако в процедурных программах вызов по необходимости почти нс используется по следующим причинам.
В процедурных программах при оценке аргумента возникает побочный эффект, из-за которого возможно получение разных результатов. выполнения программы. Поэтому, когда время оценки аргумента точно не определяется, невозможно правильно определить смысл программы.
При использовании стека эффективная реализация вызова по необходимости затрудняется.
В функциональных программах оценка при вызове по необходимости выполняется с задержкой, поэтому этот процесс называют «ленивым» вычислением [5,
7]. Напротив, вызов по значению называют «энергичным» вычислением. В области функциональных программ ленивое вычисление является очень важ-
ным понятием. Это объясняется тем, что с помощью ленивого вычисления можно нс только избежать ненужных оценок, но и обрабатывать данные бесконечной структуры, а также бесконечные потоки данных.
Механизм «ленивого» вычисления заключается в следующем: (1) Оценка аргумента функции выполняется нс в момент применения функции, а при выполнении функции, когда возникает необходимость в его значении. (2) Оценка аргумента производится только один раз. Иначе говоря, даже в том случае, когда значение аргумента используется в нескольких местах в процессе выполнения функции, оценка его производится только один раз при первом использовании, а затем везде используется полученное при этом значение.
Ленивое вычисление удобно с точки зрения вычислений, однако проблематично с точки зрения скорости выполнения программы. Поэтому на практике используются такие функциональные языки, которые не требуют проведения ленивого вычисления. В подобных языках при выполнении функций, для определения значения которых требуются значения всех аргументов (эти функции называются строгими функциями), используются, например, методы предварительного определения значения аргумента при помощи энергичного вычисления либо ленивого вычисления значений только тех аргументов, для которых оно является очевидным. Примерами языков, предполагающих использование энергичного вычисления, являются языки ML [8] и Норс [9]. Язык Valid, описанный в гл. 5, также относится к языкам этого типа. Существует метод, по которому компилятором анализируется строгость функции, выявляются необходимые аргументы (обязательно используемые аргументы) и по отношению к ним выполняется энергичное вычисление. К языкам, использующим подобное вычисление, относятся SASL [10], KRC [11], LML [12], Миранда [13] и др.
С точки зрения порядка редукции ленивое вычисление соответствует редукции нормального порядка, а энергичное вычисление — редукции аппликативного порядка. В модели вычислений потоков данных
используется энергичное вычисление — это вычислительная модель, которая параллельно выполняет редукцию аппликативного порядка.
РЕДУКЦИЯ ГРАФОВ
Итак, рассмотрим процесс редукции нормального порядка графа. На графе крайний левый редекс распознается следующим образом. Если задан граф выражения
fEx Е2 Е3 ... Е
(см. рис. 4 2), то система следует от корневого узла вдоль левой ветви до достижения самого левого листа f (рис. 4.8). f может быть данными, встроенной функцией или лямбда-абстракцией, поэтому ниже рассмотрены операции, которые выполняются в каждом из этих случаев.
Рис. 4.8. Трассировка графа.
Данные (численное значение или ячейка cons): в этом случае редукция завершается. Однако при этом необходимо, чтобы п^ $ (в противном случае данные используются в аргументах ЕХЕ2 ... Ет что расценивается как ошибка).
Встроенная функция от к аргументов: если п*^ к, то ^ЕХЕ2 ... £л) является крайним левым редексом. Корневая вершина графа ^ЕХЕ2 ... Е^ помечается символом редекса ($) (см. рис. 4.9, а). Если п < к. то с этого момента редукция невозможна, поэтому выражение остается без изменений.
Лямбда-абстракция (f = (Хх. тело)): если п ^ 1 (поскольку аргументы заданы), то редексом является (f£i), т. с. ((Хх. тело)£1). Корневая вершина этого графа помечается символом $ (см. рис. 4.9,6). Однако если п = 0, то аргументов нет, редукция с этого момента невозможна, поэтому выражение остается без изменений.
Рис. 4.9. а — применение встроенной функции; б — применение лямбда-абстракции.
Теперь, после того как редекс найден, посмотрим на простом примере, каким образом выполняется редукция нормального порядка на графе:
р-редукция
(Хх.(+ х х))3->(+ 3 3)
При подстановке аргумента вместо формального параметра в случае p-редукции сначала создастся копия аргумента (на графе) и рассматриваются способы замены на эту копию. Однако поскольку для создания копии требуются память и время, а кроме того, когда в аргументе содержится рсдскс, то при редукции нормального порядка с вызовом по необходимости следует выполнять редукцию для каждой копии, этот способ нельзя назвать хорошим. Поэтому
вместо него используется способ замены на указатель аргумента (графа) без создания копии. Способ с общим графом, основанный на использовании указателей, называется способом с общим графом.
Например, если рассмотреть выражение (Хх.(+хх)) (maxprime 100000) (на вычисление maxprime 100000
число, меньшее 100000число, меньшее 100000Рис. 4.10. Принцип редукции с общим графом.Рис. 4.10. Принцип редукции с общим графом.
число, меньшее 100000
число, меньшее 100000
Рис. 4.10. Принцип редукции с общим графом.
Рис. 4.10. Принцип редукции с общим графом.
(определение максимального простого числа, меньшего 100000) требуется довольно большое время), по способу создания копии необходимо дважды выполнять вычисление (maxprime 100000), а по способу с общим графом — только один раз (см. рис. 4.10).
Встроенная функция
В случае встроенной функции сначала выполняется оценка аргумента, значение которого необходимо. Например, в случае
(+ 6(Х 4 5))
Рис. 4.11. Редукция встроенной функции.
Рис. 4.12. Редукция графа выражения (Хх41Ц=хОН+х(-х 5)) (-6 2)))(Х2 3).
сначала для вычисления суммы необходимы значения двух аргументов, поэтому вычисляется произведение (X) (см. рис. 4.11).
В графовой редукции, если в принципе существуют два указанных выше механизма редукции, возможна редукция сколь угодно сложного выражения. В качестве примера на рис. 4.12 показан процесс редукции следующего выражения:
(Лх (if(= х 0)(+ х(- х 5))(— 6 2)))(Х 2 3).
КОМБИНАТОРЫ
Еще один способ редукции нормального порядка основан на использовании комбинаторов. При этом способе используется несколько простых комбинаторов, с помощью которых все выражения представляются в виде последовательности символов и посредством операции преобразования символов выполняется редукция выражения. В комбинаторах обычно нс используется понятие переменной, поэтому в лямбда-абстракции нет ни связанной, ни свободной переменной. Существуют самые различные комбинаторы, однако с точки зрения практической реализации системы редукции простыми являются комбинаторы S, К, I [14], предложенные Д. Тернером. '
Преобразование с помощью этих комбинаторов определяется следующим образом:
s f g x-»f х (g x)
К x у—> x
I x-^x
Комбинаторы S, К, I получаются путем преобразования соответствующих лямбда-абстракций следующим образом:
1-преобразование К-преобразование S-преобразование1-преобразование К-преобразование S-преобразованиеХхе х ^ I
1-преобразование К-преобразование S-преобразование
1-преобразование К-преобразование S-преобразование
Ххе с =ф- К с (с Ф х)
Лхе е^ => S (Лх. б]) (Лх. е2)
Рассмотрим далее простые примеры.
Преобразование в комбинаторы S, К, I
(Лхе + х х) 5 ^ S (Лх. + х) (Лх. х) 5
(S-преобразование)
^S(S(Xx. +)(Ххех))(Ххех) 5
(S-преобразование)
=^S(S(K +)(Цх))(Хх.х) 5
(К-преобразование)
=>S(S(K +)1)(Хх х) 5
(1-преобразование)
=>S(S(K +)I)I 5 (1-преобразование)
Вычисление с помощью комбинаторов
S(S(K +)I)I 5
->S(K +)I 5 (I 5)
^K + 5(I 5)(I 5)
5 (I 5)
->+ 5 5
->10
Комбинаторы выполняют ленивое вычисление. Это обстоятельство иллюстрируется следующим примером. В случае преобразования выражения
Ххе if ecete^
с помощью комбинаторов получим
S (S (S (К if)(Xx. ес^ (Ах. ^)) (Ах. ^)
(в этом читатель при желании может убедиться сам). Поскольку (Ххеес\ (Ах.еД ^хее^ также можно преобразовать в соответствующие комбинаторные выражения, то, обозначив их через GC) Et, F^ получим
S(S(S(K if)Cc)Et)Ef
11 — 1145
Применяя это комбинаторное выражение к аргументу, получим
S(S(S(K х^С^Е^Е, х)
->S(S(K i^C^Ei x^Ef x)
->S(K if)Cc x(Et x)(Ef x)
->K if x(Cc x№ xHE{ x) if (Cc xHEt xHEf x)
Далее, если результат оценки (Сс) является истиной, то оценивается (£/х), а если ложь, то оценивается (ffx), однако до этого этапа (Etx) (Efx) помещают без оценки. Другими словами это нс что иное, как ленивое вычисление.
4.7. ПАРАЛЛЕЛЬНАЯ РЕДУКЦИЯ
До сих пор предполагалось, что редукция выполняется последовательно по одному редексу. Однако если выражение содержит несколько редексов, то возможно одновременное редуцирование их. Как уже говорилось выше, функциональная программа отличается от традиционной процедурной программы (если только сохраняется порядок редукции), и поскольку результат работы программы не зависит от того, когда осуществляется редукция редекса, то посредством параллельной редукции всех редексов можно легко увеличить скорость вычислений.
Для реализации параллельной редукции подходит представление в виде графа. Рассмотрим редукцию графов на простом примере. На рис. 4.13, а показан граф выражения (Х(+3 5) (—5 2)), однако для облегчения понимания процесса параллельной редукции графов представим его в виде графа, показанного на рис. 4.13,6. Из этого графа понятно, что части (+3 5) и (—5 2) можно выполнять независимо (параллельно).
В случае параллельной редукции возникает проблема синхронизации операций редукции. Синхронизация — это определение очередности редукции редексов А и В, существующих в выражении. Например, в рассмотренном выше примере редукция (X---) вы-
полняется после завершения редукции частей (+ 3 5) и (—5 2). Кроме того, редукцию (+3 5) и (—5 2) можно выполнять параллельно. Таким образом, возникает проблема управления очередностью выполнения операций редукции. Управление синхронизацией в случае графовой редукции выполняется посредством графа. Например, когда графы (+3 5), (—5 2) перезаписываются в соответствующие вершины, показывающие данные 8, 3, то возникает редукция (Х8 3). Подобный механизм называется инициированием, управляемым данными. Понятие потоковых машин, рассмотренных в гл. 5, основано на управлении данными.
Рис. 4.13. Представление в виде графа выражения (Х(+3 5) (-5 2)).Рис. 4.13. Представление в виде графа выражения (Х(+3 5) (-5 2)).
Рис. 4.13. Представление в виде графа выражения (Х(+3 5) (-5 2)).
Рис. 4.13. Представление в виде графа выражения (Х(+3 5) (-5 2)).
Еще одним большим преимуществом, которым обладает управление синхронизацией с общим графом, является возможность естественной реализации механизма вызова по необходимости, осуществляющего однократное вычисление общего выражения.
Например, при выполнении
(Ax.(if(¥= х 0)(+ х(- х 5))(— б 2)))(Х 2 3)
значение х необходимо в трех местах. Однако в процессе графовой редукции, показанной на рис. 4.14, вычисление (X 2 3) производится при выполнении (=^х0), его результат 6 подставляется вместо графа (Х2 3) и при выполнении (+х(—*5)) используется непосредственно 6.
н*
Редукция графов выполняется в две стадии. Первая называется нисходящей стадией, при этом запрос редукции передается от корневой вершины к листьям. Когда запрос редукции достигает листа, наступает восходящая стадия. На восходящей стадии под управлением данных выполняется редукция в направлении от листьев к корню. Если опустить первую стадию распространения запроса и начать редукцию со
второй стадии под управлением данных, то получим редукцию аппликативного порядка. Как будет показано в гл. 5, потоковые машины начинают выполнение редукции со второй стадии, т. с. это машины, реализующие редукцию аппликативного порядка (в потоковых машинах часть обработки, соответствующая первой стадии, выполняется компилятором и формируется (генерируется) машинный код, управляющий выполнением восходящей стадии (потоковый граф)).
Особенности редукции графов с точки зрения параллельной обработки можно упорядочить следующим образом.
Графовая структура — это структура, которая позволяет выявить редексы для параллельной редук-
ции, поэтому она оптимальна с точки зрения выполнения редукции.
При редукции графов нет необходимости в централизованном управлении операциями редукции (ниже называемыми задачами) каждого редекса, т. с. возможна полностью распределенная обработка.
Связь между задачами и управление синхронизацией можно выполнять полностью унифицированно на основе графа.
Состояние обработки (завершение или продолжение вычислений) определяется непосредственно по состоянию графа (структуре).
Функциональные языки, в основу которых положена параллельная редукция с описанными выше свойствами, по сравнению с традиционными процедурными языками обладают следующими преимуществами с точки зрения параллельной обработки.
В процедурных программах тс фрагменты, которые можно обрабатывать параллельно, необходимо выявить и описать в виде фиксированных задач. Однако в функциональных программах нет необходимости сознательного описания подобных параллельных задач, т. с. в ходе выполнения программы фрагменты, которые можно обрабатывать параллельно (параллельно редуцируемые рсдсксы). извлекаются автоматически и выполняются.
В процедурных программах связь между задачами и управление синхронизацией должен планировать и описывать сам программист, но обычную параллельную программу, в которой множество задач выполняются асинхронно, весьма сложно описать в виде процедурной программы. При параллельной редукции синхронизация между операциями редукции выполняется автоматически (например, при графовой редукции синхронизация выполняется через посредство общего графа), поэтому при описании функциональной программы нет необходимости учитывать связь и синхронизацию подобно тому, как это делается в процедурной программе.
В процедурных языках спецификацию языка необходимо дополнять специальными функциями для синхронизации или (и) специальными языковыми
функциями для описания параллельной обработки, т. е. задач. В функциональных языках в самом описании функций и выражений наряду с фрагментами для параллельной обработки содержится описание связей между ними и синхронизации, поэтому необходимость дополнения функциональных языков средствами описания параллельной обработки отсутствует.
Таким образом, функциональные программы обладают качествами, делающими их пригодными для параллельной обработки, однако необходимо обратить внимание на тот факт, что описание в виде функциональной программы обладает нс только высокой параллельностью. Если в исходном алгоритме отсутствует параллельность, то параллельная обработка невозможна. К типичным алгоритмам, пригодным для параллельной обработки, относятся метод разделения-слияния и метод производителя-потребителя. По первому из этих методов одна задача разбивается на несколько независимых подзадач определенного размера, которые решаются параллельно. Такой подход эффективен, например, при решении проблемы поиска в задачах искусственного интеллекта. Метод производителя-потребителя предполагает четкое разграничение генерации и потребления данных и делает возможной параллельную обработку между производителем и потребителем. Этот метод эффективен в случае производства и потребления больших объемов данных. В сфере искусственного интеллекта примером этого метода является Generate-and-Test (генерация и проверка).
Рассмотрим для примера случаи описания программы, вычисляющей сумму чисел от 1 до 10000 и нс содержащей параллельностей, методами разделения-слияния и производителя-заказчика.
Исходная программа, нс содержащая параллельностей (линейная рекурсивная структура):
sigma / = if (= i 0) 0 (+ i (sigma (— i 1)))
prog = sigma 10000
Программа, написанная по методу разделения- слияния (нелинейная рекурсивная структура):
sigma ij = if (= i j) i
(+(sigma i &) (sigma (+ к 1)/)) к = div (+ i j) 2 prog = sigma 1 10000
Программа, написанная по методу производителя-потребителя (потоковая обработка):
intseq Z = if (= i 10000) nil (cons i (intseq (+ i 1)))
sigma x = if (= x nil) 0 (+ (head x) (sigma (tail x)))
4.8. РЕДУКЦИОННЫЕ МАШИНЫ
Ознакомимся с некоторыми примерами редукционных машин. В частности, рассмотрим G-машину как пример последовательных редукционных машин и машину «Алиса» в качестве примера параллельной редукционной машины. Кроме этих машин существуют также комбинаторные машины, основанные на использовании комбинаторов, и машины с древовидной структурой, выполняющие параллельную редукцию последовательностей (строк) символов, но эти типы машин здесь нс рассмотрены.
G-МАШИНА
G-машина выполняет с высокой скоростью редукцию графов, используя для этого стековый механизм [12]. Несмотря на то что G-машина нс имеет специальных аппаратных средств, се можно создать программным путем на машине, которая с высокой скоростью выполняет операции со стеком (например, машине VAX). Однако для реализации действительно высокоскоростной обработки необходимо разработать специализированные аппаратные средства. В частности, были попытки реализовать аппаратуру G-машины на СБИС методом RISC (компьютер с сокращенным набором команд) [15].
Ниже в простой форме изложен принцип работы G-машины.
G-машина, используя один стек, выполняет редукцию графов, описанную в п. 4.5.2. Рассмотрим в качестве примера процесс выполнения следующего выражения:
(X (+ 5 3)(— 5 2))
В самом начале вычислений вершина стека указывает на верхнюю вершину графа (рис. 4.15, а). Сначала анализируется левая ветвь и в стек помещаются указатели каждой вершины (обратите внимание, что верхняя вершина графа указывает аргумент) (рис. 4.15, б).
Затем выполняется встроенная функция X- В стеке хранятся два аргумента этой функции :(+ 5 3) и (— 5 2), однако они еще нс редуцированы до нормальной формы. Поэтому сначала выполняется редукция этих аргументов.
Выполняется обработка, аналогичная п. (1), для получения нового выражения из (+5 3). Результирующее состояние стека показано на рис. 4.15, в.
Выполняется сложение. На этот раз оба аргумента имеют нормальную форму, поэтому, непосредственно прорсдуцировав (+5 3), получим 8 (см. рис. 4.15,г).
Таким же путем из (—5 2) получаем 3 (рис. 4.15, д).
Выполнив п. (3) — (5), приводим оба аргумента функции X к нормальной форме, поэтому можно выполнить редукцию (Х8 3) и получить результат 24 (рис. 4.15, е).
Обращение к аргументам осуществляется с помощью относительного адреса из некоторой (опорной) позиции в стеке.
Например, в функции
f = ^XxeXye + x у)
формальные параметры х и у определяются соответственно прибавлением 1 и 2 к некоторой опорной точке (позиции) стека А. Следовательно, на графе этой функции листья х и у — это указатели входов стека
А + 1 и А + 2 (опорная точка А стека определяется в ходе выполнения вычислений). На рис. 4.16 пока-
Рис. 4.15. Процесс редукции выражения (Х(+5 3) (—5 2)).Рис. 4.15. Процесс редукции выражения (Х(+5 3) (—5 2)).
Рис. 4.15. Процесс редукции выражения (Х(+5 3) (—5 2)).
Рис. 4.15. Процесс редукции выражения (Х(+5 3) (—5 2)).
Рабочая область в ходе выполнения тела функции f
А + 1
у: А + 2
А + 15А + 28А + 15А + 28Опорный адрес АОпорный адрес А
А + 1
5
А + 2
8
А + 1
5
А + 2
8
Опорный адрес А
Опорный адрес А
Рис. 4.16. Механизм обращения к формальным параметрам.
зан пример применения функции для аргументов 5 и 8 (/5 8).
МАШИНА «АЛИСА»
Параллельная редукционная машина способна одновременно редуцировать множество редексов с помощью множества процессоров. Каждый процессор может быть обычным процессором с последовательным выполнением вычислений. Если используются процессоры последовательного типа, то каждый из них при выполнении одной операции редукции обрабатывает один редекс. Граф, который является объектом редукции, хранится в общей памяти, он изменяется каждый раз при выполнении операции редукции. Другое название графа — пакет.
Например, выполнение функции
f X у Z = (X (+ X y)z),
когда она применяется к аргументам 5 2 8, показано на рис. 4.17, а, а когда она представлена в виде пакетов — на рис. 4.17, б.
Абстрактная структура машины «Алиса» приведена на рис. 4.18. Каждый процессор независимо от других обращается к памяти пакетов, выбирает оттуда редуцируемый пакет, выполняет операцию редукции и помещает ее результат снова в память. Как видим, принцип работы машины довольно прост, однако для реализации такого процесса редукции используются различные приемы.
В частности, для различения состояний редуцируемых пакетов используются три режима: активный, ожидания и останова. Активный режим показывает, что получен пакет, который является объектом редукции. Режим ожидания показывает ожидание прихода аргументов, которые необходимы для выполнения редукции этого пакета. Режим останова показывает, что данный пакет нс имеет никакого отношения к редукции.
Сначала рассмотрим структуру пакета:
Id | Mod | Func | Arg 1 | Arg 2 | ... | Sec |
Id — это идентификатор пакета (его адрес). Например, идентификатор @п показывает, что этот пакет хранится по адресу п.
б
Рис. 4.17. Принцип редукции в машине ’’Алиса”. а — редукция графов; б — редукция пакета.
Рис. 4.18. Абстрактная схема машины ’’Алиса”.
Mod показывает режим, в котором находится пакет. Режимы активный, ожидания и останова обозначаются символами 1, Ф п и ~ соответственно.
Func показывает функцию этого пакета. Можно использовать встроенные функции (+, —, X, / и др.), а также функции, определенные пользователем, и прочие.
Arg указывает аргументы. В качестве аргументов могут быть указатель, указывающий на другой пакет, либо значение (в нормальной форме). Указатель пакета с адресом п обозначается ^п.
Sec — это указатель возврата, который показывает, куда нужно возвратить результат редукции. Указатель m-го поля в пакете с адресом п обозначается | nw т.
Итак, рассмотрим, как выполняется редукция на конкретном примере. Допустим, что функция f определяется следующим образом:
f х У = (Х (+ X уН— X у}}
и рассмотрим выполнение f 4 2. Сначала этот пакет находится в активном режиме:
@a!|f |4|2|
Этот пакет начинает обрабатываться, и функция f видоизменяется следующим образом:
@а!|ХИ Ш Н(1)
@*~| + |4|2|(2)
@с_|_|4|2|-(3)
Затем в активном режиме предпринимается попытка редукции пакета (1), но аргументы X еще нс имеют нормальной формы, поэтому пакет (1) переводится в режим ожидания, а пакеты (2) и (3) — в активный режим:
@a#2|X| I I(Г)
@ г> 11 + I 4 I 2 I ф а. 1 I(2')
@с!|~|4|2|фа. 2|(3')
Имя пакета (1') @a#2 говорит о том, что этот пакет находится в режиме ожидания двух данных (one-
рандов). В это время редуцируются пакеты (2х) и (3х). После этого пакет (Г) снова переходит в активный режим:
@ а ! | X I 6 ] | 2 ]
и в заключение получаем
@а~[/|12|
(здесь I показывает, что этот пакет содержит целочисленные данные). В этом примере вычисления выполняются по необходимости. Иначе говоря, при первой попытке выполнить операцию умножения выполняется редукция «+» и «—» для получения нормальной формы двух аргументов, необходимых для этого. Однако этот процесс можно выполнить и под управлением данных. Если коды тела функции имеют вид
@а#2|Х|1|*(1')
@ И | + | 4 | 2 | ф а. 1 |(2')
@с!|-|4|2|фа.2|(3')
то после раскрытия функции можно сразу же начинать редукцию пакетов «+» и «—».
Пакеты, указывающие данные, также хранятся в памяти пакетов. Пакет, показывающий целочисленные данные п, представляется в формате |7|м|. Структурированные данные, например список cons «а» (cons «&» (cons «с» nil)), представляются в формате
@ п\ | cons | "а” | ф п 2 | |
@ м21 cons | "b" | ф п 3 | ф nl. 2 |
@ иЗ | cons | "с" | ф п 4 | ф м2. 21
@ п4 | nil 11 ф пЗ. 2 |
а матрица [а, 6, с, d] представляется в формате
| Array 4 | а | b | с | d |
Фактически структура машины включает множество банков памяти пакетов, а связь процессоров с банками памяти выполняется через сеть связи, как показано на рис. 4.19. Для того чтобы можно было
ТР1ТР2ТР1ТР2PMUPMUETUETUСеть "Дельта"Сеть "Дельта"
ТР1ТР2
ТР1ТР2
PMU
PMU
ETU
ETU
Сеть "Дельта"
Сеть "Дельта"
Процессоры и пулы пакетовсоединяются через сеть связи
Рис. 4.19. Структура машины ’’Алиса”.
2М-байт память пакетовPMU — блок управленияпакетами
ETU — блок передачи навнешние устройства
PMU и ETU выполнены на базе одного транспьютера
1L
Сеть "Дельта? Рис. 4.20. Структура памяти пакетов.
ТР1-5 — транспьютеры с 1-го по 5-й ERU— блок запроса с внешнего устройства ETU -блок передачи на внешнее устройство PRU — блок записи/чтения пакета
FDU - блок определения функции
Каждый блок выполнен на базе соответствующего транспьютера
Рис. 4.21. Структура процессора.
управлять режимами пакетов, память является непростым запоминающим устройством — она снабжена интеллектуальными функциями. Как показано на рис. 4.20, пакет в каждом режиме разбивается на отдельные области с независимым управлением. Для быстрого выполнения операций с пакетами (т. с. выполнения вычислений, замены пакетов, генерации новых пакетов и т. д.) процессоры, выполняющие редукцию, имеют многопроцессорную структуру, как показано на рис. 4.21. В прототипе машины «Алиса» память пакетов и процессоры были реализованы на основе транспьютеров, разработанных фирмой INMOS (Великобритания).
Глава 5
ПОТОКОВЫЕ МАШИНЫ °
Функциональные языки делают возможным ясное описание программ и естественное описание параллельной обработки, поэтому большие надежды на них возлагались как на средство резкого повышения производительности программного обеспечения [1,2]. Тем нс менее попытки реализовать их на существующих компьютерах нс давали желаемых результатов, поэтому возник вопрос о непригодности этих языков для практического применения. Однако, как уже говорилось в гл. 4, функциональные языки имеют структуру, пригодную для параллельной обработки, и если умело использовать эту особенность, то появится возможность эффективного выполнения программ, а значит, можно будет устранить проблему, связанную с низкой скоростью выполнения.
Потоковые машины имеют очень важное значение с точки зрения архитектуры, которая извлекает внутренний параллелизм функциональных языков и реализует высокоскоростную параллельную обработку.
В данной главе рассмотрена архитектура потоковых машин как архитектура, которая позволяет с высокой скоростью выполнять программы, написанные на функциональном языке, а также структура и отличительные особенности потоковых машин. В частности, внимание уделено описанию параллельной структуре функционального языка и тому, каким образом она выявляется потоковой машиной и используется для выполнения программ.
В данной главе сначала поясняются принцип обработки потоков данных и особенности потоковых машин. Затем рассматривается параллельная структура, которой обладают функциональные языки.
п Другое название — машины, управляемые данными.— Прим. ред.
В частности, описывается связь между рекурсивной обработкой и параллельной обработкой, что является самой главной особенностью функционального языка. Кроме того, описывается связь между символьной обработкой (обработкой списков), которая является основой обработки знаний, и функциональным языком, а также параллельной обработкой. Затем говорится о динамической потоковой архитектуре, используемой для реализации рекурсивной обработки и обработки списков, а также об обработке структурированных данных и обработке, связанной с биографией, обсуждаются способы реализации аппаратных средств динамической потоковой машины.
ПОВОДЫ ДЛЯ РАЗРАБОТКИ ПОТОКОВЫХ МАШИН
Как правило, когда речь идет о мотивах, послуживших толчком к разработке новых архитектур ЭВМ, то называют три основные цели:
повышение производительности ЭВМ,
повышение производительности программного обеспечения,
эффективное использование СБИС-элементов.
Однако почти все ЭВМ, существующие в настоящее время в мире, относятся к так называемым неймановским ЭВМ, т. с. они выполняют вычисления на основе принципа, который определил Дж. фон Нейман. Этот принцип требует, чтобы в центральном узле ЭВМ было устройство управления, содержащее программный счетчик, указывающий текущую команду, чтобы команды (указанные программным счетчиком) последовательно считывались и декодировались по заранее заданному в виде программы алгоритму вычислений, вычисления выполнялись в операционном устройстве и данные последовательно перезаписывались в запоминающее устройство.
Особенности принципа работы машин неймановского типа можно упорядочить следующим образом:
последовательное выполнение программы при централизованном управлении с помощью программного счетчика;
12—1143
обработка данных с перезаписью памяти (и регистров).
При таком способе обработки создать новый компьютер, удовлетворяющий перечисленным выше требованиям, было очень и очень сложно.
Прежде всего при последовательной обработке в неймановской машине скорость обработки определялась быстродействием элементов, что ограничивало производительность ЭВМ. Поэтому для реализации высокой производительности при существующем ограничении на скорость обработки, обусловленной элементной базой, ничего не оставалось, как использовать параллельную обработку.
Кроме того, в программировании, основанном на концепции перезаписи памяти (побочного эффекта), соответствие между переменной и данными, которые являются ее значением, нс обязательно определено однозначно и порядок перезаписи оказывает большое влияние на смысл программы. Это является причиной возникновения ошибок в программе, поэтому при составлении программы нужно быть предельно внимательным. В результате все это приводит к снижению производительности программного обеспечения. В этой связи возникла необходимость отказа от подобной концепции перезаписи памяти и соответствующего алгоритма, а для этого важным является функциональный язык, основанный на понятии функции, показывающей отношения между данными. Кроме того, возникла необходимость в архитектуре ЭВМ, способной эффективно выполнять функциональную программу.
Благодаря небывалому прогрессу в технологии БИС в последние годы появились интегральные схемы со сверхбольшим уровнем интеграции (СБИС). Логическую схему, содержащую несколько сотен тысяч вентилей, удалось разместить на одном кристалле СБИС, однако разработка архитектуры ЭВМ, эффективно использующей множество подобных СБИС- элементов, является отдельной сложной задачей. В централизованной системе неймановского типа, в которой всеми операциями управляет центральное устройство управления, сложно добиться эффектив-
ной работы множества процессоров, поэтому в целях органической связи большого числа СБИС-процессоров и эффективной работы их возникла необходимость в разработке архитектуры, позволяющей несложным путем реализовать высокоскоростную параллельную обработку и распределенную обработку.
Предполагается, что архитектура потоковой ЭВМ отвечает этим требованиям, поэтому повсеместно ведутся разработки и исследования этих архитектур.
ПАРАЛЛЕЛЬНАЯ ОБРАБОТКА
И ФУНКЦИОНАЛЬНЫЙ ЯЗЫК
В качестве удобного описания параллельной обработки подходит описание программы, основанное на понятии функции (отображения). Особенности функциональных программ можно упорядочить следующим образом.
Программа составляется на основе математических функций и алгебраических понятий. Принцип подстановки, характерный для традиционных процедурных языков, отсутствует, и переменные обладают алгебраическими свойствами. Иначе говоря, переменная — это имя, указывающее значение, и ссылка к ячейке памяти нс осуществляется.
Значение функции однозначно определяется значением входного аргумента. Поскольку операция подстановки отсутствует, а следовательно, отсутствует и побочный эффект, то при выполнении некоторой функции на се результаты нс оказывает негативного влияния процесс выполнения другой функции. Следовательно, выполнения функций являются взаимно независимы, а значит, возможна параллельная обработка.
Соединение и синтез функций выполняются просто, и можно использовать концепцию функции высшей ступени, аргументом которой является функция и значением также является функция. Благодаря использованию функций высшей ступени становится возможным простое и четкое описание программы.
При обработке структурированных данных, такйх, как списки, векторы и записи, сами структурированные данные используются в качестве одного 12*
значения. Иначе говоря, аргументом функции являются структурированные данные и в качестве значения также возвращаются структурированные данные. В тех случаях, когда часть структурированных данных модифицируется, генерируются новые данные, в которых модифицируемая часть создастся заново, а остальные части просто дублируются.
Ниже рассмотрен пример функциональной программы.. В этой программе определяются все маршруты от начальной точки (start) до цели (goal) (рис. 5.1). Функция р search (поиск) осуществляет поиск маршрута от точки р до цели, и если таковой найден, то ответом являются сообщение success (успех) и маршрут от точки р до цели (который представлен списком). В противном случае выдаются сообщение failure (отказ) и пустой список (nill). Кроме того, функция try (попытка) управляет поиском для каждого элемента q множества начальных точек.
([а, Ь\ в нижеприведенной программе означает cons(а,6)).
function search (/>) return (message, list) — if ^-"goal” then (“success”, [Д nil]) elsif p=“blackhole” then (“failure”, nil) else (if /—“success” then (t,[p. path]) else (/, path) Where q = successor (/>), (/, path)-try G?)).
function try (q^ return (message, list)
=if null (?) then (“failure”, nil) else {if t— “success" then (/1, [pathl. path2j) else (/2, path2) where (/1, pathl)-search(head (q)), (/2, path2) - try (tail (gW
Рассмотрим несколько подробнее структуру параллельной обработки функциональной программы. Все структуры параллельной обработки можно разделить на два больших класса: параллельного выполнения программы и конвейерного выполнения про-
граммы [4, 6]. Параллельное выполнение возможно в том случае, когда функции взаимно независимы и нс имеют зависимости от данных. Конвейерное выполнение возможно в случаях конвейерной обработки последовательностей данных типа потоков или списков между функциями, имеющими отношения зависимости от данных. В обычной программе параллель
ное и конвейерное выполнения смешаны и она имеет структуру, в которой они переплетены сложным образом.
Параллельное выполнение программы
Параллельная оценка аргументов функции Поскольку аргументы функции нс зависят от данных и взаимно независимы, то возможно параллельное выполнение их оценки.
Параллельная оценка списков или элементов массива
Поскольку списки и элементы массива не зависят от данных и взаимно независимы, то возможны параллельный доступ и их обработка.
Конвейерное выполнение программы
Конвейерная обработка с участием блока, применяющего функцию, и тела функции
Благодаря параллельной оценке аргументов функции заранее определенные значения пересылаются в тело функции и выполняется. ее вычисление, кроме
того, значения, определенные в теле функции, также непосредственно передаются в блок их применения и посредством продолжения выполнения в применяющем блоке становится возможной параллельное выполнение в блоке, применяющем функцию, и теле функции.
Конвейерная обработка, включающая генерацию списков (потоков) или массивов и их использование.
При обработке структурированных данных типа списков или массивов возможно параллельное выполнение на генерирующей и использующей стороне посредством передачи части данных в процессе их генерации (нс ожидая всех структурированных данных) использующей стороне.
Классическим примером параллельной обработки является метод разбиения со слиянием. Например, программа, вычисляющая сумму квадратов чисел от 1 до п, по методу разбиения-слияния имеет следующий вид:
function sigma (z,» return (integer)
= if i=j then i ♦ i
else {sigma (i, k)+sigma (k+1, /)
where k=(/ + /) -r 2}
Кроме того, в предыдущей программе поиска маршрута также возникает эффект разбиения-слияния. Поскольку функции search (head (^)) и try (tail (^)) можно выполнять параллельно, то в ходе выполнения функции try можно повторно выполнять функции search и try. Благодаря тому что функция search выполняется рекурсивно любое число раз, функция поиска выполняется почти параллельно для каждого конечного узла q и узла successor (преемник) и посредством разбиения со слиянием маршруты, в которых узел q является начальным, определяются параллельно.
Классическим примером конвейерной обработки является одновременное выполнение с участием производителя и потребителя. Например, в следующей программе функция consumer (потребитель) и функ-
ция producer (производитель) работают совместно, и когда producer генерирует ряд квадратов чисел 1, 4, 9, 16, 25 ..., то consumer последовательно принимает квадраты чисел, которые являются выходами функции producer, и одновременно вычисляет их сумму.
Рис. 5.2. Потоковая обработка.
Схема этой программы показана на рис. 5.2.
(consumer (х, 0) where х=producer (1)}
* where
function producer (?) return (stream)
=0* ♦ i. producer (j+1)).
function consumer (x, s) return (integer)
= if endof-stream (x) then s
else (consumer (y, s + 0
where (i, y)=x).
Ниже приведен пример параллельной программы, определяющей последовательность простых чисел.
function primnum ( ) return (list)
= {sieve (w) where m=intseq (2)}.
function intseq (?) return (list)
= (/, intseq (? + l)),
function sieve (m) return (list)
= (head (m). sieve (delete (head (m), tail (m)))).
function delete (m, и) return (list)
if remainder (head (и), m)=0
then delete (w, tail (и))
else (head (и), delete (m, tail (и))).
Здесь функция primnum определяет бесконечную последовательность простых чисел.
Функция intseq(Z) генерирует последовательность целых чисел ц /+ 1, ... в виде потока данных, одновременно функция sieve (ап) на входе consumer извлекает по одному данные потока т, начиная с первого, и умножает его на предыдущее число.
ОБРАБАТЫВАЮЩИЕ МОДЕЛИ ПОТОКОВОГО ТИПА
В данном разделе рассматривается, каким образом при помощи потоковой обработки выявляется параллельная структура, которую имеют рассмотренные ранее функциональные программы [4]. Сначала дастся определение потоковой программы, затем упорядочиваются особенности потоковой обработки и демонстрируется, каким образом параллельная структура, которую имеет функциональный язык, преобразуется в потоковую программу.
ОПРЕДЕЛЕНИЕ ПОТОКОВОЙ ПРОГРАММЫ
Потоковая программа описывается в виде ориентированного графа, вершины которого (называемые акторами) показывают операции и управление, а дуги соединяют между собой вершины.
Будем считать, что вершина имеет п входных дуг и т выходных дуг, причем т, п ^ 1. Число входных- выходных дуг вершины определяется в зависимости от способа реализации. Например, если считать, что арифметические операции над комплексными числами входят в элементарные операции (некоторой) вершины, то получается, что система имеет вершину элементарных операций с 4 входами и 2 выходами (см. рис. 5.3, а), а если разложить их еще на операции с вещественными числами, то можно будет реализовать систему с помощью комбинации вершин элементарных операций с двумя входами и одним выходом, как показано на рис. 5.3,6. Обычно вершину с п входами и т выходами можно реализовать при помощи комбинации примитивных вершин, имеющих максимум два входа и выхода. Будем считать,
что примитивными вершинами являются изображенные на рис. 5.4.
Операция примитивной вершины выполняется только при поступлении всех фишек (данных) из входных дуг (это называется активацией вершины). Исключение составляют вершины слияния и арбитража. В случае разделения двух входных дуг одной
ббРис. 5.3. Примеры операций с функциями высших ступеней (сложение комплексных чисел).а — представление в виде вершины элементарной операции; б — представление операции сложения вещественных чисел в виде вершины элементарной операции.Рис. 5.3. Примеры операций с функциями высших ступеней (сложение комплексных чисел).а — представление в виде вершины элементарной операции; б — представление операции сложения вещественных чисел в виде вершины элементарной операции.
б
б
Рис. 5.3. Примеры операций с функциями высших ступеней (сложение комплексных чисел).
а — представление в виде вершины элементарной операции; б — представление операции сложения вещественных чисел в виде вершины элементарной операции.
Рис. 5.3. Примеры операций с функциями высших ступеней (сложение комплексных чисел).
а — представление в виде вершины элементарной операции; б — представление операции сложения вещественных чисел в виде вершины элементарной операции.
вершины одна из них называется левой входной вершиной, а другая — правой входной вершиной. Кроме того, дуга, по которой поступают данные, являющиеся, объектом обработки, называется дугой данных, а дуга, по которой течет поток сигналов управления, называется дугой управления. Одни и тс же данные в зависимости от вершины могут использоваться в качестве объекта обработки и в качестве сигналов управления.
Операционная вершина
Двухвходовая операция: вершина с двумя входами и одним выходом. Входные дуги являются дугами данных. Операции выполняются с данными, поступающими с левой и правой дуг, результат операции выводится через выходную дугу.
Одновходовая операция: вершина с одним входом и одним выходом. Входная дуга является ду-
1 *. Дуга данных
-о— ; Дуга управления
3и
Рис. 5.4. Примитивные вершины.
а — двухвходовая операционная вершина; б — одновходовая операционная вершина; в — вершина ветвления; г — вершина слияния; д — TF-коммутатор; е — Т-коммутатор; ж — F-коммутатор; з — вентиль; и — арбитр.
гой данных. Операция выполняется с входными данными, результат операции выводится через выходную дугу.
К элементарным операциям в зависимости от цели обработки могут относиться операции сравне-
ния, логические операции, операции с целочисленными значениями, операции со строками символов, векторные операции, операции со списками и др.
Вершина ветвления. Вершина с одним входом и двумя выходами. Осуществляются копирование входных данных и вывод их через две выходные дуги. Путем комбинации таких вершин можно строить вершины ветвления с одним входом и т выходами, поэтому в приводимом ниже описании вершины с одним входом и т выходами используются в качестве примитивных.
Вершина слияния. Вершина с двумя входами и одним выходом. Данные поступают только с какого- нибудь одного из двух входов. Входные данные без изменения подаются на выход (так же, как и в случае с вершиной ветвления, вершина слияния с входами и одним выходом используется в качестве примитивной).
Вершина управления.
) TF-коммутатор: вершина с двумя входами и двумя выходами. Левый вход — это дуга данных, а правый — дуга управления (логические данные). Если значение правого входа — истина (Т), то данные левого входа выводятся через левый выход, а если значение правого входа —ложь (F), то они выводятся через правый выход.
) Вентиль: вершина с двумя входами и одним выходом. Левый вход — это дуга данных, а правый вход — дуга управления. Данные левого входа выводятся через выходную дугу.
) Арбитр: вершина с двумя входами и двумя выходами. Все дуги являются дугами данных. Первые прибывшие данные от двух входов выводятся через левую выходную дугу, а другие (прибывшие впоследствии) данные выводятся через правую выходную дугу. Среди остальных вершин только арбитр имеет биографическую зависимость. Кроме того, активация вершины происходит в момент прихода данных с какого-либо одного входа. Потоковая программа представляется с помощью ориентированного
графа, в котором подобные вершины объединены дугами, и имеет несколько входных и выходных портов. Выполнение потоковой программы начинается при поступлении данных в порт ввода, а результат выполнения выводится через порт вывода.
ОСОБЕННОСТИ ПОТОКОВОЙ ОБРАБОТКИ
Обработка при помощи потоковой программы, определенной в предыдущем разделе, называется потоковой обработкой (обработкой, управляемой потоком данных).
Потоковая обработка, судя по определению, данному в предыдущем разделе, базируется на принципе выполнения программы, называемом управлением данными. Принцип управляемости потоком данных гласит: «Все операции выполняются только при наличии всех операндов (данных), необходимых для их выполнения». В программе, используемой для потоковой обработки, описывается нс поток сигналов управления, а поток данных.
Обработка, управляемая потоком данных, исходя из описанного выше принципа, отличается от обработки неймановского типа следующими моментами.
Операцию со всеми операндами (с имеющимися операндами) можно выполнять независимо от состояния других операций, т. с. появляется возможность одновременного выполнения множества операций (параллельная обработка).
Обмен данными между операциями четко определен, поэтому отношение зависимости между операциями обнаруживается легко (функциональная обработка).
Поскольку управление операциями осуществляется посредством передачи данных между ними, то нет необходимости в управлении последовательностью выполнения и, кроме того, нет необходимости в централизованном управлении (распределенная обработка). '
В программе, управляемой потоком данных, нет понятия адреса памяти, поэтому отсутствуют
проблемы, связанные с управлением памятью (исключение понятия адреса).
Ниже будет показано с помощью конкретных примеров, каким образом отражаются эти особенности на выполнении функциональной программы.
СТРУКТУРА ПРОГРАММЫ, УПРАВЛЯЕМОЙ ПОТОКОМ ДАННЫХ
Рассмотрим на простых примерах потоковые программы для простого выражения, условного выражения, итерации, определения и применения функции, которые являются конструктивными элементами функционального языка. Алгоритм преобразования этих выражений в граф потоковой программы здесь нс рассматривается, но это преобразование выполняется просто.
Кроме того, здесь нс приводится детальное описание синтаксиса и семантики функционального языка, однако структура и семантика каждого выражения понимаются легко.
Определение значения и ссылка на значение. Обычно значению, которое определяется выражением, присваивается имя переменной и по этому имени осуществляется ссылка на значение. Допустим, что выражение Е определяет п значений с помощью имени переменной (уцУг, ..., Ум). Тогда имеет место представление
(Уь У2, Уп) = Е<хь .х^
Здесь выражение Е<Х\, ..., хт> показывает операцию с переменными хь ... ,хт.
Представление потоковой программы для определения этих значений показано на рис. 5.5.
Простое выражение. Каждый элемент этого выражения выполняется безусловно. Потоковая программа представляется в виде простого графа, нс имеющего вершин управления. Представление потоковой программы выражения Е с обращением к переменным Xi, х2, .. •, хт показано на рис. 5.6.
Примеры:
{(u, о) where х = а * с — b * d, y = a*d + b*c, и = х^2 + у^2, v = у№
{cons («ь 01)
where (иь п2) = (head (х), tail (х)), (оь 02) = (head (у\ tail (у))}
(х, у) = Ща, b\ g(a, с))
Условное выражение. Выражение выполняется выборочно в зависимости от того, удовлетворяется
Рис. 5.5. Потоковый граф для определения значений.
Рис. 5.6. Потоковый граф простого выражения.
или нет условие. Потоковый граф условного выражения
И P^l^ the” Е1 (У!Уд)
else £2(21* •••» Zm)
имеет вершины с коммутаторами и представляется, как показано на рис. 5.7.
Примеры:-
2 = (if х > 3 then у + 2 else у — 1) * у
if null (х) then у
else cons (head (x), app (tail (x), y)
Итерация. Выполнение итерации представляется с помощью потоковой программы, имеющей цикли-
*1 • • * х*
Рис. 5.7. Потоковый граф условного выражения.
ческую структуру. Обычно итерация имеет следующее представление:
for (хь ..., Хп) initial (еь ..., е^ do
if р(хь .... х„) then Ei(xb .... х„)
else recur (Е2(хь ..., x^)
Потоковая программа такой итерации представлена на рис. 5.8.
Пример:
(remainder, quotient)
= for (х, у, z) initial (/и, 0, n) do
if х > 2 then {recur (и, и, 2)
where и = х — 2, else (х, у)v = y + 1}
Смысл этого выражения состоит в следующем:
х, У» z— это переменные цикла с начальными значе-
ниями /72, 0, п. Пока х > 2, будет выполняться {recur (ц, и, 2) where и = х— 2, u = z/+l}- Здесь recur (u, и, 2) означает повторное выполнение выражения, стоящего после оператора do, с использованием значений и, и, 2 в качестве новых значений х, у, 2.
Определение и применение функции. Что касается выполнения функции, то этот процесс нужно
ei в2 ... ея
Рис. 5.8. Потоковый граф итерации.
разбить на два этапа: определение функции и применение функции. При определении функции ее тело представляется с помощью потоковой программы, входные аргументы которой являются портом ввода, а возвращаемые значения (обычно допускается множество значений) — портом вывода. Применение функции представляется вершиной Apply (применение), для которой имя функции и входные аргументы являются входными дугами, а значение функции — выходной дугой. Входные-выходные дуги вершины Apply соответствуют положению входных-выходных портов тела применяемой функции, а сама вершина Apply является моделью (template) тела функции. Когда в вершину Apply поступают входные значения функции, она подставляет их в тело функции и начинает ее выполнение.
Определение функции включает определение имени функции, входных аргументов, числа выходных данных и типа данных.
Определение функции:
function F (хь ..., х^ return (typeh ...
• •typen) = £{хь ..., Xm)
Применение функции:
F(eb .... em)
Соответствующая потоковая программа приведена на рис. 5.9.
Рис. 5.9. Потоковые графы для определения и применения функции.а — определение функции; б —применение функции.Рис. 5.9. Потоковые графы для определения и применения функции.а — определение функции; б —применение функции.
Рис. 5.9. Потоковые графы для определения и применения функции.
а — определение функции; б —применение функции.
Рис. 5.9. Потоковые графы для определения и применения функции.
а — определение функции; б —применение функции.
Примеры:.
Определение функции:
function F (х, (/) return (real, real)
= {(u, и) where и = x + у, -и = x — у^
Применение функции:
(хь х2) = F (а, b)'
Рекурсивная функция. Функция, в теле которой применяется сама эта функция, называется рекурсивной, а потоковая программа рекурсивной функции называется программой с рекурсивной структурой. Среди рекурсивных функций различают непосредственную рекурсию (когда в теле функции непосредственно используется сама функция) и косвенную 13—1145'
рекурсию (когда в теле функции, используемой для определения данной функции, используется сама функция). Кроме того, рекурсивные структуры разделяют на заключительную рекурсию (когда функция использует сама себя после окончания обработки) и встроенную рекурсию (когда функция себя использует в процессе обработки).
Например, функция search, рассмотренная в разд. 5.2, является косвенно рекурсивной через функцию try, а функция try включает заключительную рекурсию. В функциональных программах понятия рекурсивной функции и рекурсивных функций высших ступеней являются особенно важными (в настоящее время нс найдено эффективных способов реализации функций высших ступеней на потоковых машинах, однако в этом нет практической необходимости. Поэтому большинство функциональных языков, имеющих отношение к потоковым машинам, нс содержат функций высших ступеней [7—11]. В связи с этим в настоящей книге эти функции не рассматриваются).
Пример. Функция Аккермана
function Ackman (m, n) return (integer)
= if m = 0 then n + 1
else if n = 0 then Ackman (rn — 1, 1)
else Ackman (m — 1, Ackman (m, n — 1))
ПОНЯТИЯ ЗАПУСКА ФУНКЦИИ
И СВЕРХМУЛЬТИОБРАБОТКИ
ЗАПУСК ФУНКЦИИ В СРЕДЕ ПАРАЛЛЕЛЬНОЙ ОБРАБОТКИ
В среде параллельной обработки, каковой является, например, метод разбиения-слияния, одна и та же функция может быть активирована в нескольких местах и выполняться параллельно. Следовательно, для параллельной работы этих активаторов необходимо в каждом из них сделать логическую копию тела функции. Кроме того, при выполнении рекурсивной функции для реализации параллельной
обработки в гнездовой структуре рекурсий также необходима копия.
Вопрос, каким образом реализовать физически понятие копии тела функции, определяется компромиссом между стоимостью аппаратных средств, с одной стороны, и производительностью и функциональными возможностями машины — с другой.
Для решения этого вопроса предлагаются следующие пути.
Способ копирования кода: для каждого активатора делается полная копия кода тела функции.
Способ с общим кодом (способ цветной фишки): каждому экземпляру (активатору) присваивается имя (называемое именем экземпляра или цветом), которое разделяет среду обработки для различных данных, а физически означает использование общего кода для активаторов. Управление генерацией, присваиванием и удалением цвета осуществляется при выполнении функции.
Способ с общим кодом (статический способ): аналогичен способу (2), за исключением того, что управление цветом осуществляется при компиляции, что устраняет издержки при динамическом управлении цветом.
Способ (3) эффективен в тех случаях, когда основное внимание уделяется производительности, например сверхскоростному выполнению вычислений [12, 13]. Однако этот способ накладывает существенные ограничения на функциональные возможности, например, он нс допускает использования программ с рекурсивной структурой. Этот способ соответствует статической архитектуре системы цветных фишек. В отличие от него способ (2) соответствует динамической архитектуре системы цветных фишек [14—17]. Поскольку управление цветом осуществляется динамически, то в данном случае возможно выполнение рекурсивной функции, за исключением функций высших ступеней. Ключевым моментом этого способа является эффективная реализация динамического управления цветом (генерация, удаление, изменение). По способу (1) полностью копируется функциональный код, поэтому, считая этот код 13* '
объектом обработки, можно динамически определять и использовать результаты частичного выполнения функции в качестве новой функции, а также выполнять функции высших ступеней.
Способ (1) в зависимости от способа распределения памяти, хранящей код, можно разделить на ^а) способ распределения ячеек памяти для каждой команды в программе и (б) способ распределения блоков памяти для нескольких команд или для каждой функции. По способу (а) управление возможно для каждой ячейки, и поскольку нет разбиения на блоки, как в способе (б), то возможно получение полной копии кода. Однако здесь возникает проблема издержки при управлении памятью и адресации. По способу (б) активатор разбивается на адреса блоков и адрес каждой команды задастся в виде «адрес блока + адрес внутри блока». Понятие адреса блока близко к понятию общего кода (2). Фактически если извлечь из ячейки команды поле операнда и построить новую память (память операндов), а также сократить размер памяти за счет использования механизма ассоциативного доступа, то получим способ (2).
Далее обсуждение будет продолжено с учетом идеи динамической архитектуры с общим кодом (2), использующей ассоциативный доступ.
МЕХАНИЗМ ЗАПУСКА ФУНКЦИИ
Механизм применения функции
(Уь Уг, Ут) = Цех, е2, .... е„)
показан на рис. 5.10. Потоковый граф стороны, использующей функцию, общий вид которого показан на рис. 5.10, а, более детально изображен на рис. 5.10,6. В нижеследующем описании формат фишки будет иметь представление (активатор, значение). Вершина запуска функции call инициируется сигналом запуска sig. Допустим, к примеру, что в активаторе in произошел запуск функции. При этом вершина call генерирует новое имя активатора (цвет) in' функции f и фишка <1п, 1п'> передается вершинам
link, rlink. Вершины rlink, входами которых являются имя вершины yi (/= 1, 2, ..., /и) применения функции и имя активатора in', вырабатывают фишки <rn', </n, у Г» и передают их в порты О/ программы тела функции. При этом имя активатора in на использующей стороне и адрес результата передаются
Рис. 5.10. Механизм запуска функции.Рис. 5.10. Механизм запуска функции.а — применение функции; б — развернутый вид.а — применение функции; б — развернутый вид.
Рис. 5.10. Механизм запуска функции.
Рис. 5.10. Механизм запуска функции.
а — применение функции; б — развернутый вид.
а — применение функции; б — развернутый вид.
вершине return тела функции, которая при этом активируется. Вершины link каждый раз при поступлении значения аргумента х/ (/= 1, 2, ..., п) вырабатывают фишки <in\ х^ и передают их в порты I, тела функции.
Вершины return передают значения ик (&= 1, ... ..., т^ определенные в теле функции, вершинам ук активатора in. Вершина rins инициируется только после выполнения операций во всех вершинах return и возвращает в систему (машину) текущее имя активатора in'.
Посредством описанного выше механизма возможна реализация обмена данными между активаторами
в блоках, применяющих функцию, и новыми активаторами.
Обратите внимание на тот факт, что благодаря этому механизму становятся возможными
параллельная оценка аргументов функции и
параллельное выполнение в блоке, применяющем функцию, и в теле функции [18].
Если вместо активатора функции рассмотреть процессы, работающие под управлением традиционной операционной системы (ОС), каждому процессу присвоить имя и блоки данных для каждого процесса различать по этим именам и составить общую программу, то понятие мультиобработки (мультипрограммирования) в традиционной среде ОС будет в точности соответствовать понятию цветной фишки. Кроме того, поскольку для каждого активатора функции генерируются параллельные процессы, то единица параллельных процессов (называемая гранулярностью) будет гораздо меньше, чем в случае традиционной ОС, и число параллельных процессов увеличится. В этом смысле понятие обработки, управляемой потоком данных, является более глубоким, чем понятие мультиобработки, поэтому ее еще называют сверхмультиобработкой [4, 19].
ЦИКЛИЧЕСКОЕ ВЫПОЛНЕНИЕ ФУНКЦИЙ С ЗАКЛЮЧИТЕЛЬНОЙ РЕКУРСИЕЙ
Программу с заключительной рекурсивной структурой, показанную на рис. 5.11, а, можно преобразовать в эквивалентную ей программу с циклической структурой (см. рис. 5.11,6). Вершина slink, показанная на рис. 5.11,6, соответствует вершине link, за исключением того момента, что начало перемещения фишки является фиксированным. Кроме того, вершина nins служит только для генерации нового имени активатора.
В рекурсивной функции активатор создастся только в гнездовой структуре рекурсии, и эти активаторы ожидают выполнения до возвращения значений от активаторов (нижнего уровня), запущенных ими. При заключительной рекурсии значение, поступившее от
Рис. 5.11. Циклическое выполнение функции с заключительной редукцией (u = f(u0)). а — функция заключительной рекурсии; б — циклическое выполнение.Рис. 5.11. Циклическое выполнение функции с заключительной редукцией (u = f(u0)). а — функция заключительной рекурсии; б — циклическое выполнение.
Рис. 5.11. Циклическое выполнение функции с заключительной редукцией (u = f(u0)). а — функция заключительной рекурсии; б — циклическое выполнение.
Рис. 5.11. Циклическое выполнение функции с заключительной редукцией (u = f(u0)). а — функция заключительной рекурсии; б — циклическое выполнение.
активатора нижнего уровня, никогда не обрабатывается, а лишь передается на активатор верхнего уровня. Следовательно, если активатор верхнего уровня передает адрес значения на нижний уровень, то, нс ожидая результата от активатора нижнего уровня, он самостоятельно завершает обработку и может возвратить в систему собственное имя. Благодаря этому даже при глубокой гнездовой рекурсивной структуре вычисления можно выполнять без труда, используя всего лишь имя активатора.
Аналогичный эффект можно получить и для функций, допускающих нсстрогость в заключительных операциях (рекурсии), например при обработке структурированных данных, описанной в следующем разделе.
БИОГРАФИЧЕСКАЯ ЗАВИСИМОСТЬ
И ОБРАБОТКА СТРУКТУРИРОВАННЫХ ДАННЫХ
ОБРАБОТКА СТРУКТУРИРОВАННЫХ ДАННЫХ
Рансе указывалось, что отличительной особенностью функциональных языков является обработка структурированных данных типа списков и массивов как одного значения. В потоковых машинах также обрабатываются структурированные данные, им соответствует фишка, представляющая собой значение подобной структуры.
Структурированные данные имеют рекурсивную структуру и обычно представляются в древовидной форме. Вершинам этого дерева соответствуют значения, а ветвям присваиваются имена. Значениями являются атомарные данные или структурированные данные, например целые и вещественные числа, символы и т. д. Различные структурированные данные, например массивы, списки и т. п., рассматриваются с точки зрения особенностей этой структуры. Обработка данных, имеющих рекурсивную структуру, может быть описана просто, с помощью рекурсивной функции. При обработке массивов и обработке спи-
сков (если в деталях выполняемые операции расходятся) используются одни и тс же основные идеи (подробности см. * в гл. (4)).
Сначала рассмотрим обработку данных списка.
Среди элементарных операций [20] обработки списков только cons генерирует новые ячейки для сохранения данных списка, в которые записываются значение head (указатель левой ветви, который в терминологии языка Лисп называется значением саг) и значение tail (указатель правой ветви, соответствует значению cdr). Все остальные операции только обращаются к содержимому (head, tail) этой ячейки, но нс изменяют его. Следовательно, если в программе, состоящей из таких элементарных операций, входное значение определено, то выходное значение будет определено однозначно. Даже в том случае, когда изменяется часть данных списка, генерируется новая структура (значение), отличная от этой части.
Внедрение управления с помощью потока данных в обработку списка имеет следующие преимущества [17, 18].
Благодаря поддерживающей функциональность обработке списка логично появляется возможность добиться высокоскоростной параллельной обработки.
Различные примитивные операции можно выполнять лишь на основании отношений, зависящих от данных, поэтому наблюдается хорошая совместимость с потоковой машиной.
Параллельное выполнение функций при обработке списков можно реализовать при помощи управления потоком данных.
Возможна конвейеризация процессов управления потоком данных и операций с памятью при обработке списков.
Нужно отмстить, что при обработке структурированных данных типа списков можно запараллелить выполнение функций генерирующей стороны и использующей стороны путем передачи части сгенерированных структурированных данных в функцию использующей стороны (это называется «энергичным»
вычислением1) структурированных данных [18, 21, 22]). В частности, посредством «энергичного» вычисления можно реализовать концепцию потоковой обработки [23—25] при обработке списков.
Концепцию «энергичного» вычисления списка можно реализовать с помощью механизма lenient
Рис. 5.12. Реализация механизма.
cons [18]. Этот механизм в отличие от обычного механизма cons сначала сохраняет ячейку cons, а затем возвращает эту ячейку в качестве значения cons (при этом значения полей head и tail можно нс определять). Запись значений head и tail ячейки cons выполняется в момент определения этих значений. Для управления синхронизацией считывания/за- писи используется тег, которым снабжается ячейка памяти (способ управления синхронизацией при помощи тега используется и для данных массива [26]). На рис. 5.12 показан способ реализации механизма lenient cons. Вершина cons (х, у) разделяется на три примитивные вершины: get cell, write car, write cdr,
n Иначе говоря, вычисления в этом случае производятся не тогда, когда в них есть необходимость, а загодя, когда имеется возможность.—Прим. ред.
в ячейке данных помимо тега garbage (мусор) имеется тег ready (готовность), показывающий поступление значения. Когда операция вершины getcell запускается фишкой signal (сигнал), то создастся новая ячейка и се адрес передастся вершине, ожидающей результата cons, и вершинам write саг и write cdr. В момент выборки ячейки (get cell) теги head, tail ц ready сбрасываются и доступ к этой ячейке запрещается. Вершины write саг и write cdr инициируются только по прибытии операндов, операнды записываются в поля head или tail и посредством установки тега ready аннулируется запрет на доступ. Фишка signal, которая является сигналом запуска операции выборки ячейки (get cell), генерируется при открытии функции, включающей эту вершину cons, или блока.
В механизме lenient cons даже в том случае, когда значения head и tail определяются активатором низкого уровня, значение cons передается заранее, без ожидания прихода этих значений, что позволяет завершить обработку, поэтому механизм при обработке функций, расположенных в поле tail, позволяет выполнять без труда обработку при любой глубине гнездовой структуры рекурсии аналогично случаю с функцией заключительной рекурсии. Это имеет большое значение, например, при обработке бесконечной последовательности данных (потока данных) [6, 25].
При обработке структурированных данных типа массива вместо вершин get cell, write car (writecdr), car (cdr) используются соответственно вершины get- array-area, write-element, read-element.
Вершина get-array-area (n) генерирует область массива размером п (вектор) и передает ее в качестве значения. Вершина write-element (я,/, v) устанавливает значение и в ячейке /-го элемента массива а и, когда установка завершена, передает сигнал done (обслужено) в качестве значения.
Вершина read-element (а,/) считывает значение ячейки /-го элемента массива (рис. 5.13).
В момент установки области массива тег ready каждой ячейки элемента массива сбрасывается,
Рис. 5.13. Обработка данных массива.
Рис. 5.14. Программа функции.
а устанавливается он при выполнении операции записи элемента (вершина write-element). Операция считывания элемента в массив (read-element) задерживается до установления этого тега.
Потоковая программа функции, определяющей сумму векторов с использованием массива данных, которая имеет вид
function vect^tim (и, и, n) return (vector)
= {for(f) initial (0) do if i = n then w
else {recur (Z + 1)
where write_element (ty, Z, и (Z) + и (Z))}
where w = get__array_area (n)
показана на рис. 5.14.
СПОСОБ РЕАЛИЗАЦИИ СОСТОЯНИЯ
В простом принципе управления данными в том случае, когда активизируется вершина, фишка на входной дуге гасится, но если несколько расширить этот принцип, то можно сделать так, что фишка будет сохраняться на входной дуге даже после акти-
Рис. 5.15. Перманентная дуга.
визации вершины [13]. Такая дуга называется перманентной дугой и обозначается символом О, как показано на рис. 5.15. Вершина с перманентной дугой имеет собственное состояние. Если в качестве перманентной дуги использовать, например, константу цикла, то можно увеличить эффективность обработки (перманентные дуги, показанные на рис. 5.14, сохраняют имя вектора и верхнее предельное значение индекса в ходе выполнения цикла).
УПРАВЛЕНИЕ ПОСЛЕДОВАТЕЛЬНОСТЬЮ ВВОДА-ВЫВОДА
Для управления последовательностью, например, ввода-вывода, используются сигналы [4]. Для при*
о9
аб
Рис. 5.16. Вершины примитивных операций ввода-вывода.a — ввод; б — вывод.
Рис. 5.17. Пример выполнения операции ввода-вывода.Рис. 5.17. Пример выполнения операции ввода-вывода.
Рис. 5.17. Пример выполнения операции ввода-вывода.
Рис. 5.17. Пример выполнения операции ввода-вывода.
мера примитивные вершины, соответствующие вводу- выводу с телетайпа
и = input (s),
s = output (и),
показаны на рис. 5.16. Вершина input (ввод) управляется сигналами s, считывает данные из телетайпа и передает их в качестве значения и. Это значение может быть использовано как сигнал для управления следующей вершиной ввода.
Вершина output (вывод) после окончания вывода передает сигнал окончания и. На рис. 5.17 показан граф программы, определяющей сумму п входных данных и выводящей это значение.
ОБРАБОТКА НЕОПРЕДЕЛЕННОСТЕЙ И АРБИТР
В случае когда данные вводятся с нескольких терминалов, невозможно заранее предугадать, с какого терминала данные будут введены в первую очередь.
Рис. 5.18. Программа размещения данных в порядке их поступРис. 5.18. Программа размещения данных в порядке их поступления.ления.
Рис. 5.18. Программа размещения данных в порядке их поступ
Рис. 5.18. Программа размещения данных в порядке их поступ
ления.
ления.
Для правильного обслуживания этих терминалов необходима нс только функция разделения данных от фиксированных правых и левых дуг, но также и функция разделения на ранее введенные данные и данные, введенные позже. Для реализации этой функции необходима в свою очередь специальная примитивная вершина, учитывающая биографическую зависимость.
Арбитражная вершина, определение которой было дано в разд. 5.3.1, работает следующим образом: первые введенные данные сразу выводятся на л,е- вую выходную дугу, а следующие введенные данные
выводятся на правую выходную дугу. Используя такие арбитры, можно организовать вывод данных в порядке их поступления, например с четырех входов (см. рис. 5.18).
В том случае, когда множество данных расположено в одной последовательности, можно использовать понятие потока данных. Например, для правильного обращения с командами, вводимыми с множества терминалов, необходима функция образования потока (последовательности) команд (функция слияния). Это можно организовать при помощи следующей программы (функции) слияния двух потоков с использованием арбитра (обратите внимание на тот факт, что в данном примере имеется ввиду-бесконечный поток):
function merge (х, t/) return (stream)
= {lenientcons (head (u), merge (tail (u), u)
where (u, u) = Arbit(x, z/)}
АППАРАТНЫЕ СРЕДСТВА ПОТОКОВЫХ МАШИН .
Рассмотрим способы реализации аппаратуры обрабатывающих моделей, управляемых потоком данных, которые были описаны в разд. 5.3—5.5. Из обсуждения, которое велось до сих пор, следует, что в потоковой программе можно описывать всевозможные структуры параллельной обработки. Аппаратные средства потоковых машин нужно проектировать таким образом, чтобы за счет разумного использования подобных обрабатывающих структур можно было повысить производительность. При проектировании потоковых машин особое внимание уделяется следующим моментам.
Процессоры и банки памяти, соединенные параллельно, должны иметь высокую степень автономности, и скорость обработки нужно повышать за счет их параллельного независимого функционирования.
. (2) Производительность можно повысить посредством конвейеризации модулей процессоров и памяти и эксплуатации их в максимальном режиме.
Повысить быстродействие средств памяти для высокоэффективной и скоростной обработки структурированных данных типа списков и массивов.
Обсудим способы реализации аппаратных средств потоковых машин, исходя из перечисленных выше соображений. Нс вдаваясь в подробности сравнения характеристик существующих в настоящее время реальных машин, рассмотрим пример виртуальной машины с динамической архитектурой, позволяющей обрабатывать рекурсивную структуру, и обсудим способы се реализации.
ПРИНЦИП ОРГАНИЗАЦИИ АППАРАТНЫХ СРЕДСТВ
В случае потоковых машин также используется принцип хранимой программы, и машинное слово представляется в виде графа потока данных. Граф потоковой программы в свою очередь можно представить с помощью структуры списка связей. Например, граф потоковой программы, показанный на рис. 5.19, а, хранится в памяти в виде таблицы, показанной на рис. 5.19,6.
Принципиальная схема потоковой машины включает блок управления (CS—control section), в котором хранится потоковый граф и который используется для выборки выполнимых команд, и функциональный блок (FS), выполняющий команду, переданную из CS, и возвращающий результат ее выполнения в CS. Блоки CS и FS, как показано на рис. 5.20, работают асинхронно и параллельно, обмениваясь многочисленными пакетами команд и результатами их выполнения. В пакете результата из блока FS указывается адрес команды (адрес назначения, обозначаемый des), использующий этот пакет. На основании этого адреса блок CS проверяет возможность выполнения этой команды. Команды обычно бывают одно- операндные или двухоперандные. В случае двухопе- рандной команды необходимо подтверждение наличия двух операндов, и для этого устанавливается тег t.
В принципиальной структуре активатор функции создастся путем копирования кода. Блок управления 14—1145
орсoprlорг2destag
саг
/
dup
eq, 6j
0,1
null
62
0,1
TF
itCV
0,1
dup
dv» ?i
0,1
саг
/1
0,1
cdr
j
0,1
cons
к
0,1
б
Рис. 5.19. Пример формы хранения потоковой программы.
а —потоковый граф; б — память функционального блока, орс: код команды, орг!, орг2: поле операнда: des: адрес назначения; tag: тег поступления данных (2 бита). *
загрузкой (LC) каждый раз при активизировании функции загружает из памяти программ ее код (LC
Рис. 5.20. Принципиальная структура потоковой машины.
управляет пустыми ячейками в блоке для кодирования кода).
МУЛЬТИПЛЕКСИРОВАНИЕ БЛОКА УПРАВЛЕНИЯ И ФУНКЦИОНАЛЬНОГО БЛОКА
В структуре, показанной на рис. 5.20, можно ожидать только параллельное функционирование блоков CS и FS. Здесь рассматриваются методы повышения степени параллелизма посредством мультиплексирования блоков CS и FS.
Мультиплексирование может быть выполнено следующими способами.
* Полностью распределенная система (рис. 5.21, а): если адрес назначения указывается в форме <имя блока CS + адрес внутри CS>, то это полный адрес и графы потоковой программы можно распределить между всеми блоками CS. Кроме того, путем унификации функций блоков FS можно распределить их нагрузку.
Система, использующая локальность (рис. 5.21,6): конвейер, состоящий из блоков CS—FS, принимается за обрабатывающую единицу (которая называется процессорным элементом, ПЭ) и из таких 14*
единиц строится мультиплексированная структура. Для каждого ПЭ назначается локальный программный объект (например, тело функции). Каждый функциональный блок FS имеет средства связи между процессорными элементами (в частности, связи
б
Рис. 5.21. Примеры мультиплексирования блоков CS и FS.
а — полностью распределенная система; б — система с использованиемлокальности.
для обмена параметрами, требуемыми при выполнении функций в тех случаях, когда существует распределение функций).
В настоящее время большинство машин, в частности Массачусетсского технологического института (МТИ) [14, 27], Манчестерского университета [28] и т. д., выполнено на основе первого метода. Недостаток этого метода заключается в задержке пере-
дачи данных, вызванной наличием сети — обязательного компонента для передачи пакетов между блоками FS и CS. Однако в основе архитектуры потоковых машин лежит передача пакетов между блоками,
(РЕ- процессорный. МЕМ - память) элемент.
Рис. 5.22. Пример сетевой структуры (сеть с передачей пакетов). Используется соединение типа процессор — память; любые процессоры и блоки памяти расположены на равном расстоянии; распределение доступа к памяти (коммутатор имеет функцию управления нагрузкой).
и поскольку это система, высокая производительность которой достигается за счет высокоуровневом конвейерной обработки, то упомянутая выше проблема является не столь важной. Для решения этой проблемы был использован метод локальности (2), целью которого является устранение. суммарной
задержки при передаче пакетов [17]. Рассматриваются также иерархические системы, объединяющие системы этих двух типов [12, 19].
СЕТЕВАЯ СТРУКТУРА
Итак, как было сказано выше, основой потоковых машин являются пакетные передачи [29]. Следовательно, в качестве сети, соединяющей между собой блоки FS, CS или ПЭ, подходит сеть маршрутизации с многоуровневой комбинацией пакетных коммутаторов типа 4 X 4 (в принципе можно 2X2), как показано на рис. 5.22. В данной структуре дальность пакетных передач между аппаратными модулями одинакова, поэтому требуются одинаковые затраты на передачу сообщения. Для обеспечения этого в системе (2) (см. (5.6.2)), осуществляющей распределение функций, учитывается расстояние между ПЭ и используется либо сеть связи матричного типа [30], реализующая логическую древовидную структуру либо сеть, структура которой показана на рис. 5.23.
СТРУКТУРА БЛОКА УПРАВЛЕНИЯ
Недостатком способа копирования кода в структуре, изображенной на рис. 6.20, как уже упоминалось в разд. 5.6.3, являются издержки, связанные с загрузкой кода. Для их сокращения предлагается метод цветной фишки с общим кодом, который к тому же позволяет эффективно использовать память. В системе с общим кодом предполагается, что к моменту выполнения код программы уже загружен в память, поэтому необходимость в блоке LC отпадает.
Разделение на память команд и память операндов.
' Из ячеек команд, хранящихся в основной структуре, извлекаются поля операндов и они организуются в виде отдельной памяти. Иначе говоря, осуществляется разделение на скелет потокового графа и память для хранения операндов (первый называется памятью команд (ПК), а второй — памятью операндов (ПО)). Память команд — это память только для
Коммутатор пакетовКоммутатор пакетовХарактеристики коммутатора типа 4x4
Коммутатор пакетов
Коммутатор пакетов
Параллельная передача 32 бит
Число выводов: 276 (32 х 8 + 20)
Время коммутации : 180 нс
Скорость передачи
Пример структуры с 32 процессорными элементами (РЕ)Пример структуры с 32 процессорными элементами (РЕ)Рис. 5.23. Пример сети связи между процессорными элементами (ПЭ).Рис. 5.23. Пример сети связи между процессорными элементами (ПЭ).пакетов: 128 бит/пакет = 720 нс (180 х 4)
Пример структуры с 32 процессорными элементами (РЕ)
Пример структуры с 32 процессорными элементами (РЕ)
Рис. 5.23. Пример сети связи между процессорными элементами (ПЭ).
Рис. 5.23. Пример сети связи между процессорными элементами (ПЭ).
чтения, т. е. без перезаписи в процессе выполнения программы. Память операндов может быть использована в качестве регистра данных, поэтому необходимо иметь быстрый доступ к этой памяти.
6
Рис. 5.24. Хранение программы в памяти команд.
а — потоковый граф (без вершины dup); б — пример структуры памятиchaini, chain2 — цепи начала ветвления (указатели); des—адрес назначения (указатель); ах указывает поле chaini в адресе а.
Что касается способов соединения ПК и ПО, то здесь могут быть три варианта: (1) ПК расположена после ПО, (2) ПК и ПО расположены параллельно и (3) ПО расположена после ПК. В первом случае сначала осуществляется проверка выполнимости, а затем код команды считывается из ПК. Второй вариант имеет целью снижение числа каскадов циклического конвейера [31]. Третий вариант позволяет придать гибкость управлению памятью операндов за счет упреждающей выборки памяти команд. Кроме того, путем размещения внутри ПК лексем можно обойтись без команды dup [32]. При обработке, требующей информации о состоянии, например для сохранения постоянных циклов, операций арбитража и т. д. [4, 13, 25], эта информация должна храниться в памяти операндов. Данная управляющая информация задастся в качестве атрибута операнда в коде команды и пересылается в ПО. Что касается устранения команды dup, то эту проблему можно решить путем сцепления узлов лексем (команд) внутри ПК, как показано на рис. 5.24.
СПОСОБЫ ОРГАНИЗАЦИИ ПАМЯТИ ОПЕРАНДОВ
Рассмотрим следующие три способа.
ПО организуется из множества блоков и для каждого активатора отводится свой блок. В данном случае номер блока ПО является именем активатора (блоки ПО являются динамически распределяемыми). Кроме того, в этом случае ПК разбивается на блоки, каждому блод<у присваивается функциональный код и доступ выполняется в том случае, когда адрес внутри блока ПО совпадает с локальным в блоке ПК адресом команды для заданного функционального кода внутри ПК [33].
Для сокращения размера блока памяти операндов (см. п. 1) используется метод ассоциативного доступа к блокам ПО. При этом нет необходимости в разбиении ПК на блоки, т. с. распределение выполняется свободно и каждый функциональный код можно пересылать в любое место памяти команд. Для
ассоциативного доступа используется ключ (адрес команды в ПК) [17] (см. рис. 5.25).
ПО не разбивается на блоки и ассоциативный поиск осуществляется во всей области ПК. Ключом для ассоциативного доступа является (имя активатора + адрес команды).
В.первом случае доступ к ПО осуществляется как к обычному ОЗУ, однако необходима большая ем-
Память операндов
Рис. 5.25. Пример блочной структуры памяти операндов. При доступе к памяти операндов номер блока декодируется по имени активатора In, а ассоциативный поиск внутри блока выполняется по имени вершины /.
кость памяти. В третьем способе в качестве механизма ассоциативного доступа используется метод хэширования [15, 31], но здесь имеется проблема издержек при ассоциативном доступе. Во втором варианте используется смешанный способ доступа по адресу и ассоциативного доступа, и хотя по сравнению с вариантом (3) он позволяет несколько снизить неэффективность разбиения на блоки, тем нс менее он обладает обоими упомянутыми выше недостатками. Для решения проблемы переполнения блоков при выполнении программы используется расширенный блок в виде дерева.
СТРУКТУРА ФУНКЦИОНАЛЬНОГО БЛОКА
Для увеличения быстродействия функционального блока можно использовать мультиплексированную структуру, если в этом есть необходимость. Мультиплексирование может быть следующих двух разновидностей: с распределением нагрузки и распределением функций. В системе с распределением функций параллельно расположены различные специализированные устройства, например для выполнения операций с численными значениями, операций пропускания, переключения, управления запуском функций, ввода-вывода, запоминания структурированных данных и т. п. (рис. 5.26).
АРХИТЕКТУРА ПАМЯТИ СТРУКТУРИРОВАННЫХ ДАННЫХ
Память структурированных данных (или память структур, ПС) расположена в качестве специализированного устройства внутри функционального блока (однако изучается вариант расположения ПС вне функционального блока для динамического управления программой [34]). При обработке структурированных данных используется специальная память, снабженная функциями для операций со структурированными данными. Рассмотрим работу ПС для данных списков, чтобы продолжить связь с изложением разд. 5.5.1.
С помощью механизма lenient-cons можно логически организовать высокоуровневую параллельную обработку [18, 21]. Для того чтобы этот эффект был ощутим физически, каждую ячейку памяти снабжают операционным блоком и организуют параллельный доступ к ним. Однако для реализации подобной концепции логической памяти необходимо найти компромиссное решение относительно ее стоимости.
Для мультиплексирования ПС предлагаются следующие три способа.
ПС организуется в виде множества банков, каждый из которых соединяется с каждым ПЭ маршрутом одинаковой длины с помощью сети маршрутизации. Таким образом, за счет распределения доступа устраняется проблема конфликтов.
Память командПамять командПамять операндовПамять операндовРис. 5.26. Структура функционального блока (система с распределением функций) (на рисунке также изображена часть блока управления).Рис. 5.26. Структура функционального блока (система с распределением функций) (на рисунке также изображена часть блока управления).
Память команд
Память команд
Память операндов
Память операндов
Рис. 5.26. Структура функционального блока (система с распределением функций) (на рисунке также изображена часть блока управления).
Рис. 5.26. Структура функционального блока (система с распределением функций) (на рисунке также изображена часть блока управления).
Банк ПС используется в качестве локальной памяти каждого ПЭ. В этом случае список данных не может находиться в общем пользовании функций,
поэтому каждый раз при применении функции необходимо делать копию данных.
Комбинация первых двух способов. Другими словами, банки ПС используются в качестве локальных ЗУ процессорных элементов и в то же время к ним возможен дистанционный доступ через сеть из других ПЭ.
Рис. 5.27. Пример конфигурации системы.
Что касается обработки списков, то пока еще нс выяснено, в какой степени должна быть локальность данных списка внутри функции. В способе (1) локальность почти отсутствует, однако этот способ проблематичен с точки зрения издержек, связанных с необходимостью копирования. На рис. 5.27 показана структура системы, использующей третий подход.
Пример структуры банка памяти ПС показан на рис. 5.28. Доступ к каждому полю памяти возможен из каждого операционного блока CAR-OPU, CDR- OPU, REF-OPU. Блоки CAR-OPU(CDR-OPU) выполняют операции, связанные с работой указателей списков, например операции чтения/записи функций
car(cdr). Блок REF-OPU помимо сбора мусора с помощью счета обращений выполняет команду get cell, создающую новые ячейки. Тс из команд, кото-
Сеть команд
Сеть результатов.
Рис. 5.28. Пример архитектуры памяти структур.
рыс нс требуют обращений к ячейкам ПС, например atom и null, выполняются операционным устройством внутри ПЭ.
ЗАДАЧИ И ПЕРСПЕКТИВЫ НА БУДУЩЕЕ
ПРОБЛЕМЫ И МЕТОДЫ ИХ РЕШЕНИЯ
Что касается производительности и эффективности потоковых машин, то здесь остается еще ряд существенных проблем. В книге эти проблемы будут затронуты вскользь, однако обратите внимание, чта
они присущи не только потоковым машинам, но и вообще архитектуре параллельной обработки.
Управление ресурсами. Если повторное использование ячеек памяти для хранения цвета и лексем для распознавания активаторов будет невозможно, то выполнение больших программ ограниченными ресурсами также окажется невозможным. То же самое можно сказать и об управлении структурированной памятью. Поэтому необходимо организовать стабильный и эффективный сбор мусора в среде параллельной обработки, например утилизацию ресурсов и памяти.
Предотвращение ошибок при обработке и управление нагрузкой. При управлении данными по мере расширения типов данных расширяется и обработка, поэтому имеется опасность превышения объема ресурсов системы. Когда обнаруживается локальность обработки в среде параллельной обработки, то необходимо с помощью управляющего сигнала предотвратить массовые ошибки. Иначе говоря, необходимо более эффективное управление нагрузкой, в частности оптимальное разделение программ, отражающих характеристики обработки, и распределение их между ресурсами, а также уравнивание нагрузки между ресурсами.
Как уже было сказано в разд. 5.7.1, способ распределения тела функции между процессорами считается эффективным с точки зрения специфики обработки функционального языка. Что касается динамического управления нагрузкой путем распределения активаторов функций, то здесь можно использовать способ, основанный на контролировании величины нагрузки процессора с помощью каждого коммутатора в сети маршрутизации, и наличие механизма управления, который на основании этой информации будет переключать начало распределения и осуществлять распределенное управление нагрузкой.
Кроме того, для предотвращения ошибок при обработке можно использовать концепцию управления по необходимости.
Внедрение концепции управления по необходимости. В системе, управляемой данными, из-за необходимости передачи оценки выражения из устройства обработки во внешнюю среду приходится делать лишнюю оценку с упреждением, поэтому в зависимости от случая возникает опасность останова. Для предотвращения этого необходим механизм управления по необходимости (называемый также механизмом «ленивого» вычисления), который бы осуществлял оценку в соответствии с необходимостью. Для реализации этого рассматриваются архитектуры машин с полным управлением по необходимости [35] и машин, совмещающих управление данными и управление по необходимости [25, 36, 37].
Издержки и поток управления в параллельной обработке. В потоковых машинах извлечение параллельной обработки осуществляется в максимальной степени. Однако при параллельном протекании лексем, например в TF-коммутаторах, вентилях, или утилизации имени уже использованного активатора возникает проблема издержек. Для устранения этой проблемы необходимо либо увеличить гранулярность параллельной обработки, либо внедрить концепцию потока управления [38, 39].
Что касается внедрения концепции потока управления, то здесь предлагается использовать метод, который заключается в том, что вместо понятия «по значению», лексемой которого являются непосредственные данные, используется понятие «по ссылке», лексемой которого является ячейка переменной, поток данных анализируется и посредством удаления ненужных обходных путей из потока данных извлекается поток уравнения [40].
Обработка на основании биографической зависимости. Функциональный язык и потоковая архитектура в том виде, в котором они существуют, нс подходят для обработки процессоров, имеющих биографию. Однако обработка, учитывающая биографическую зависимость, имеет очень большую практическую ценность. Рассмотрим несколько способов решения этой проблемы. Прежде всего обработку, ре-
зультат которой изменяется в зависимости от предыдущего состояния, можно реализовать при помощи механизма заключительной рекурсии (цикла) с использованием обработки потока и переменных состояния.
Что касается проблемы монопольного управления, например вводом-выводом или базой данных, то здесь необходим механизм преобразования в последовательную форму при параллельном доступе, и для этого эффективны синхронное управление, описанное в разд. 5.5.3, и концепция потоковой обработки.
ПЕРСПЕКТИВНЫЕ НАПРАВЛЕНИЯ
Помимо архитектур, рассмотренных в данной главе, основанных на концепции потока данных, существуют следующие типы архитектур.
Матричные процессоры с обработкой по принципу волнового фронта. В структуре, зависящей от данных, например при обработке сигналов или матричных вычислениях, объектом являются регулярные задачи [41, 42] (в [41] фронтальные процессоры нс рассмотрены). Этот вид архитектуры применяется также при моделировании схем и т. д. Архитектура, в которой в виде матрицы соединены потоковые процессоры с несложной структурой, имеющие ограниченные функциональные возможности, подходит для реализации на СБИС. Эта архитектура похожа на архитектуру систолической матрицы, за тем исключением, что процессоры работают асинхронно и управляются данными. Эта архитектура отличается сравнительно простой реализацией.
Объектно-ориентированные машины. Концепция потока данных имеет схожесть с моделью actor [43]. Если несколько расширить модель потока данных, то в понятие «данные» можно включить запросы. Например, механизм активации функций и обмена параметрами, используемый при применении функции, очень похож на механизм actor и имеет отношение к обмену запросами. Концепция объектной ориентации предполагает параллельную распределенную 15—1145
обработку, и проблемой, представляющей интерес, является реализация управляемой потоком данных параллельной обработки процессорами, учитывающими биографическую зависимость [44].
Редукционные машины. Реализация управляемой данными, в частности по методу цветной фишки, обработки функций высокого порядка, что является отличительной особенностью редукционных машин, представляет собой сложную проблему. При обработке функций высших ступеней необходимы операции между различными активаторами, находящимися в отношениях «потомок — предок». Эту проблему можно решить методом копирования кода [45, 46], однако эффективность будет низкой. Если использовать метод «по ссылке», то благодаря возможности работы в среде через посредство указателей становится возможной обработка отношений включения и обработка функций высших ступеней [40]. Необходимо, очевидно, слияние потоковой архитектуры с редукционной машиной. Это объясняется тем, что недостатком потоковой архитектуры являются ограниченные возможности обработки функций высших ступеней, а с другой стороны, когда выполняется конкретизация управления параллельной редукцией, то необходимо использование концепции потока данных.
Отмстим, что архитектуру (1) можно реализовать уже сейчас, но для этого сначала нужно оценить преимущества асинхронной обработки с двух сторон: производительности и простоты программирования (в сравнении с традиционными матричными процессорами).
Архитектуры (2) и (3) содержат пока множество нерешенных проблем и нуждаются в серьезных исследованиях.
Глава 6АРХИТЕКТУРЫ ПАМЯТИ
В любой вычислительной машине — будь то машина с неймановской архитектурой или с ненеймановской архитектурой, — программы и данные хранятся в памяти. Объем памяти и быстрота доступа к ней определяют размеры задач, которые можно решать на этой машине, и скорость обработки. Компромиссным решением, позволяющим увеличивать пространство памяти и сделать более быстрым доступ к ней, без роста стоимости вычислительной машины, является иерархизация памяти. Иерархическая память обычно состоит из ЗУ различных типов, поэтому программист должен использовать команды и алгоритмы доступа, соответствующие типу ЗУ, из которого осуществляется выборка команды. Безусловно, это является большой нагрузкой для программиста. Кроме того, память может находиться в общем пользовании у множества одновременно выполняемых программ. В таких случаях необходимо программировать распределение областей памяти, используемых каждой программой, и заботиться о сохранности программ, что еще более тяжким бременем ложится на плечи программиста. Желательно, чтобы программисту казалось, будто существует довольно большая основная память, которая находится в пользовании только одного человека. В данной главе рассматриваются различные архитектуры памяти, повышающие ее быстродействие, позволяющие создать иерархическую память, виртуальную память и память для совместного использования, а также рассмотрены специальные архитектуры, например ассоциативной памяти.
АРХИТЕКТУРЫ ПАМЯТИ
ТРЕБОВАНИЯ, ПРЕДЪЯВЛЯЕМЫЕ К ПАМЯТИ
Излишне говорить о том, что возможности вычислительной машины определяются характеристиками ее памяти, в которой хранятся программы и данные. 15*
Архитектура памяти является наиболее важным элементом в архитектуре ЭВМ, и можно с полной уверенностью сказать, что важность этого элемента постоянно возрастает.
В первой главе было сказано о том, что основными задачами архитектора ЭВМ являются: 1) сделать машину более универсальной, 2) способной решать более сложные задачи, 3) более быстродействующей, 4) более надежной, 5) более «дружественной», 6) более дешевой. Было также сказано, что сложность этой работы заключается в проектировании такой системы, для которой был бы найден компромисс между этими взаимопротиворечащими требованиями. Постоянно желательные требования, которые определены как
универсальность,
общность решаемых задач,
высокое быстродействие,
надежность,
дружественность,
низкая стоимость,
Таблица 6.1. Архитектуры памяти
X. Архитектура
Требования
Быстро- действующая память
Быстро- действующая память большой емкости
Виртуальная память
Одинарная
Множест венная
Универсальность
Глобальность решаемых про
О
О
О
блем
Высокое оборудование
о
о
О
о
Надежность Дружественность Низкая стоимость
△
△
о
△
о △
Возможность совместного использования
о
распространяются и на память вычислительной машины. Кроме того, когда множество программ или процессоров совместно используют одно и то же пространство памяти, то к этим требованиям добавляется еще одно, седьмое требование: обеспечение совместного использования памяти. В отличие от первых шести требований, которые выполнимы только на определенной стадии эволюции в развитии ЭВМ, мера необходимости или отсутствия необходимости совместного использования зависит от спецификации системы, в которой эта память используется. Для совместного использования может быть предназначено как физическое пространство памяти, так и логическое пространство памяти.
Если классифицировать архитектуры памяти по приведенным выше требованиям, то получим 6 классов архитектур (см. табл. 6.1):
архитектура быстродействующей памяти (чередование адресов памяти, кэш-память);
архитектура быстродействующей памяти большой емкости (дисковая кэш-память);
Общая память
Высоконадежная память
Интеллектуальная память
Множественность программ
Множественность ЦП
Исправление ошибок
Защита
Память для ИИ
Ассоциативная память
Совместное ис- пользова-
Многопортовая память
О
О
О
о
о
о
А
О
О
о
о
о
△
о
о
о
А
А
А
А
А
X
X
О
О
О
О
архитектура виртуальной памяти (виртуальная память, многосегментная виртуальная память);
архитектура общей памяти (совместное использование памяти, многопортовая память);
архитектура высоконадежной памяти (коды с обнаружением и исправлением ошибок, мандатный доступ);
архитектура интеллектуальной памяти (ассоциативная память, память правил, память семантической структуры).
В этой таблице символ О означает архитектуру, целью которой является улучшение характеристики, указанной в соответствующей строке, символ △ означает архитектуру, целью которой является замораживание ухудшения этой характеристики в соответствующих пределах, X означает архитектуру, в которой эта характеристика игнорируется. Отсутствие символа означает, что архитектура нс сказывается никаким образом на характеристике.
ИЕРАРХИЯ ПАМЯТИ И ВИРТУАЛЬНАЯ ПАМЯТЬ
В настоящее время используется множество типов ЗУ, и если попытаться сравнить их по времени доступа и стоимости в расчете на бит информации, то получим картину, показанную на рис. 6.1. Произведение времени доступа на стоимость бита информации является почти постоянной величиной для всех типов ЗУ, поэтому для того, чтобы повысить быстродействие памяти и увеличить се емкость без увеличения стоимости, необходимо, используя нс менее двух типов ЗУ, построить иерархическую память (рис. 6.2). При такой архитектуре увеличение емкости памяти становится очевидным. Однако что же происходит со временем доступа? Если ко всему пространству памяти осуществляется произвольный доступ, то количество обращений за единицу времени к каждому ЗУ пропорционально его емкости и среднее время доступа к иерархической памяти почти равно времени доступа к самому медленному ЗУ.
Тем нс мснсс если рассмотреть процесс выполнения программы, то легко видеть, что данное предпо-
ложение не соответствует действительности. Как правило, адрес следующей исполняемой команды следует либо за адресом, по которому была считана текущая исполняемая команда, либо расположен
102
1010памяти-памяти-1(Г3-1(Г3-55НМЛНМЛ10“610“610~610~610“8 110“8 1НГМДНГМДГибкие дискиГибкие дискиСистемы на оптических дискахСистемы на оптических дискахНастоящее времяНастоящее времяМагнитные лентыМагнитные ленты10 лет тому назад10 лет тому назадДисковые ЗУ'^ с плавающей головкойДисковые ЗУ'^ с плавающей головкой|Биполяр-\ |ныезу, \ 1КМОПЗУ I \ n-МОП ЗУ\||Биполяр-\ |ныезу, \ 1КМОПЗУ I \ n-МОП ЗУ\|\ Дисковые ЗУ ВинчестерскийЗУ на магА с фиксированной Диск БИТНЫХголовкой /сердеч- X!/\ Дисковые ЗУ ВинчестерскийЗУ на магА с фиксированной Диск БИТНЫХголовкой /сердеч- X!/10"5-10"5-ПЗсР^ч\ПЗсР^ч\10"41Q-2Время доступа , с10"41Q-2Время доступа , с102102
10
10
памяти-
памяти-
1(Г3-
1(Г3-
5
5
НМЛ
НМЛ
10“6
10“6
10~6
10~6
10“8 1
10“8 1
НГМД
НГМД
Гибкие диски
Гибкие диски
Системы на оптических дисках
Системы на оптических дисках
Настоящее время
Настоящее время
Магнитные ленты
Магнитные ленты
10 лет тому назад
10 лет тому назад
Дисковые ЗУ'^ с плавающей головкой
Дисковые ЗУ'^ с плавающей головкой
|Биполяр-\ |ныезу, \ 1КМОПЗУ I \ n-МОП ЗУ\|
|Биполяр-\ |ныезу, \ 1КМОПЗУ I \ n-МОП ЗУ\|
\ Дисковые ЗУ Винчестерский
ЗУ на магА с фиксированной Диск БИТНЫХголовкой /
сердеч- X!/
\ Дисковые ЗУ Винчестерский
ЗУ на магА с фиксированной Диск БИТНЫХголовкой /
сердеч- X!/
10"5-
10"5-
ПЗсР^ч\
ПЗсР^ч\
10"41Q-2
Время доступа , с
10"41Q-2
Время доступа , с
102
102
Рис. 6.1. Соотношение времени доступа и стоимости ЗУ.
вблизи него. Такое расположение адресов называется пространственной локальностью программы. Считывание и запись данных, являющихся операндами, также выполняются последовательно в соседние ячейки памяти. Это называется пространственной локальностью данных. Из-за наличия в программе циклов и подпрограмм выборка команды по одному и тому же
адресу, а также доступ к данным по некоторому адресу могут часто повторяться в течение сравнительно короткого интервала времени. Это называется временной локальностью. Общее название пространственной локальности и временной локальности — локальность по доступу [1—3].
Рис. 6.2. Иерархия памяти.
Если имеет место временная локальность, то разместив в памяти самого верхнего уровня иерархии наиболее часто используемые команды и данные, можно уже за счет этого повысить эффективность доступа к памяти верхнего уровня. Пересылка данных с нижнего уровня на верхние может осуществляться блоками довольно большого размера. Величина блока определяется характеристиками памяти нижнего уровня. В большинстве ЗУ на блочную пе-
ресылку уходит гораздо меньше времени, чем суммарное время пересылки отдельных данных блока. Если в памяти верхнего уровня отсутствует содержимое нужного адреса, то из памяти нижнего уровня в нес пересылается блок, содержащий этот адрес. Когда используется пространственная локальность, то вероятность того, что доступ будет осуществляться последовательно к соседним ячейкам памяти, велика, поэтому, переслав содержимое соседних ячеек поблочно в память верхнего уровня, можно повысить эффективность доступа к памяти верхнего уровня.
Таким образом, эффективность иерархической организации памяти зависит во многом от временной и пространственной локальностей. Эффект от временной локальности увеличивается с ростом числа блоков, которые можно разместить в памяти верхнего уровня. Эффект от пространственной локальности тем выше, чем лучше соотношение времен блочной пересылки и одинарной пересылки. Если время блочной пересылки равно суммарному времени одинарной пересылки данных блока, то необходимость в блочной пересылке отпадает и эффект влияния пространственной локальности на среднее время доступа снижается.
Размер блока, пересылаемого между основной и вторичной памятью, велик — порядка 4 кбайт, поэтому высока эффективность блочной пересылки, а значит, и существенным является сокращение среднего времени доступа за счет пространственной локальности. При большом объеме основной памяти — от нескольких мегабайт до нескольких десятков мегабайт — и достаточно большом числе блоков основной памяти — от 1000 до 10 000 — влияние временной локальности на среднее время доступа также велико.
В отличие от этого, когда для построения иерархической памяти используют кэш-память (которая является разновидностью архитектур быстродействующей памяти), расположив ее над основной памятью, то блоки имеют небольшой размер: 8— 16 слов (64—128 байт), поэтому эффект сокращения времени доступа за счет пространственной локально-
сти ниже, чем в промежутке от основной памяти до вторичной. В то же время число блоков в кэш-памя- ти достаточно велико: 500—4000, поэтому влияние временной локальности весьма ощутимо.
Использование иерархической памяти требует, чтобы обмен блоками между быстродействующей и медленнодействующей памятью выполнялся в соответствии с алгоритмом доступа к каждому ЗУ. Это требование является большой нагрузкой для программиста. Ответом на него было рождение идеи виртуализации памяти. Под виртуализацией понимается метод автоматического управления иерархической памятью таким образом, что программисту кажется, будто существует одна быстродействующая память большей емкости [3].
СОВМЕСТНОЕ ИСПОЛЬЗОВАНИЕ ПАМЯТИ
Архитектура общей памяти предназначена для совместного использования памяти несколькими программами, одновременно выполняемыми одним ЦП, либо множеством ЦП. Для того чтобы с точки зрения каждой программы выглядело так, будто существует отдельная (независимая) память, необходимо, несмотря на совместное использование физического пространства памяти, выделить для каждой программы независимое логическое пространство памяти. Архитектура, в которой реализован этот принцип, называется архитектурой с общим физическим пространством памяти. В отличие от нее архитектура, в которой имеется возможность совместного использования множеством ЦП логического пространства памяти, называестя архитектурой с общим логическим пространством памяти.
ОБЕСПЕЧЕНИЕ ВЫСОКОЙ НАДЕЖНОСТИ
Высокая надежность системы определяется двумя факторами. Первый — это снижение ошибок при чте- нии/записи в память и второй — защита информации, хранящейся в памяти. Снижения ошибок при чте- нии/записи можно достичь путем кодирования запо-
минаемой информации с помощью кодов с обнаружением ошибок и кодов с исправлением ошибок. Исследования в этом направлении сформировались в одну отдельную область исследований, по этой проблеме было написано много трудов, поэтому в данной книге она нс рассматривается [4]. Защиту информации, хранящейся в памяти, можно обеспечить, задав для каждого процесса условия, разрешающие считывание или запись только определенных данных. Такие условия называются мандатом^ а механизм ограничения доступа с использованием мандата называется механизмом с мандатной адресацией. Этот способ был уже описан в разд. 1.5.3.
ИНТЕЛЛЕКТУАЛЬНАЯ ПАМЯТЬ
В устройствах памяти, описанных выше, при доступе указывается адрес ячейки памяти, из которой считывается или в которую записывается информация. В отличие от этого в интеллектуальной памяти для доступа к некоторым данным указываются часть этих данных и смысловая связь с другими данными, к которым уже был произведен доступ. К памяти такого типа относятся ассоциативная память, память правил, память семантической структуры. В памяти правил хранится совокупность правил, например, для продукционной системы. Эта память используется для поиска и считывания следующего применяемого правила. Память семантической структуры хранит семантическую сеть и используется для считывания записи содержимого в соответствии со смысловой связью. В памяти правил памяти семантической структуры одной или нескольким ячейкам можно придать интеллектуальные функции, оснастив их, например, процессорами. Очевидно, что такую архитектуру памяти можно считать разновидностью архитектуры для параллельной обработки, но в данной книге с учетом мотивов предложения подобных архитектур и перспективных направлений развития их место однозначно определено как разновидность архитектур памяти. '
АРХИТЕКТУРА БЫСТРОДЕЙСТВУЮЩЕЙ ПАМЯТИ
УВЕЛИЧЕНИЕ БЫСТРОДЕЙСТВИЯ ПАМЯТИ
С увеличением быстродействия устройств обработки быстродействие памяти, которая снабжает устройство обработки командами и операндами и принимает от него результаты обработки, стало отрицательно сказываться на производительности системы. Казалось бы, для решения этой проблемы достаточно использовать элементы памяти с малым временем выборки, однако нужных элементов либо не существовало, либо стоимость системы настолько возрастала, что их было невыгодно использовать. Поэтому понадобились структурные подходы в решении данной проблемы. К структурным методам относятся (рис. 6.3) :
пакетная обработка множества доступов к памяти;
конвейерная обработка множества доступов к памяти;
использование кэш-памяти.
При выборке команд, исключая переходы и ветвления, команды, как правило, считываются в строгой последовательности из соседних ячеек памяти. Если сделать возможным одновременный доступ к содержимому определенного числа соседних ячеек памяти, то последовательные запросы на доступ к этим соседним ячейкам можно обрабатывать посредством последовательного доступа к фиксаторам (стробам) данных, число которых равно числу запросов. Поскольку время доступа к фиксаторам данных гораздо меньше времени доступа к памяти, то среднее время доступа можно существенно сократить.
Иногда в зависимости от режима работы для доступа к памяти нс требуется ожидания окончания предыдущего доступа. В подобных случаях можно организовать конвейерную обработку доступов. Для этого память разбивают на множество банков и для буферизации последовательно поступающих запросов доступа и последовательно выводимых резуль-
add г
Пакетный доступ к 4 словам
а
Адрес addrДанные аАдрес addrДанные а
Адрес addr
Данные а
Адрес addr
Данные а
Доступ выполняется не ко всей памяти, а к кэш-памяти, которая хранит копию части ее содержимого
Рис. 6.3. Способы увеличения быстродействия памяти,
а-*-пакетный доступ; б — конвейерный доступ; в — кэш-память.
татов считывания дополняют ее очередью запросов доступа и очередью данных. Если два соседних запроса требуют доступа к разным банкам памяти, то последний запрос может нс дожидаться окончания предыдущего доступа. Реализовав на кристалле памяти очередь запросов доступа и очередь выходных данных, можно уже на уровне кристаллов построить конвейерную память. Это позволяет в несколько раз увеличить внутреннее быстродействие интегральных схем памяти по сравнению с внешним быстродействием.
Кэш-память — это быстродействующая память которую располагают между основной памятью и устройством обработки. Обычно емкость кэш-памяти составляет 1/1000—1/500 емкости основной памяти, а время доступа—1/5—1/10 времени доступа основной памяти. Кэш-память вместе с основной памятью образует иерархическую память. Как уже говорилось, из-за наличия в программе циклов и подпрограмм в сравнительно короткий интервал времени приходится многократно обращаться к одним и тем же ячейкам памяти. Если считанное однажды содержимое некоторой ячейки сохранить в кэш-памяти, то при последующих обращениях к этой ячейке можно использовать значение, хранящееся в кэш-памяти. Таким образом, начиная со второго доступа, время доступа можно сократить в 5—10 раз.
ЧЕРЕДОВАНИЕ АДРЕСОВ ПАМЯТИ
Разделим память на пг банков Во, Вь ..., Вт_\ одинаковой емкости и установим связь между банком В, содержащим адрес /, и адресом d внутри банка Вь, соответствующим адресу Ц с помощью следующего равенства:
i = d-m4-b, d^0, O^.b^m—1.(6.1)
Распределение адресов между т банками памяти называется /n-кратным чередованием адресов памяти. Таким образом, память, состоящая из т банков с распределенными адресами, называется памятью
с /и-кратным чередованием адресов \т— обычно степень числа 2).
На рис. 6.4 показан пример использования чередования адресов при пакетной обработке запросов до-
Адрес внутри банкаАдрес внутри банкадоступ/адресдоступ/адрес"'l Распределение [адресов"'l Распределение [адресов
Адрес внутри банка
Адрес внутри банка
доступ/адрес
доступ/адрес
"'l Распределение [адресов
"'l Распределение [адресов
ЧтениеЧтениеЧтениеЧтениеЧтениеЧтениеЧтениеЧтениеЧтениеЧтениеАдрес 5Адрес 6Адрес 7Адрес 8Адрес 9Адрес 5Адрес 6Адрес 7Адрес 8Адрес 9Доступ ко всембанкамДоступ ко всембанкам
Чтение
Чтение
Чтение
Чтение
Чтение
Чтение
Чтение
Чтение
Чтение
Чтение
Адрес 5
Адрес 6
Адрес 7
Адрес 8
Адрес 9
Адрес 5
Адрес 6
Адрес 7
Адрес 8
Адрес 9
Доступ ко всембанкам
Доступ ко всембанкам
Время цикла памяти /Содержимое адресов - I 4, 5, 6, 7 считывается \ в фиксаторы
Доступ к фиксатору
Доступ к фиксатору
Содержимое адресов 8, 9, 10, 11 считывается в фиксаторы
Время
бРис. 6.4. Пакетный доступ к памяти с использованием чередо-вания адресов.
а — 4-кратное чередование адресов памяти (пакетный доступ);б —результат пакетного доступа.
ступа. Допустим, что при считывании по z-му адресу b является неотрицательным целым числом, определяемым выражением (6.1), тогда все значения от адреса i — b до адреса I 4* т — b — 1 считываются в фиксаторы данных. Если существует локальность по
доступу и доступ осуществляется последовательно, начиная с адреса ц к адресам i + 1, * + 2, то считывание из адреса т — b—1 в промежутке от адреса t + 1 Д° * + ^ — b — 1 можно выполнить без обра-доступу и доступ осуществляется последовательно, начиная с адреса ц к адресам i + 1, * + 2, то считывание из адреса т — b—1 в промежутке от адреса t + 1 Д° * + ^ — b — 1 можно выполнить без обра-ааЧтение Адрес 8Запись Адрес 6Чтение Адрес 1Запись Адрес 7Чтение Адрес 8Запись Адрес 6Чтение Адрес 1Запись Адрес 7Время цикла памяти Используется банк ОВремя цикла памяти Используется банк ОИспользуется банк 1
доступу и доступ осуществляется последовательно, начиная с адреса ц к адресам i + 1, * + 2, то считывание из адреса т — b—1 в промежутке от адреса t + 1 Д° * + ^ — b — 1 можно выполнить без обра-
доступу и доступ осуществляется последовательно, начиная с адреса ц к адресам i + 1, * + 2, то считывание из адреса т — b—1 в промежутке от адреса t + 1 Д° * + ^ — b — 1 можно выполнить без обра-
а
а
Чтение Адрес 8
Запись Адрес 6
Чтение Адрес 1
Запись Адрес 7
Чтение Адрес 8
Запись Адрес 6
Чтение Адрес 1
Запись Адрес 7
Время цикла памяти Используется банк О
Время цикла памяти Используется банк О
Используется банк 2
Используется банкЗ
Время
Разрешение доступак банку О
б
Рис. 6.5. Конвейерный доступ с использованием чередования ад-ресов памяти.
а — 4-кратное чередование адресов памяти; б — конвейерный доступ.
щения к памяти, а лишь считыванием из фиксаторов данных. Поскольку время доступа к фиксатору гораздо меньше времени доступа к памяти, то среднее время доступа также сокращается.
На рис. 6.5 показан пример использования чередования адресов при конвейерной обработке запро-
сов доступа. При доступе, например, к векторным операндам в векторном процессоре происходит последовательное обращение к адресам 1, / + s, / + 2s, ..., отстоящим друг от друга с определенным интервалом s. Если обозначить наибольший общий делитель т и s через gcd(m, s), то в случае, когда m/gcdi^m, s) доступов последовательно осуществляются к различным банкам памяти и процесс выборки длится достаточно долго, производительность увеличивается примерно в m/gcd(m, s) раз по сравнению со случаем доступа к одному банку. Если т и s являются взаимно простыми, то производительность увеличивается в т раз. Если в качестве т выбрать простое число, то множество значений s взаимно простых с т увеличится и повышение производительности для широкого набора значений s может приближаться к величине т. Память с m-кратным чередованием адресов (где т— простое число) называется первичной памятью [7]. Система с первичной памятью была использована в машине BSP (Burroughs Scientific Processor — процессор для научных расчетов фирмы Burroughs).
Хотя для первичной памяти и нет проблемы, заключающейся в необходимости вычисления номера банка 6, определяемого формулой (1.6), и номера d внутри банка для каждого запроса доступа, тем не менее сделать это быстро довольно сложно.
В системе памяти с конвейерным доступом, в которой используется память с m-кратным чередованием адресов, доступ к памяти возможен в интервале \/т цикла памяти. Однако, если в течение т циклов, следующих непрерывно друг за другом, запрашивается доступ к одному и тому же банку, то до окончания предыдущего доступа к этому банку запрос на следующий доступ ожидает обработки. Такая ситуация называется конфликтом по доступу. При частом возникновении конфликтов по доступу данный метод повышения быстродействия становится неэффективным.
Если расположить Ьт банков памяти в виде матрицы размерностью I (строк) Хт (столбцов) таким образом, чтобы к каждой строке осуществлялся пакетный доступ с помощью m-кратного чередования, 16—1145
и сделать так, чтобы по отношению к I блокам памяти, состоящим из т слов с идущими подряд номерами, можно было применить конвейерный доступ с помощью /-кратного чередования, то можно построить систему памяти, позволяющую в каждом интервале длительностью 1// от цикла памяти осуществлять доступ к т словам с идущими подряд номерами.
КЭШ-ПАМЯТЬ [8—13]
Основная памятьОсновная память10“ 3 10-110“ 3 10-1М~2 х 10~3Мслов, Т~ 2 х10“1 Т нсМ~2 х 10~3Мслов, Т~ 2 х10“1 Т нсРис. 6.6. Кэш-память.Рис. 6.6. Кэш-память.Кэш-память — это быстродействующая память, расположенная между ЦП и основной памятью (рис. 6.6). Вместе с основной памятью она образует иерархическую структуру, и ее действие эквивалентно быстрому доступу к основной памяти. В больших уни-
Основная память
Основная память
10“ 3 10-1
10“ 3 10-1
М~2 х 10~3Мслов, Т~ 2 х10“1 Т нс
М~2 х 10~3Мслов, Т~ 2 х10“1 Т нс
Рис. 6.6. Кэш-память.
Рис. 6.6. Кэш-память.
Основнаяпамять
N слов, Т нс
версальных ЭВМ, основная память которых имеет емкость порядка 32—64 Мбайт, обычно используется кэш-память емкостью 64—256 Кбайт. То есть емкость кэш-памяти составляет порядка 1/1000—1/500 емкости основной памяти, а быстродействие в 5—10 раз выше быстродействия основной памяти.
Кэш-память, состоящая из т слов, сохраняет копии нс менее чем т слов из всех слов основной памяти. Если копия, к адресу которой был выполнен доступ ЦП, существует в кэш-памяти, то считывание завершается уже при доступе к кэш-памяти. Для записи в кэш-память существует несколько методов замещения старой информации. Эти методы назы-
ваются стратегией обновления основной памяти. Отметим, что m слов не должны быть разрозненными. В случае пространственной локальности основная память разбивается на блоки с фиксированным числом слов и обмен данными между основной памятью и кэш-памятью осуществляется блоками. При доступе к некоторому адресу ЦП должен сначала определить, имеется ли копия блока, содержащего этот адрес, в кэш-памяти, и если имеется, то определить, с какого адреса кэш-памяти начинается этот блок. Эту информацию ЦП получает с помощью механизма преобразования адресов. На сложность этого механизма существенное влияние оказывает стратегия размещения, определяющая, в какое место кэш-памяти следует поместить каждый блок основной памяти.
Еще один важный аспект связан с необходимостью решения, в какой момент в кэш-память следует поместить копию блока, содержащего слово, извлекаемое из памяти в результате доступа. Этой проблемой занимается стратегия выборки. Поскольку размер кэш-памяти составляет 1/1000—1/500 размера основной памяти, то может оказаться, что, несмотря на выборку из основной памяти нужного блока, в кэш-памяти нет свободного места для его размещения. В подобных случаях необходимо выбрать один из блоков, хранящихся в кэш-памяти, и заменить его на новый блок. Если результат замены в кэш-памяти нс отражается на копии, хранящейся в основной памяти, то старый блок воспроизводится в старой копии основной памяти. Способ определения блока, удаляемого из кэш-памяти, называется стратегией замещения.
На эффективность кэш-памяти большое влияние оказывают пространственная и временная локальности. Кроме того, программы и данные существенно отличаются по локальности. Иногда для каждого типа данных, которые имеют различную локальность, используют различные кэш-памяти.
Стратегия размещения и механизм преобразования адресов. Существуют 4 способа размещения данных в кэш-памяти: прямое распределение, 16*
полностью ассоциативное распределение, частично ассоциативное распределение и распределение секторов. Полностью ассоциативное распределение является идеальным, однако из-за высокой стоимости оно практически неосуществимо. В последнее время большое распространение получило частично ассоциативное распределение. Ниже подробно описаны каждый способ размещения и его механизм преобразования адресов. Для того чтобы конкретизировать описание, положим, что емкость кэш-памяти составляет 2Кслов, размер блока—16 слов, а емкость основной памяти— 256К слов. Следовательно, кэш-память может содержать 128 блоков, а основная память— 16384 блока. Для адресации основной памяти используется 18 бит. Из них старшие 14 бит показывают номер блока, содержащего этот адрес, а младшие 4 бит — адрес слова внутри этого блока. Номер блока называется адресом блока. 128 блоков кэш-памяти указываются 7-разрядными адресами.
(/) Прямое распределение. Для того чтобы поместить в кэш-память из основной памяти блок с адресом Ьп, область внутри кэш-памяти с адресом 6С, равным 7 младшим битам адреса Ьп, выбирается в качестве места хранения блока (рис. 6.7). Например, блок с адресом 3673 помещается по адресу кэшпамяти, равному 89 (исходя из того, что 3673 = = 128X27 + 89). Преобразование из Ьп в Ьс сводится только к выборке младших 7 бит. В данном случае по адресу Ьс блока кэш-памяти может быть помещен любой из 128 блоков, имеющих адрес, 7 младших битов которого равны адресу Ьс. Для того чтобы определить, какой именно блок хранится в данное время в кэш-памяти, используется еще одна память емкостью 7 битХ 128 слов, в адрес Ьс которой помещаются в качестве тега 7 старших битов адреса блока, хранящегося в данное время по адресу Ьс кэш-памяти. Эта специальная память называется теговой памятью. Память, в которой хранятся блоки, помещенные в кэш, называется памятью данных.
При доступе к Z-му адресу младшие 7 бит адреса блока, где содержится этот адрес, используются в качестве адреса теговой памяти, из которого считывается
ИндексИндексАдрес блокаАдрес блока^ Адрес внутри блока^ Адрес внутри блока
Индекс
Индекс
Адрес блока
Адрес блока
^ Адрес внутри блока
^ Адрес внутри блока
б
Рис. 6.7. Кэш-память с прямым распределением. а — структура кэш-памяти; б — связь кэш-памяти с основной памятью
тег. Параллельно этому осуществляется доступ к памяти данных с помощью 11 младших битов адреса L Если считанный тег и старшие 7 бит адреса I совпадают, то это означает, что блок, содержащий адрес /, существует в памяти данных и в слове, к которому осуществляется доступ, должна храниться копия /-го адреса.
Если тег отличается от старших 7 бит, то из основной памяти считывается блок, содержащий адрес /, а из кэш-памяти удаляется блок, определяемый 7 младшими битами адреса /, и на его место помещается блок, считанный из основной памяти. Осуществляется также обновление соответствующего тега в теговой памяти.
Способ прямого распределения реализовать довольно просто, однако из-за того, что место хранения блока в кэш-памяти однозначно определяется по адресу блока, вероятность сосредоточения областей хранения блоков в некоторой части кэш-памяти высока, т. е. замена блоков будет происходить довольно часто. В такой ситуации эффективность кэш-памяти заметно снижается.
Полностью ассоциативное распределение. При полностью ассоциативном распределении допускается размещение каждого блока Ьп основной памяти на месте любого блока Ьс кэш-памяти. В этом случае механизм преобразования адресов должен быстро дать ответ, существует ли копия блока с произвольно указанным адресом в кэш-памяти, и если существует, то по какому адресу. Для этого необходима ассоциативная память, входной информацией для которой является тег—14-разрядный адрес блока, а выходной— адрес блока внутри кэш-памяти (рис. 6.8).
По этому способу при замене блоков кандидатами на удаление могут быть все блоки в кэш-памяти.
Частично ассоциативное распределение. При данном способе несколько соседних блоков (фиксированное число, не менее двух) из 128 блоков кэшпамяти образуют структуру, называемую группой. В приведенном ниже примере в одну группу входят
Данные считывания/записиДанные считывания/записиа
Данные считывания/записи
Данные считывания/записи
Рис. 6.8. Кэш-память сРис. 6.8. Кэш-память сАдрес блока Тег в кэш памятиАдрес блока Тег в кэш памятиАдрес блокаАдрес блокаббполностью ассоциативным распределением.
Рис. 6.8. Кэш-память с
Рис. 6.8. Кэш-память с
Адрес блока Тег в кэш памяти
Адрес блока Тег в кэш памяти
Адрес блока
Адрес блока
б
б
a — структура кэш памяти; б — связь кэш-памяти с основной памятью.
4 блока. Адрес блока внутри кэш-памяти, состоящий из 7 бит, разделим на адрес группы, состоящий из 5 бит, и адрес блока внутри группы, состоящий из двух бит. Обозначим адрес блока в основной памяти Ьп, а через tag(6m) и set(6m) обозначим соответственно старшие 9 бит адреса Ьт и следующие за ними 5 бит. Они называются соответственно теговой частью адреса Ьт и частью адреса группы.
Для помещения в кэш-память копии адреса блока Ьт, хранимого в основной памяти, необходимо выбрать группу с адресом set(6m). При этом нс имеет значения, какой из четырех блоков в группе может быть выбран. Для выбора группы используют метод прямого распределения, а для выбора блока в группе—метод полностью ассоциативного распределения [14, 15].
На рис. 6.9 показана структура кэш-памяти, основанной на использовании частично ассоциативного распределения. Когда ЦП запрашивает доступ к /-му адресу, то осуществляется доступ к массиву тегов, в котором в качестве адреса используются 5 младших битов адреса блока 6, состоящего, в свою очередь, из 14 старших битов адреса L Одновременно осуществляется доступ к массиву данных, адресом которого являются 9 бит, полученные добавлением к части set (Ь) четырех младших битов адреса I.
Массив тегов состоит из четырех банков памяти, доступ к которым осуществляется параллельно одинаковыми адресами. Каждый банк имеет длину слова 9 бит для помещения значения тега, а число слов равно числу групп, т. с. 32. Адрес j в этом банке соответствует группе /, и по этому адресу в банке к хранится тег блока, копия которого в данный момент хранится по адресу блока к внутри группы /. При доступе к адресу set(6) четыре тега блока, копии которых существуют в блоке группы с адресом set (6), одновременно считываются в блок сравнения тегов и сравниваются с адресом tag (6). Если сравнение показало совпадение для банка к, то это означает, что копия блока Ь существует по адресу блока к внутри группы с адресом set(6).
ТегАдрес группыТегАдрес группыАдрес внутри блокаАдрес внутри блокаАдрес блокаАдрес блокаОсновная памятьОсновная памятьбРис. 6.9. Кэш-память с частично ассоциативным распределением, а —структура кэш-памяти; б —распределение блоков в кэш-памяти и основной памяти.бРис. 6.9. Кэш-память с частично ассоциативным распределением, а —структура кэш-памяти; б —распределение блоков в кэш-памяти и основной памяти.
ТегАдрес группы
ТегАдрес группы
Адрес внутри блока
Адрес внутри блока
Адрес блока
Адрес блока
Основная память
Основная память
б
Рис. 6.9. Кэш-память с частично ассоциативным распределением, а —структура кэш-памяти; б —распределение блоков в кэш-памяти и основной памяти.
б
Рис. 6.9. Кэш-память с частично ассоциативным распределением, а —структура кэш-памяти; б —распределение блоков в кэш-памяти и основной памяти.
Массив данных также состоит из четырех банков памяти, доступ к которым осуществляется параллельно с помощью одинаковых адресов. Каждый банк имеет длину слова такую же, как и у основной памяти, а емкость его определяется числом слов в одном блоке, умноженным на число групп в кэш-па-
мяти. Например, его емкость может быть равна 32X16 = 512 слов. Если величины /, к, I лежат в пределах 0 ^ / ^ 32, 0 ^ к ^ 3, 0 15, то адрес /Х24 + / банка к будет соответствовать одному слову в кэш-памяти, а адрес группы, которой принадлежит это слово, адрес блока внутри группы и адрес внутри блока будут равны соответственно значениям /, к и I.
Как уже говорилось, если при запросе доступа ЦП по адресу i обнаружится совпадение тега, считанного из банка к массива тегов, с теговой частью адреса I, то результат считывания банка к массива данных, к которому был одновременно произведен доступ, нс копируется по адресу I.
При пересылке нового блока в кэш-память удаляемый из нес блок выбирается из четырех блоков соответствующего набора.
) Распределение секторов. По данному методу основная память разбивается на секторы, состоящие из фиксированного числа блоков. Кэш-память также разбивается на секторы, состоящие из такого же числа блоков. Рассмотрим случай, когда длина блока равна 16 словам, а сектор состоит из 16 блоков. В адресе основной памяти старшие 10 бит показывают номер сектора, следующие 4 бит — номер блока внутри сектора, а младшие 4 бит — адрес в блоке (рис. 6.10).
По данному методу распределение секторов в основной памяти и секторов в кэш-памяти осуществляется полностью ассоциативно. Другими словами, каждый сектор в основной памяти может соответствовать любому сектору в кэш-памяти. Распределение блоков в секторе одинаково для основной и кэшпамяти. Каждый сектор в кэш-памяти соответствует только одному сектору основной памяти. К каждому блоку, хранимому в кэш-памяти, добавляется один бит информации, называемый битом достоверности (действительности); он показывает, совпадает или нет содержимое этого блока с содержимым блока в основной памяти, который в данный момент анализируется на соответствии блоку кэш-памяти.
Адрес сектора
считывания/записи
Адрес основной памяти
5^
Адрес блока Адрес в секторе в блоке
Адрес сектора п в кэш-памяти и
достоверности
321
7
0
2
1023
Память данных
0
15
16
17
31
32
33
16383
Основная память
0
15
Рис. 6.10. Кэш-память с распределением сегментов.
а— структура кэш-памяти; б— связь между кэш-памятью и основнойпамятью.
Если слова, запрашиваемого ЦП при доступе, нс существует в кэш-памяти, то сначала ЦП проверяет, был ли сектор, содержащий это слово, ранее помещен в кэш-память. Если он отсутствует, то один из секторов кэш-памяти заменяется на этот сектор.
Если все сектора кэш-памяти используются, то выбирается один какой-нибудь сектор, и при необходимости только некоторые блоки из этого сектора возвращаются в основную память, а этот сектор можно использовать дальше. Когда осуществляется доступ к этому сектору в кэш-памяти и блок, содержащий нужное слово, пересылается из основной памяти, то бит достоверности устанавливается до пересылки блока. Все биты достоверности других блоков этого сектора сбрасываются.
Если сектор, содержащий слово, доступ к которому запрашивается, уже находится в кэш-памяти, то в том случае, когда бит достоверности блока, содержащего это слово, равен 0, этот блок пересылается из основной памяти в данную область кэшпамяти и бит достоверности устанавливается. В том случае, когда бит достоверности уже равен 1, данное слово можно считать из кэш-памяти.
Стратегия обновления основной памяти и стратегия замещения [16]. Если результат обновления блоков кэш-памяти нс возвращать в основную память, то содержимое основной памяти становится неадекватным вычислительному процессу. Чтобы избежать этого, предусмотрены методы обновления основной памяти, которые можно разделить на две большие группы: метод сквозной записи и метод обратной записи.
По методу сквозной записи обычно обновляется слово, хранящееся в основной памяти. Если в кэшпамяти существует копия этого слова, то она также обновляется. Если же в кэш-памяти отсутствует копия этого слова, то либо из основной памяти в кэшпамять пересылается блок, содержащий это слово (метод WTWA — сквозная запись с распределением), либо этого нс делается (метод WTNWA — сквозная запись без распределения). Когда по методу сквозной записи область (блока) в кэш-памяти назначается для хранения другого блока, то в основную память можно нс возвращать удаляемый блок. Однако в этом случае эффект от использования кэш-памяти отсутствует.
По методу обратной записи, если адреса объектов, по которым есть запрос обновления, существуют в кэш-памяти, то обновляется только кэш-память, а основная память — нет. Если адреса объекта обновления нет в кэш-памяти, то в нее из основной памяти пересылается блок, содержащий этот адрес, после чего обновляется только кэш-память. По методу обратной записи в случае замены блоков удаляемый блок необходимо также пересылать в основную память. У этого метода существуют две разновид- ногти: метод SWB (простая обратная запись), по которому удаляемый блок возвращается в основную память, и метод FWB (флаговая обратная запись), по которому в основную память записывается только обновленный блок кэш-памяти. В последнем случае каждая область блока в кэш-памяти снабжается однобитовым флагом, который показывает, было или нет обновление блока, хранящегося в этой области.
Метод FWB обладает достаточной эффективностью, однако более эффективным считается метод FPWB (флаговая регистровая обратная запись), в котором благодаря размещению буфера между кэшпамятью и.основной памятью предотвращается конфликт между удалением и выборкой блока. Для замещения блоков кэш-памяти существует несколько методов, в частности метод замещения наиболее давнего по использованию блока (LRU), метод FIFO (первым вошел — первым вышел) и метод произвольного замещения. В первом случае среди блоков, являющихся объектами замещения, выбирается блок, к которому наиболее -длительное время нс было обращений. По методу FIFO среди всех блоков, являющихся объектами замещения выбирается тот, который самым первым был переслан в кэш-память. И наконец по последнему методу блок выбирается произвольно. Реализация этих методов упрощается в указанной последовательности, но наибольшей эффективностью обладает метод замещения наиболее давнего по использованию блока.
Для реализации этого метода необходимо манипулировать блоками, которые являются объектами замещения, с помощью LRU-стека [17]. При каждой
загрузке в этот стек помещается блок, в результате чего при замене используется блок, хранящийся в наиболее глубокой позиции стека, и этот блок уда-
Состояние а b с
а b с — это номера блоков в множестве в кэш-рамяти. Допустим, что размер множества равен 3, а
Ь, с = 0, 1, 2 , Тогда состояние а b с показывает, что к блоку а доступ был последним, а к блоку с — наиболее давний
Переход в
другое состояние
УдалениеУдалениеЕсли осуществляется достугг к блоку b в состоянии а b с, то состояние изменяется на b а с;Если осуществляется достугг к блоку b в состоянии а b с, то состояние изменяется на b а с;Удаляется блок с: он выбирается как наиболее давний по использованию (метод LRU)Удаляется блок с: он выбирается как наиболее давний по использованию (метод LRU)Рис. 6.11. Диаграмма переходов состояний для стека типа LRU.Рис. 6.11. Диаграмма переходов состояний для стека типа LRU.
Удаление
Удаление
Если осуществляется достугг к блоку b в состоянии а b с, то состояние изменяется на b а с;
Если осуществляется достугг к блоку b в состоянии а b с, то состояние изменяется на b а с;
Удаляется блок с: он выбирается как наиболее давний по использованию (метод LRU)
Удаляется блок с: он выбирается как наиболее давний по использованию (метод LRU)
Рис. 6.11. Диаграмма переходов состояний для стека типа LRU.
Рис. 6.11. Диаграмма переходов состояний для стека типа LRU.
ляется из стека. При доступе к блоку х этот блок удаляется из стека и заново загружается в него. Стек типа LRU устроен таким образом, что, чем дольше к блоку нс было доступа, тем в более глубокой пози-
ции он располагается. Реализация стека типа LRU, позволяющего с высокой скоростью выполнять такую операцию, усложняется по мере увеличения числа блоков.
По методу частично ассоциативного распределения число блоков в каждом стеке LRU равно числу блоков в одной группе, и так как это число мало — порядка 2 ~ 4, то для каждой группы необходимо использовать свой стек. Если число групп сравнительно велико, то оснащение каждой из них стековым механизмом приводит к повышению стоимости. Если в группу входят 4 блока, то состояние стека можно представить комбинацией четырех элементов: 0, 1, 2, 3. Комбинация (0, 3, 1, 2) показывает, что к блоку 0 доступ был последним, за ним следует блок 3, а к блоку 2 доступ был наиболее давним. Такую комбинацию можно представить замещением четырех элементов, ml поскольку их суммарное число есть 4! = 24, то каждую комбинацию можно закодировать пятью битами данных. Спроектировав соответствующие комбинационные и последовательностные схемы, можно реализовать механизм, определяющий из закодированного состояния стека LRU его глубину и перемещающий любой элемент стека на его вершину. На рис. 6.11 показана диаграмма переходов состояний стека LPU для случая, когда размер группы равен 3. Данные закодированного состояния стека хранятся в кэш-памяти для каждой группы.
ДИСКОВАЯ КЭШ-ПАМЯТЬ
Кэш-память располагают между ЦП и основной памятью, что эквивалентно увеличению быстродействия основной памяти. Используя аналогичную по функциям память, расположенную между основной и вторичной памятью, можно сократить среднее время доступа к вторичной памяти в 2 ~ 10 раз. Такая кэш-память носит название дисковой кэш-памяти, и в качестве ее обычно используется полупроводниковое ЗУ емкостью от нескольких мегабайт до нескольких десятков мегабайт.
УВЕЛИЧЕНИЕ БЫСТРОДЕЙСТВИЯ КЭШ ПАМЯТИ
К методам еще большего увеличения быстродействия системы памяти, использующей кэш-память, относятся:
использование двухуровневой кэш-памяти;
разделение кэш-памяти на независимые кэшпамять команд и кэш-память операндов;
использование обходного кэш-буфера и т. д. [18].
Первый метод заключается в использовании по крайней мере еще одного уровня памяти между кэши основной памятью. Эта вновь привлекаемая память называется системным кэшем. Для взаимодействия кэш-памяти с системным кэшем используется метод сквозной записи, а для взаимодействия системного кэша с основной памятью — метод обратной записи.
Второй метод основан на использовании разницы в комбинациях доступа при выборке команд и выборке операндов, и поэтому для каждого из них используется свой кэш. ■
Третий метод заключается в использовании обходного пути через буфер, который в случае необходимости пересылки блока из основной памяти в кэшпамять позволяет, нс дожидаясь окончания пересылки, осуществлять доступ к его начальному адресу одновременно с началом пересылки.
6.3. АРХИТЕКТУРА ВИРТУАЛЬНОЙ ПАМЯТИ
Основная память как аппаратное средство представляет собой линейное пространство N адресов, которое называется физическим пространством памяти. Когда программист непосредственно обращается с этим пространством, то возникают следующие проблемы.
Проблема ограниченности области: при выполнении программ размером свыше N слов в ней необходимо указывать обмен подпрограммами или промежуточными результатами между основной памятью и вторичной, что при мультипрограммировании реализовать невозможно.
Проблема линейности пространства: когда программа по частям загружается в память и по оконча-
//Программа 4Программа 4d<a+btcd<a+btcРис. 6.13. Виртуальное пространство и реальное пространство.Рис. 6.13. Виртуальное пространство и реальное пространство.
/
/
Программа 4
Программа 4
d<a+btc
d<a+btc
Рис. 6.13. Виртуальное пространство и реальное пространство.
Рис. 6.13. Виртуальное пространство и реальное пространство.
нии выполнения извлекается оттуда, то в результате подобного использования памяти возникает состояние, называемое фрагментацией памяти (рис. 6.12). 17—1145
В этом состоянии в память нельзя даже загрузить программу, размер которой меньше суммарного размера неиспользуемых областей.
Для решения этих проблем был предложен метод, по которому программисту кажется, будто существует достаточно большое пространство памяти, причем необязательно линейное. Общее название этого метода — виртуальная память [3]. Пространство виртуальной памяти, видимое (доступное) программисту, называется виртуальным пространством. В отличие от него пространство физической памяти называется реальным пространством. Адреса виртуального пространства называются виртуальными адресами, а адреса физического пространства — физическими адресами. Виртуальный адрес обычно отличается от физического, и поскольку программист составляет программу с использованием виртуальных адресов, то требуется преобразование виртуальных адресов в физические (рис. 6.13) 1).
ОДИНАРНАЯ ВИРТУАЛЬНАЯ ПАМЯТЬ
Эта система виртуальной памяти имеет целью:
предоставить программисту достаточно большое пространство памяти, 2) предоставить программисту область памяти, физически нс используемую из-за фрагментации, в виде логически непрерывного пространства.
В этой системе программа разбивается на части равной величины, называемые страницами. Все страницы, составляющие программу, хранятся во вторичной памяти, и в некоторый момент времени некоторые из них помещаются в основную память. Поэтому основная память разбивается на блоки такой же величины, что и страницы. В этом случае виртуальное пространство является линейным, разбитым на страницы, причем страница из виртуального пространства может соответствовать любой странице из физического пространства. Размер страницы обычно выбирают в пределах 2^4 кбайт.
° Это преобразование носит название трансляции адресов.— Прим, перев.
В случае запроса доступа к странице, несуществующей в основной памяти, необходимо загрузить эту страницу из вторичной памяти в основную. Попытка доступа к несуществующей в основной памяти странице называется страничным сбоем. Если в основной памяти нет свободных блоков, которые можно было бы использовать для загрузки новых страниц, то необходимо освободить блок путем удаления одной из существующих в памяти страниц. Удаляемая страница определяется алгоритмом замещения страниц. Для определения того, когда именно следует загрузить страницу в основную память, используются главным образом два метода: выборка по запросу — когда загрузка выполняется после страничного сбоя, и предвыборка — когда загрузка выполняется заранее по предположению о возникновении страничного сбоя.
Для преобразования виртуального адреса в реальный существуют два метода: с использованием таблицы прямого преобразования и с использованием ассоциативного преобразования.
В первом случае используется аппаратно-реализованная таблица преобразования номера страницы в номер блока (рис. 6.14). Она носит название страничной таблицы и представляет собой ЗУ, объем которой равен числу страниц виртуального пространства. В t-м адресе этой памяти хранятся: бит F, показывающий, существует или нет i-я страница; бит обновления С, показывающий, было или нет обновление страницы в основной памяти, и используемый для предотвращения ненужной записи во вторичную память в случае удаления страницы; код RWX, показывающий, какая форма доступа (считывание/запись или и то и другое) разрешена к i-й странице; бит М, показывающий, находится ли i-я страница в основной памяти, и наконец, номер блока PFA (page frame address), соответствующий i-й странице. Если F= 1, М= 1, то это означает, что i-я страница хранится в основной памяти и номер соответствующего блока представляет собой значение PFA. Следовательно, реальный адрес можно получить, добавив к старшей части адреса внутри страницы, входящей в состав виртуального адреса, номер блока, долучен- 17*
Виртуальный адрес г ■ \
Адрес
Номер внутри страницы страницы
Реальный адрес
а
Рис. 6.14. Одинарная виртуальная память.
a — преобразование адресов с помощью таблицы прямого преобразования; б — виртуальное и реальное пространства памяти. F — бит достоверности; С—бит обновления; RWX — режим доступа (чтение/запнсь/вы- полнение); М — бит «память/диск»; PFA — адрес кадра страницы.
ный из страничной таблицы. Если F = 1, а М = 0, то в PFA хранится адрес страницы из вторичной памяти. Таблица преобразования может также храниться в основной памяти.
Эффективность метода, основанного на использовании таблицы прямого преобразования, низка вследствие того, что при каждом доступе к памяти необходимо как минимум два обращения: к таблице страниц и к основной памяти. Поэтому в целях увеличения эффективности был предложен другой метод, который Цзывается методом ассоциативного преобразования. Согласно этому методу, вместо страничной
Виртуальное пространствоВиртуальное пространствоАдрес операнда b в команде ADD указывается с помощью смещения относительно начального адреса области хранения программыАдрес операнда b в команде ADD указывается с помощью смещения относительно начального адреса области хранения программыРис. 6.15. Применение регистра настройки.Рис. 6.15. Применение регистра настройки.
Виртуальное пространство
Виртуальное пространство
Адрес операнда b в команде ADD указывается с помощью смещения относительно начального адреса области хранения программы
Адрес операнда b в команде ADD указывается с помощью смещения относительно начального адреса области хранения программы
Рис. 6.15. Применение регистра настройки.
Рис. 6.15. Применение регистра настройки.
таблицы используется сравнительно небольшая — на 8~ 128 входов — быстродействующая ассоциативная память, в которой хранится информация о преобразовании наиболее часто используемых страниц. Только в тех случаях, когда первая попытка использования ассоциативной памяти окончилась неуспехом, преобразование выполняется с помощью страничной таблицы. Замена информации в ассоциативной памяти обычно осуществляется по алгоритму LRU для того, чтобы в ней накапливалась информация о наиболее часто используемых страницах. Если преобразование выполняется с использованием таблицы страниц, то полученная информация снова регистрируется в ассоциативной памяти. Ассоциативную память называют буфером предыстории трансляции.
Благодаря внедрению одинарной виртуальной памяти можно не освобождать непрерывные области памяти размером с программу. Таким образом, решаются проблемы ограниченности и фрагментации реальной памяти.
В одинарной виртуальной памяти в одно линейное пространство загружается множество программ (процессов). Начальный адрес загрузки процесса изменяется в соответствии с текущей стиуацией использования виртуального пространства. Поэтому в каждом процессе необходимо использовать настраиваемые программы, а для преобразования адресов необходим регистр настройки. В этот регистр помещается начальный виртуальный адрес программы. Виртуальные адреса операндов в программе начинаются с нулевого. Таким образом, фактический виртуальный адрес операнда получают путем добавления к адресу операнда внутри программы содержимого регистра настройки.
МУЛЬТИПЛЕКСНАЯ ВИРТУАЛЬНАЯ ПАМЯТЬ
В одиночной виртуальной памяти одно и то же линейное виртуальное пространство используется множеством процессов, поэтому данная система нс даст радикального решения проблемы защиты процесса и проблемы настраиваемости (relocation). Эти проблемы решаются с помощью мультиплексной виртуальной памяти, в которой каждому процессу отводится свое линейное виртуальное пространство. Принципиально она почти не отличается от одинарной виртуальной памяти, и главное отличие состоит в том, что для каждого процесса предусмотрена своя страничная таблица. В ЦП имеется регистр-указатель процесса (PPR), который показывает страничную таблицу текущего исполняемого процесса. Каждый раз при передаче управления из одного процесса другому операционная система обновляет содержимое этого регистра.
Так как в мультиплексной виртуальной памяти используются независимые виртуальные пространства со своими для каждого процесса страничными
таблицами, то ошибочное разрушение программ и данных некоторого процесса другим процессом невозможно. Кроме того, поскольку программа каждого процесса загружается в независимое виртуальное пространство, начиная с нулевого адреса, необходимость в настройке отпадает.
Наличие независимых виртуальных пространств в мультиплексной виртуальной памяти исключает возможность совместного использования несколькими процессами одной и той же программы. Такую возможность обеспечивает описываемое ниже двумерное пространство памяти.
ДВУХМЕРНОЕ ПРОСТРАНСТВО ПАМЯТИ
Систему с двумерным пространством называют еще системой сегментированной памяти. Такую систему удобно использовать, когда требуется, чтобы некоторую программу совместно использовали в качестве подпрограммы несколько процессов. Эту проблему можно решить, если единицей загрузки в основную память будет нс процесс, а программа, например основная, или подпрограмма, составляющие процесс. Каждая (под) программа фактически состоит из кодовой части, которая представляет собой последовательность команд, части данных и стековой части, используемой в качестве стековой области. Объектом совместного использования является только кодовая часть. Поэтому фактически единицей загрузки является нс подпрограмма, а кодовая, информационная или стековая часть. Подобные логические единицы программы называются сегментами.
В системе с двухмерным пространством каждому процессу отводится двухмерное виртуальное пространство (рис. 6.16). Это пространство представляет собой совокупность линейных пространств переменной длины, в каждое из которых помещается сегмент подпрограммы, поэтому такое линейное пространство также называется сегментом. Виртуальный адрес определяется номером сегмента и адресом внутри сегмента.
Для преобразования двухмерного пространства в линейное пространство используется сегментная таб-
Виртуальный адрес
Виртуальное пространство сегмента i
Рис. 6.16. Двухмерное виртуальное пространство памяти.
Номер АдресРегистр базы сегментной
сегмента внутри сегментатаблицы (РБСТ)
Рис. 6.17. Преобразование адресов с помощью сегментной таблицы.
RWX: режим доступа (чтение/запись/выполнение); L — размер сегмента; F — бит достоверности.
лица (рис. 6.17). В адресе s сегментной таблицы хранится информация, относящаяся к сегменту S. В эту информацию входит поле RWX, указывающее, какой тип доступа разрешается к сегменту S (чтение/за- пись), флаг F, показывающий, содержится или нет сегмент S в основной памяти, размер L сегмента S
Процесс] РБСТ1Процесс 2 РБСТ2
Рис. 6.18. Совместное использование сегмента несколькими процессами.
и начальный адрес сегмента. Если F = 1, то в поле начального адреса помещается адрес из основной памяти, а если F = 0, то в это поле помещается адрес диска. Выборка и замена сегментов выполняется аналогично выборке и замене страниц. Реальный адрес определяется путем добавления к начальному адресу, полученному из таблицы сегментов, адреса внутри сегмента.
На рис. 6.18 показан пример совместного использования сегмента несколькими процессами. Номер сегмента может устанавливаться в каждом процессе независимо от других.
Однако когда сегментированная память используется для отображения двухмерного виртуального пространства на реальное пространство, возникает проблема фрагментации. Решением этой проблемы является использование сегментированной системы для
отображения двухмерного виртуального пространства на линейное (одномерное) виртуальное пространство, а затем использование мультиплексной системы виртуальной памяти для отображения линейного прост-
Рис. 6.19. Система со страничными сегментами, использующая буфер предыстории трансляции.
ранства на реальное пространство. Подобная система называется системой памяти со страничными сегментами. В этом случае для получения реального адреса необходимы доступы к сегментной таблице и страничной таблице, поэтому преобразование адреса требует много времени. Для сокращения времени преобразования адресов предлагается использовать ассоциатив-
ную память, выполняющую роль буфера предыстории трансляции (TLB) (рис. 6.19) аналогично тому, как это было описано в разд. 6.3.1.
АРХИТЕКТУРА ОБЩЕЙ ПАМЯТИ
Существуют два типа архитектур общей памяти: архитектура с совместно используемым физическим пространством, в котором независимые логические виртуальные пространства отображаются на одно физическое пространство памяти — типа описанных выше мультиплексной виртуальной памяти или двухмерного пространства памяти, — и архитектура с совместно используемым логическим пространством, предназначенная для параллельной обработки, в которой используется несколько ЦП для совместной обработки в пределах одного логического пространства. В этом разделе рассмотрены оба типа архитектуры.
В свою очередь совместное использование логического пространства может включать случаи, когда все логическое пространство является общим, а также случай, когда лишь часть пространства является общей. Кроме того, к каждой совместно используемой области запись может быть разрешена как только для одного ЦП, так и для всех ЦП.
ОЗУ, которое обычно используется в основной памяти, нс предусматривает возможности одновременного обращения по двум разным адресам. Память, у которой существует только один порт доступа, называется однопортовой памятью. Все традиционные элементы памяти являются однопортовыми. Однако в последние годы в суперкомпьютерах стали частично использовать быстродействующие- элементы памяти, имеющие несколько портов считывания/записи. Подробности, касающиеся структуры таких элементов, еще нс опубликованы, отмстим лишь, что обычная ячейка МОП-памяти, используемая для хранения 1 бита информации, имеет структуру, показанную на рис. 6.20. В отличие от использования одной словарной шины и одной шины данных (в КМОП-памяти — две шины данных) в многопортовой ячейке число
этих линий кратно числу портов, поэтому ее структура гораздо сложнее. Подобный элемент памяти называется элементом многопортовой памяти [21]. В настоящее время исследуется возможность увеличения емкости памяти этих элементов.
Построение совместно используемого логического пространства большого объема памяти на многопор-
Рис. 6.20. Ячейка статической КМОП-памяти.
товых элементах проблематично с точки зрения стоимости. Поэтому предлагаются различные системотехнические подходы к построению многопортовой памяти на основе однопортовых элементов. Среди этих подходов в данном разделе будут рассмотрены сеть связи «процессор — память», мультиплексная кэшпамять и многопортовая страничная память.
СЕТЬ СВЯЗИ «ПРОЦЕССОР — ПАМЯТЬ»
Наиболее простой способ соединения ЦП с модулями памяти основан на использовании общей шины (рис. 6.21). Этот способ имеет две разновидности: соединение по одной шине и соединение с помощью мультиплексированной шины, при котором используется несколько шин. В частности, в последнем слу-
чае, если число шин равно числу ЦП, то каждый ЦП может владеть одной шиной. Такой способ соединения называется соединением с использованием индивидуальных шин. Тем нс менее в любом случае одновременный доступ нескольких ЦП к нескольким модулям памяти невозможен. Если возникает конфликт по доступу, то разрешается выполнение только одного из
М! М2 - -. MwМ! М2 - -. MwаабРис. 6.21. Соединение по шине.бРис. 6.21. Соединение по шине.м, м2м, м2
М! М2 - -. Mw
М! М2 - -. Mw
а
а
б
Рис. 6.21. Соединение по шине.
б
Рис. 6.21. Соединение по шине.
м, м2
м, м2
них, а все остальные ожидают своей очереди. Если индивидуальных шин нет, то одновременное использование двумя и более ЦП одной шины невозможно. Каждая шина снабжена арбитром шины, который принимает запросы на пользование шиной, передаваемые из ЦП, и упорядочивает их для предотвращения конфликтов из-за одновременного пользования шиной несколькими ЦП.
Одним из средств, наиболее широко используемых для реализации связи «процессор — память», является многоуровневая сеть связи. Эта сеть связи имеет N входных и N выходных терминалов; между N входами и Л/- выходами существует многоуровневая структура, причем каждый уровень состоит из группы коммутаторов. Управляя коммутаторами каждого уровня, можно соединять между собой нужные терминалы. Связь между входными и выходными
терминалами может быть как односторонняя, так и двухсторонняя. Если для соединения процессора с памятью используется односторонняя связь, то необходимы две сети: одна — для передачи данных записи и адреса, а другая — для приема данных считывания.
Многоуровневые сети связи бывают трех типов: неблокирующие сети, неблокирующие сети с реконфигурацией и блокирующие сети. Блокировка возникает
Рис. 6.22. Матричный коммутатор.
при одновременном поступлении множества запросов передачи на один и тот же выходной терминал через один коммутатор. В неблокирующих сетях обычно возможна реализация соединения между любыми входными-выходными терминалами без изменения установки коммутатора, используемого для соединения между другими терминалами. К сетям этого типа относятся матричная сеть, сеть Клоша и др. В неблокирующих сетях с реконфигурацией также возможна реализация соединения между произвольными входными-выходными терминалами, но для этого необходимо изменить установку коммутатора и маршрут связи между соединенными терминалами. Примерами таких сетей являются сеть Бенеша, бито- нальная сеть, сеть «Мемфис» и т. д. В блокирующих сетях можно реализовать только из всех возможных комбинаций связи числом АЛ между N входными и N выходными терминалами. К блокирующим сетям относятся сеть «Омега», двоичная n-кубическая сеть, сеть Баньяна и др.
Матричная сеть. В матричной сети с N входами и М выходами, как показано на рис. 6.22, используется N2 коммутаторов и каждый вход можно соединять с любым выходом. Время задержки распространения сигнала между терминалами определяется только задержкой в одном коммутаторе. Матричная сеть относится к неблокирующим сетям.
Сеть Клоша [23, 24]. Сеть Клоша имеет структуру, показанную на рис. 6.23. Прямоугольниками на
пХттХтп
Рис. 6.23. Сеть Клоша.
этом рисунке обозначены матричные сети размерностью пХ^г» гХг или тХп соответственно. С помощью такой структуры можно реализовать сеть связи с N входами и N выходами, где N = пХ г. Обратите внимание, что при m ^ 2п—1 эта сеть становится неблокирующей сетью.
Сеть Бенеша [25, 26]. Сеть Бенеша с N входами и N выходами имеет симметричную структуру (рис. 6.24), в каждой половине которой между N/2 входными и N/2 выходными коммутаторами расположена такая же сеть Бенеша, но с N (2 входами и N/2 выходами. Коммутатор имеет два рабочих состояния, как показано на этом рисунке. Каждый входной коммутатор имеет две выходные линии, а каждый выходной коммутатор — две входные линии, из этих линий одна соединяется с верхйей сетью Бенеша, а другая — с нижней сетью Бенеша. Число уровней
коммутаторов от входа до выхода равно 21og2^—1, а общее число коммутаторов в сети равно ^(21og2^— -1)/2.
Несмотря на то что эта сеть относится к типу неблокирующих сетей с реконфигурацией, ее нельзя
Два состояния коммутатора
Рис. 6.24. Сеть Бенеша.
назвать полностью неблокирующей сетью. Кроме того, для установки коммутатора при последовательной обработке требуется время O^NlogN), поэтому динамическое изменение соединения невозможно. Для параллельной обработки был предложен алгоритм установки коммутатора за время O((log^)4), однако этот алгоритм практически нереализуем. Поэтому широкое распространение получил метод, по которому заранее вычисляется и запоминается установка
коммутатора для наиболее часто используемых комбинаций связи, и при изменении связи из них выбирается нужная комбинация сигналов установки ком* мутатора.
Сеть связи, использующая битональный сортировщик. Эта сеть [27] была рассмотрена в разд. 2.3, и если осуществлять сортировку по информации об адресе, которой снабжаются передаваемые данные, то можно реализовать передачу данных между нужными терминалами. Число (уровней) коммутаторов равно log TV (log TV + 1)/2, а общее число коммутаторов равно N log Л^ (log + 0/4
Сеть «Мемфис». Как известно, если в сети Клоша (рис. 6.23) 2п — 1 > т ^ п, то она будет представлять собой неблокирующую сеть с (динамической) реконфигурацией [24]. Частный случай этой сети при т = п = г называется сетью «Мемфис». Сеть «Мемфис» была использована в системе GF-11, разработанной в Лаборатории Ватсона фирмы IBM.
Сеть «Омега» [29—31]. На рис. 6.25 показана 8-входовая 8-выходовая сеть «Омега». Сеть «Омега» обеспечивает перекрестное (shuffle) соединение с помощью группы коммутаторов log2M уровней. Общее число коммутаторов — AHog2Af/2, а общее число соединений, которые можно реализовать при помощи этой сети, равно 2^N iog2^/2)/2e эт0 число гораздо меньше, чем NV т. с. сеть «Омега» является блокирующей сетью.
Рассмотрим установку коммутатора для соединения входного и выходного терминалов, двоичное n-разрядное представление номеров которых есть соответственно ^апап-\ ... #i) и (bnbn-\ ... Ь\) для случая, когда N = 2”. При первом переключении входной терминал соединяется с терминалом (an-i^n-2 ... aian). Если первым коммутатором управлять таким образом, чтобы при «п®Ьл = 0 была прямая связь его входа с выходом, а при ап®Ьп = 1 — перекрестная связь, то требуемый вход будет соединен с терминалом (an-i«n-2 ... aibn). 18—1145
Повторив этот процесс n = log2^ раз, получим соединение входного терминала ^апап-\ ... ai) с выходным терминалом ^bnbn~\ ... 6i)1}.
Коммутаторы Коммутаторы Коммутаторы
Коммутаторы такого же типа, что и на рис. 6.24
Рис. 6.25. Сеть ’’Омега”.
Коммутаторы Коммутаторы Коммутаторы
Коммутаторы такого же типа, что и на рис. 6.24
Рис. 6.26. Косвенная /i-кубическая сеть.
Косвенная двоичная л-кубическая сеть [32, 33].
На рис. 6.26 показана 8-входовая 8-выходовая косвенная двоичная n-кубическая сеть. В этой сети, как
о При этом последовательно перебираются биты bi от i = п
до i = 1. — Прим. ред.•
показано на рисунке, последовательно расположены группа коммутаторов и сеть связи типа «бабочка», а на самом последнем уровне используется сеть с обратным перекрестным соединением. Фактически эта сеть представляет собой обращенную сеть «Омега». В этом можно убедиться, если соответствующим образом поменять местами коммутаторы в каждом уровне сети «Омега», за исключением первого и последнего.
Сеть Баньяна [34]. Если из косвенной двоичной n-кубической сети удалить сеть с обратным перекрестным соединением, расположенную на последнем уровне, то получим сеть, которая носит название сети Баньяна.
Сеть с базовой линией. Структура этой сети показана на рис. 6.27, из которого видно, что она
Коммутаторы Коммутаторы Коммутаторы
Коммутаторы такого же типа, что и на рис. 6.24
Рис. 6.27. Сеть с базовой линией.
совпадает с первыми log2W уровнями сети Бенеша, показанной на рис. 6.24. Если к последнему уровню этой сети добавить сеть с инверсной перестановкой бит, то получим так называемую /?-сеть. Сеть с инверсной перестановкой битов имеет фиксированные связи входного терминала ^апап-\ ... #i) с выходным терминалом («1^2 • •• «л)—сеть фактически представляет собой косвенную двоичную n-кубическую сеть. 18*
Конфликты и их предотвращение. При использовании многоуровневых сетей связи между процессорами и банками памяти возникают конфликты двух типов. Первый тип — это конфликты, возникающие при запросе доступа к одному и тому же банку памяти от двух и более процессоров. Каждый банк памяти является однопортовым ЗУ, и одновременно он позволяет обрабатывать только один запрос на доступ. В неблокирующих сетях и неблокирующих сетях с реконфигурацией не бывает конфликтов при доступе к банкам памяти. Однако из-за того, что установка коммутаторов в этих сетях связи сложна и требует много времени, они редко используются для соединения типа «процессор — память». В блокирующих сетях, несмотря на то что конфликты по доступу также отсутствуют, возможны случаи блокировки. То есть конфликт возникает в коммутаторе сети связи. То же самое имеет место и в других сетях связи.
Для того чтобы предотвратить возникновение конфликтов в коммутаторах, каждый коммутатор снабжают небольшим буфером. При возникновении конфликта только один запрос передается на следующий уровень, а остальные накапливаются в буфере в виде очереди, и если выход свободен, то ожидающие запросы последовательно пересылаются, начиная с головы очереди. Очередь.устанавливается для каждого выходного терминала.
Таким образом, если в сети связи, использующей коммутаторы с буферами ограниченного размера, приходят запросы на доступ к одному банку памяти сразу из нескольких портов, то заполняется буфер коммутатора самого последнего уровня, который соединен с этим банком, а также заполняется буфер коммутатора предыдущего уровня, который соединен с вышеупомянутым коммутатором. Затем заполняется буфер следующего в обратном порядке коммутирующего модуля и т. д., пока буферы всех предшествующих коммутаторов не окажутся заполненными. Таким образом, все запросы на доступ устанавливаются в состояние ожидания, причем нс только запросы доступа к какому-то одному банку, но и любые запросы от всех портов подвергаются такому же воздей-
ствию и устанавливаются в состояние ожидания. Это явление называется коробкой (hot spot contention), оно впервые было открыто и проанализировано Пфистером и Нортоном в 1985 г. применительно к сетям связи с перекрестным соединением [35]. Одна из серьезных задач, которые предстоит решить в будущем, связана с тем, как избежать этого явления.
МНОЖЕСТВЕННАЯ КЭШ-ПАМЯТЬ
Как уже было сказано в предыдущем разделе, для предотвращения конфликтов по доступу в системах многопортовой памяти, в которых множество однопортовых банков соединены через сеть связи, необходима очередь запросов. Кроме того, когда запросы на доступ к одному банку поступают сразу из
ПроцессорыЛокальные кэш-памятиСеть связиОбщие банки памятиПроцессорыЛокальные кэш-памятиСеть связиОбщие банки памятиРис. 6.2. Мультиплексная кэш-память.Рис. 6.2. Мультиплексная кэш-память.
Процессоры
Локальные кэш-памяти
Сеть связи
Общие банки памяти
Процессоры
Локальные кэш-памяти
Сеть связи
Общие банки памяти
Рис. 6.2. Мультиплексная кэш-память.
Рис. 6.2. Мультиплексная кэш-память.
нескольких портов, то нс только они, но и запросы от всех портов упорядочиваются в очередь, т. с. возникает ситуация, когда состояние ожидания устанавливается для всех портов.
Для решения этой проблемы предлагается установить для каждого ЦП локальную кэш-память (рис. 6.28). Эта система называется архитектурой множественной кэш-памяти. В любой системе общей памяти: от системы соединения множества банков памяти через многоуровневую сеть связи до соединения отдельных банков памяти по одной общей
шине можно использовать метод множественной кэш-памяти.
Главной задачей каждой локальной кэш-памяти является снижение частоты доступа к общей памяти за счет сохранения копии данных, к которым однажды было обращение, в кэш-памяти. При использовании множественной кэш-памяти копия содержимого некоторого адреса основной памяти сохраняется во многих кэш-памятях, и когда один из ЦП автономно обновляет это содержимое, одинаковость копий (согласованность) нс обеспечивается [36, 37]. Используя метод обновления основной памяти, изложенный в разд. 6.2.3, можно достичь одинаковости содержимых каждой кэш-памяти и основной памяти, но согласованность между разными кэшами нс обеспечивается.
Одним из способов решения этой проблемы является считывание в кэш-память только тех данных, которые нельзя обновить при обычном доступе к общей памяти. Этот способ позволяет понизить частоту доступа к основной памяти и частоту возникновения конфликтов только в отношении постоянных данных (только для чтения).
Для того чтобы в кэш-памяти можно было хранить копии обновляемых данных, необходим динамический контроль согласованности. Один из методов такого контроля описан ниже. В случае обновления некоторым процессором Р в кэш-памяти копии данных адреса х общей памяти он сначала сообщает всем остальным процессорам, что копия из адреса х является неправильной, записывает в общую память значение после обновления, ожидает прихода от других процессоров сигнала подтверждения, после чего переходит к следующей обработке. Этот метод неэффективен^ точки зрения использования метода сквозной записи и с точки зрения необходимости сообщения всем процессорам об обновлении копии. Для решения этих проблем предлагается метод передачи обновленного значения в другие кэш-памяти, которые имеют копии обновленных адресов, а также метод, по которому к каждой копии в кэш-памяти добавляется теговая информация, которая показывает, существуют или нет другие кэш-памяти, содержащие эту копию,
и в случае обновления — необходимо или нет сообщать об этом другим кэш-памятям.
Для сравнения возможностей этих способов необходимы количественные данные относительно комбинаций доступа к общему пространству памяти для чтения и записи и соответствующая аналитическая модель, но в настоящее время эта проблема слабо изучается.
МНОГОПОРТОВАЯ СТРАНИЧНАЯ ПАМЯТЬ
В системе, имеющей множественную кэш-память, доступ к общей памяти осуществляется поблочно. Когда доступ к памяти выполняется нс словами, а блокамй, можно построить многопортовую память, в которой нс используются лишние копии, нет конфликтов и нет необходимости в механизме ожидания. Такая система памяти была предложена Танакой в 1984 г. [38].
На рис. 6.29 показан пример способа построения многопортовой страничной памяти. Эта система состоит из трех структурных составляющих: множества банков памяти, многоуровневой сети связи и контроллера сети связи. В качестве многоуровневой сети можно использовать различные типы сетей, но в данном случае показан пример с использованием коммутатора с одним входом и двумя выходами. Этот коммутатор соединяет линии на основании управляющих сигналов «О» и «1», как показано на рисунке. Из контроллера сети связи выходит по одной линии одноразрядного управляющего сигнала на каждый уровень, т. с. все коммутаторы одного уровня соединяют линии по управляющему сигналу для этого уровня. Число портов равно степенц 2 (2Л). Из контроллера сети связи периодически посылаются двоичные п-разрядные управляющие сигналы от 0 до 2Л—1, где самому старшему разряду соответствует управляющий сигнал самого верхнего уровня. Следовательно, порт i может быть последовательно соединен с каждым из банков Z, Z+L • 2"—1, 0, ... ..., i—1. При этом конфликтов по доступу к банкам нс возникает.
Рис. 6.29. Многопортовая страничная память.
Размер блока выбирается равным или кратным 2", а адреса памяти распределяются таким образом, чтобы было чередование банков, как показано на рисунке. Допустим, что, когда управляющий сигнал сети связи равен двоичному n-разрядному числу /, из порта I запрашивается доступ к блоку Ь. При этом порт i соединяется с банком, имеющим номер (I + /) (mod 2") !\ в котором хранятся данные адреса (Z +/) (mod 2") из блока b и к которому возможен доступ. После этого можно последовательно выполнять доступ к данным адресов (/ + j + 1) (mod 2”), (t+j
° /((mod/) (k, I — целые) означает любое число, которое дает при делении на / тот же остаток, что и при делении к на /. — Прим. ред.
+ / + 2) (mod2"), .(Z + у + 2"—l)(mod2") без конфликта с другими портами. По окончании выполнения шагов, число которых равно числу слов в блоке, доступ ко всем адресам в этом блоке завершается. Эта обработка выполняется независимо от других портов, поэтому конфликтные ситуации и очереди полностью отсутствуют.
Помимо того что многопортовую страничную память можно использовать в качестве общей памяти системы с множественной кэш-памятью, ее можно использовать и в качестве многопортовой дисковой кэш-памяти.
АРХИТЕКТУРА ИНТЕЛЛЕКТУАЛЬНОЙ ПАМЯТИ
По мере расширения области применения компьютеров— от выполнения операций над числами до обработки и использования интеллектуальной информации и знаний — становилось ясно, что одними лишь мерами по увеличению быстродействия и расширения функциональных возможностей устройств обработки, а также увеличением быстродействия памяти уже нс обойтись. Поэтому стали нарастать темпы и объем исследований по интеллектуализации памяти и расширению Се возможностей. В данном разделе рассмотрены три разновидности архитектур интеллектуальной памяти: ассоциативная память, память семантических структур и память продукций.
АССОЦИАТИВНАЯ ПАМЯТЬ [39—41]
Структурная схема ассоциативной памяти показана на рис. 6.30. Блок памяти разбит на слова, т. е. память хранит информацию в виде множества слов. Регистр данных, регистр маски и выходной регистр имеют размер одного слова. В регистре обратной связи и рабочем регистре каждому слову блока памяти соответствует однобитовая ячейка. Ассоциативная память выполняет функции поиска, считывания и записи данных. В регистр данных и регистр маски можно только записывать данные, а из выходного регистра— только считывать данные.
Если указывается режим поиска информации, то используются заранее установленные значения в регистрах данных и маски. А именно, среди всех данных, хранящихся в блоке памяти, выбираются слова, которым соответствуют биты регистра обратной связи, равные 1, и для этих слов сравнивается, равны или нет значения всех разрядов, указанных регистром маски, значениям тех же разрядов регистра
Регистр данных
Регистр маски
Рис. 6.30. Ассоциативная память.
данных, и единица в регистре обратной связи, соответствующая слову, нс совпавшему с содержимым регистра данных, сбрасывается в нуль. В итоге поиск выполняется во множестве слов, указанных регистром обратной связи, и в нем остаются биты только тех слов, которые удовлетворяют условию.
Если указывается режим считывания, то сбрасывается самая старшая единица регистра обратной связи, а слово внутри блока памяти, соответствующее этому разряду, считывается в выходной регистр. Повторяя эту операцию, можно последовательно считать все слова, указанные регистром обратной связи.
Если указывается режим записи, то из всех разрядов всех слов, указанных регистром обратной свя-
зи, значения, указанные регистром маски, записываются во все разряды регистра данных.
Помимо этих режимов (функции) используется также функция установки 1 во все ячейки регистра обратной связи и т. д.
Сравнение слов памяти с содержимым регистра данных может выполняться как параллельно, так и последовательно. В полностью параллельной ассоциативной памяти все сравнения выполняются одновременно. В системе с параллельным сравнением разрядов (последовательным сравнением слов) сравнение выполняется по одному слову. В отличие от этого в системе с параллельным сравнением слов (последовательным сравнением разрядов) сравнение выполняется последовательно по одному разряду, но для всех слов одновременно. Ассоциативная память с параллельным сравнением слов или разрядов нс является полностью ассоциативной памятью, поэтому се называют квазиассоциативной памятью или ассоциативным процессором.
Процессор STARAN фирмы Good Year — матричный ОКМД-процессор, способный выполнять ассоциативный поиск с параллельным сравнением разрядов (последовательным сравнением слов) и наоборот, т. с. с параллельным сравнением слов и последовательным сравнением разрядов [42—44]. Общая память системы STARAN состоит из 256 банков, каждый размером 1 бит X 256 слов, и соединяется с 256 процессорами при помощи сети связи, называемой флип-сетью. Бит В слова с адресом W хранится в ячейке В банка памяти С, который определяется следующим образом: С = B^W. Исходя из этого, W удовлетворяет условию W = В^С. Все значения — С, В и W — являются 8-разрядными. Допустим, что правило адресации, с помощью которого определяется В, есть B = G®(MC), где G и М — также 8-разрядные сигналы. МС — это логическое произведение каждой пары битов М и С. Сигналы G и М называются соответственно сигналами глобального адреса и сигналами режима доступа. Из W = В^С и B = G^ ф(Л4С) получим IT=G®(AfC). Здесь М означает инверсию бита М. Флип-сеть соединяет каждый банк
памяти С с процессором Р, где P = G®C. Отсюда получаем, что C=G®(A1C), а из этого равенства и из равенства 1T = G©(A1C), B = G®(A4C) получим
№ = (MG)®(MP),
В = (MG)© (MB).
Если М = 11111111, то № = G, В = Р, т. с. к 256раз- рядам слова с адресом G выполняется параллельный доступ из 256 процессоров. Если М = 00000000, то W = Р, 6 = G и к 256-му разряду 256 слов выполняется параллельный доступ из 256 процессоров. Кроме этих значений могут быть другие значения М, в этих случаях также будет выполняться параллельный доступ.
ПАМЯТЬ СЕМАНТИЧЕСКОЙ СТРУКТУРЫ
Одним из средств представления знаний в системах обработки знаний является семантическая сеть [45]. Это граф, который, как показано на рис. 6.31, имеет семантическую структуру. Если поместить по
добную семантическую структуру в память для обработки одним процессором, то на ассоциативный поиск вершины, соответствующей определенному понятию, и поиск всех вершин, которые имеют с ней определенную семантическую связь, требуется много времени. Однако если каждую вершину сети снабдить процессором и реализовать связь между ними с помощью межпроцессорной сети связи, то управление
подобной семантической сетью и ассоциативный поиск в ней можно будет выполнять параллельно аппаратным путем, что позволит значительно повысить скорость обработки.
Такая система была впервые предложена Фалма- ном в 1979 г. [46]. Планировалось, что в машине, названной NETL, в каждом узле семантической сети будет расположен процессор и связь между процессорами будет осуществляться через сеть связи, называемую «жесткой сетью».
После этого в 1981 г. Д. Хиллисом из МТИ была спроектирована «Машина соединений» (Connection Machine), выпуск которой налажен в настоящее время фирмой Thinking Machines [47,48]. Эта машина состоит из 65 536 ячеек, каждая из которых содержит память емкостью 4096 бит и одноразрядное АЛУ. На одном кристалле размещены* 16 таких ячеек, которые вместе с маршрутизатором образуют один узел двоичной 12-кубической сети. Двоичная п-кубическая сеть представляет собой сеть связи, состоящую из 2Л узлов; каждая вершина n-мерного гиперкуба является узлом этой сети, а каждое ребро — двухсторонней линией связи.
Главная ЭВМ и Машина соединений соединяются друг с другом при помощи двух шин: шины памяти, используемой для связи каждой ячейки с памятью, и глобальной шины, по которой в главную ЭВМ передаются результаты опроса состояния каждой ячейки.
При работе совместно с Лисп-машиной целью Машины соединений является параллельное выполнение ассоциативной обработки списков. Для этого в качестве базовой структуры данных была использована структура Xector (Ксектор). Эта структура представляет собой совокупность элементов, состоящих из пар ((индекс)-> (значение)), и описывается в виде {банан-> желтое яблоко-> красный}. Параллельные операции со структурой Xector определяются a-операцией и 0-операцией. а-Операция параллельно использует операции с каждым элементом одного индекса, например:
(а+ ЧА — 15-^2} ’{А—>-3 В->4})^{А->4 В—>6},
а с помощью p-операции получают одно значение, используя операции со всеми значениями структуры Xector, например:
(Р+ ’{Д^1 В->2 С^3})=^6.
В Машине соединений ассоциативный поиск при выполнении этих операций и само применение операций выполняются параллельно.
ПАМЯТЬ ПРОДУКЦИЙ
В тех случаях, когда нельзя достаточно проанализировать структуру и характер проблемы и нельзя алгоритмическим путем решить проблему, необходимо использовать способы решения проблем применительно к конкретным случаям. Для описания подобной обработки широко используются продукции (правила логического вывода). Программа при этом описывается в виде совокупности продукций. Каждая продукция имеет условную и заключительную части. При выполнении программы используется рабочая память, содержимое которой изменяется в процессе обработки. При каждом шаге сравниваются условные части всех продукций с содержимым рабочей памяти и выбирается та продукция, условие которой удовлетворяет содержимому памяти. Если оказалось, что таких продукций две и более, то по заранее определенной стратегии выбирается одна из них, выполняется заключительная часть этой продукции и обновляется содержимое рабочей памяти. Например, правило «Если завтра в некотором городе штата Нью-Йорк нс будет дождя, то в этот город завтра можно будет совершить экскурсию» выглядит следующим образом:
(р сдслать-возможный-экскурсия)
(город | имя <х> штат Нью-Йорк)
-(погода-прогноз | место <х> дата завтра | пого- . да дождливая)
->(сделать-возможный-экскурсия f вместо <х> f дата завтра).
Смысл этого правила заключается в том, что если в рабочей памяти зарегистрирован элемент (город|
имя <х> t штат Нью-Йорк) и для того же значения х в памяти отсутствует элемент (погода-прогноз f место <х> дата завтра f погода дождливая), то в нее будет записан элемент (сделать-возможный-экскур- сия f место <х> f дата завтра.
Для того чтобы ускорить выполнение подобной обработки, необходимо с высокой скоростью выполнять сопоставление всех элементов в рабочей памяти со всеми продукциями. Алгоритм сопоставления RETE предполагает упорядочение в виде сети всех промежуточных результатов повторно выполняемого сопоставления и их накапливание. При необходимости сопоставления обработка ограничивается только теми частями, которые были обновлены при обработке предыдущих заключительных частей продукции. Таким образом, этот метод позволяет сократить объем вычислений [49].
Для еще большего увеличения скорости необходимо использовать методы параллельного сопоставления или ассоциативного сопоставления. Этой цели отвечают системы САР — матричный, секционно-разрядный ОКМД-процессор американской фирмы ITT, и DADO Колумбийского университета, в каждом узле двоичного дерева которой расположен процессор. В основном используются методы, аналогичные тем методам, которые используются в ассоциативной памяти, ассоциативных процессорах, машинах баз данных и т. д.
Глава 7
ЯЗЫКИ ИСКУССТВЕННОГО ИНТЕЛЛЕКТАИ МАШИНЫ ИСКУССТВЕННОГО ИНТЕЛЛЕКТА
Существенное отличие сферы искусственного интеллекта (ИИ) от других приложений вычислительной техники заключается в том, что при попытке решить некоторую задачу возникают довольно сложные проблемы, связанные с проектированием и составлением необходимых для этого программ, что неизбежно приводит к значительным изменениям как в программах, так и в используемых в них структурах данных. Это обусловлено тем, что в сфере ЙИ объектами являются почти неформализуемые задачи, структуры и атрибуты которых невозможно с самого начала четко проанализировать. Главной целью исследований в сфере ИИ является рассмотрение в качестве задач объектов с подобными нечеткими структурами и атрибутами, с тем чтобы сделать их четкими.
Кроме того, задачи, решаемые в сфере ИИ, нс предусматривают обработки данных с фиксированной структурой, например отдельных численных значений или матриц численных значений. В этой сфере чрезвычайно важное значение имеет обработка отношений между данными. При этом нужно отмстить, что эти отношения претерпевают существенные изменения в ходе выполнения программы.
Языки искусственного интеллекта призваны обеспечить простоту подобных модификаций программы и данных и, в частности, сделать более простым описание операции модификации структуры данных. Однако помимо языка, обеспечивающего простоту составления программы в задачах искусственного интеллекта, необходима система (называемая средой программирования) поддержки составления и разработки программного обеспечения, в функции которой входили бы написание программы, проверка правильности ее выполнения, быстрое исправление тех мест
программы, где имеют место ошибки, и ее повторное выполнение.
В данной главе рассматриваются типичные языки искусственного интеллекта — Лисп и Пролог, их особенности, а также описываются структуры машин, позволяющие с большей эффективностью использовать эти языки.
ЯЗЫК ЛИСП И ЛИСП-МАШИНА
Все данные, которые способны обрабатывать вычислительные машины, можно разделить на две категории: числовые данные и нечисловые данные. В научно-технических расчетах и коммерческой деятельности объектами обработки являются главным образом числовые данные — целые и вещественные числа, матрицы и т. п. Однако при решении задач искусственного интеллекта в отличие от численных расчетов необходимы накопление в ЭВМ и обработка в виде символов всевозможных понятий, которыми мы оперируем, окружающих нас предметов, а также отношений между предметами. Эти предметы и отношения между ними мы обычно выражаем словами, поэтому и в машине они представлены нс как численные значения, а как нечисловые данные, другими словами, символьные данные. Обработка символьных данных отличается от обработки простых данных типа отдельных числовых значений или фиксированных матричных структур этих значений. Это отличие заключается в том, что обрабатываемые данные имеют сложную структуру, динамически изменяемую в ходе обработки. Нечисловые, символьные данные, имеющие подобную структуру, называются списковыми данными, а обработка списковых данных называется символьной обработкой или обработкой списка. Разумеется, и при символьной обработке также необходимы бывают численные расчеты. Однако в отличие от числовой обработки, объектами которой являются только числа и главная цель которой заключается в быстром выполнении численных расчетов, главными целями символьной обработки являются представление отношений между предметами и i -1145
эффективная обработка этих отношений. Лисп, Пролог, Смолток и др. являются типичными языками, имеющими функции обработки списков.
Язык Лисп, как следует из его названия (List Processing — обработка списков), был спроектирован для символьной обработки. Иначе говоря, целью в данном случае является построение математически строгой модели на основе описываемых ниже понятий рекурсии и функций, с помощью которых в унифицированной форме представляются структуры данных, являющихся объектами обработки на ЭВМ, и их обработка и практическое использование этой модели. Механизм обработки языка Лисп можно рассмотреть на примере реализации на существующих ЭВМ системы лямбда-исчисления, описанной в гл. 4.
Язык Лисп был предложен примерно 25 лет назад Джоном Маккарти из МТИ (который ныне является профессором Станфордского университета) [1]. Впоследствии были разработаны новые версии этого языка — Maclisp [2] (МТИ) и Interlisp [3] (фирма «Ксерокс»), а в настоящее время разработаны языки Zetalisp [4] для Лисп-машин и стандартный язык Common Lisp на основе языков Maclisp и Zetalisp. Нужно отмстить, что помимо указанных существует множество других разновидностей языка Лисп, и в данной главе будут изложены основные отличительные черты, присущие всем этим разновидностям языка Лисп.
ТИПЫ ДАННЫХ И СТРУКТУРЫ списков
Данные, используемые в языке Лисп, имеют древовидную структуру (см. рис. 7.1). Древовидная структура — это концептуальное представление структуры данных, хранимых в памяти компьютера. Обычно на самом верхнем уровне этого дерева расположен корень, под ним расположены узлы, связанные с корнем через ветви, а под узлами расположены другие узлы, также соединенные с верхними узлами через ветви. Таким образом, узлы имеют иерархическую структуру, на самом нижнем уровне которой располагаются листья (это по сути является перевер-
нутым представлением обычного дерева). Это наиболее распространенная структура данных. Древовидная структура, в которой от каждого узла исходят
(((a.6),(cJ)).((a.c).(6.e)))
(a.(6.(c.(d.(e.nil)))).) ^ (a b с d е )
nil е
(((((nil.e).d).c).6).a)
Рис. 7.1. Структура данных списка (древовидная структура).
две ветви, называется бинарным деревом. Такое бинарное дерево называется списочной структурой, а данные, имеющие структуру бинарного дерева, называются списочными данными. Все данные, показанные на рис. 7.1, относятся к данным с древовидной бинарной структурой.
19*
Показанные на рис. 7.1 древовидные структуры в тексте программы представляются с помощью скобок, например, следующим образом:
(((ШЛЫ)М к (Й. (С. «К nil))))) (((((nil.e).d).C).6).a)
Такое представление называется S-выражением (здесь S — аббревиатура от слова symbolic (символьный)). В языке Лисп все данные используются в виде списковых данных и представляются с помощью S-выражения. Обращение с программой, написанной на Лиспе, такое же, как и со списковыми данными, поэтому программа представляется с помощью S-выражения.•
Связи между типами данных, используемых в языке Лисп, показаны на рис. 7.2.
" 1 • Си MlL Числа" 1 • Си MlL ЧислаS-выражение —i Атом —।— Символы
" 1 • Си Ml
L Числа
" 1 • Си Ml
L Числа
|-|— Целые числа
■— Списки .■— Списки .с плавающей точкойс плавающей точкой*— Числа
■— Списки .
■— Списки .
с плавающей точкой
с плавающей точкой
Рис. 7.2. Типы данных, используемых в Лиспе.
Числа подразделяются на целые числа и десятичные дроби. Целые числа нс содержат десятичной точки, например: 7, —245, 3, 345 и т. п. Десятичные дроби в отличие от целых чисел имеют представление 3.0, — 216.0 и т. п.
В языке Лисп так же, как и в других языках, используются элементарные операции (типа четырех арифметических операций) для вычислений. Операции языка Лисп представлены в форме (<имя операции) данные данные...), т. с. с помощью S-выражения. (Рассмотренные в следующем разделе функции также представляются в подобной форме.) Под именем операции подразумевается символ (типа +, —, X, /, div, mod), означающий конкретную операцию. Например, (+ а Ь) означает а + Ь, (/(+ а Ь) (-^ с d))
означает (а + ^)/(с— d). Рассмотрим простой пример. (Л-^-В означает: «результатом выполнения операции Л является В»).
(+ 3 5)^8
(+ (X 3 2)( / 8 2))->(+ 6 4)—>10
Как видно из рис. 7.2, числа относятся к атомам, однако помимо них атомами считаются и последовательности символов, например abc, lisp, foo, q 123, first и т. д., которые называются символьными атомами. В более строгом смысле списком можно назвать данные, представление которых начинается со скобки и заканчивается скобкой, а между скобками расположены ненулевые атомы или списки. Например, все приведенные ниже выражения являются списками:
nil (1)
(а. (6. (с. nil))) (2) (а (1. (6. (ааа. (4. (5. nil)))))) (3) (а. «а ())). «аДЬ. (с. ()))()))) (4) ( ) (5) (а b с d) ’ (6) (al b (а а а 4 5)) (7) (а ШаЬс^ )) (8) ((а (6 (с de^aaWbb^ (9)
В самом первом примере nil скобки отсутствуют, он называется пустым списком, и иногда вместо nil можно записать ( ). Разумеется, (+a(Xcd) (/123.31 0.003) также является S-выражением и (Я люблю девушку (хорошенькую и привлекательную)) также является S-выражением.
Как правило, последовательность двух списков также является списком. Например, последовательность двух списков а и b представляется как (а, Ь) (операция соединения двух списков называется cons, она является важной элементарной операцией в обработке списков, см. следующий раздел). Если
подобная объединенная структура используется в старом представлении, то она содержит большое число точек и скобок и становится трудночитаемой, поэтому возникла необходимость в сокращении числа точек и скобок. Правило сокращения для произвольных списков а и b определяется следующим образом:
(a.nil)->(a)
(я. (6. nil))-* (я 6)
Следуя этому правилу, список (ае (6е (се (de ( ))))) можно преобразовать к виду (a b с dy а ((а b су (1 2 3 4)) можно преобразовать к виду Ца b с) 1 2 3 4). Представление, в котором используются точки, называется точечным представлением, а представление, в котором точки нс используются,— списочным представлением. В точечном представлении более понятно соответствие древовидной структуре, поэтому его особенно удобно использовать в тех случаях, когда внутренняя структура данных является сложной. Тем нс мснсс из-за большого числа скобок оно становится трудночитасмым, поэтому часто используют списочное представление, не содержащее точек. Разумеется, допускается использование и списочных представлений, содержащих точки, например:
(a b c.d")
(((я 6 с). (1 2 3 4 б^Дд хуДх у 2)))
ФУНКЦИИ
В языке Лисп все операции с данными выполняются при помощи функций, и все программы, написанные на Лиспе, носят название функций. К функциям относятся встроенные изначально в Лисп- систему функции, а также функции, определенные пользователем.
Встроенные функции принято называть базовыми В частности, упомянутые выше операции над числовыми значениями являются базовыми функциями. К базовым функциям помимо этих операций относятся функции, используемые для операций над списко-
выми данными (составление списка, разделение списка, проверка выполнимости условий списка и др.).
Базовые функции для операций со списками можно разделить на три класса: cons, саг и cdr. Комбинируя между собой базовые функции этих трех видов, можно выполнять сколь угодно сложные операции со списковыми данными.
Функция cons, cons является функцией двух аргументов. Запись (cons XY) означает создание нового списка путем соединения двух списков, X и У. Здесь X и У— переменные. Например, если Х=^аЬ^ У = = (cd), то (cons X У) -> ((a b\ (с d)) (здесь знак равенства, например в Х = (а&), означает, что значение переменной X является списком (аЬ), а стрелка в А -> В означает, что результатом выполнения А является 6). Если X и У представлены с помощью следующих S-выражений:
Х = LAMBDA,
У = ((x)(cadr)),
то с помощью функции cons составляется следующее S-выражение (программа):
(consX У)-> (LAMBDA (x)(cadr х))
Функция саг. саг является функцией одного аргумента, которым является список. Запись (сагХ) означает выборку головного элемента списка X. Если X = (а b с), то (саг Х^^ а.
Функция cdr. cdr также является функцией одного аргумента, которым является список. Результатом выполнения функции (cdr X) являются элементы списка X, за исключением головного элемента. Например, если X=^ab^, то (cdrX)-^b. Если список содержит только один элемент, например Х=(а), то результатом (cdr X) является список X без этого элемента, другими словами, пустой список. Результатом выполнения функций cdr и саг над пустым списком является ошибка, но, в данном случае для удобства результатом будем считать также пустой список. Другими словами, (саг nil)—nil и (cdr nil)->- —nil.
Поскольку саг означает извлечение головного элемента списка, a cdr — список без головного элемента, то (саг (consX У))-^Х, a (cdr(consX У))-> У. Обратите внимание на этот факт.
Базовые предикатные функции. Для реализации сложной обработки необходима оценка условия. В табл. 7.1 приведены базовые функции, используемые для оценки истинности условий (эти функции называются предикатными функциями). Если условие удовлетворяется, то результатом выполнения предикатной функции является t (true — истина), а если нс удовлетворяется, то — nil. Иначе говоря, t означает истина, a nil — ложь.
Таблица 7.1. Базовые функции для оценки условия
ИмяЧисло
функцииаР7“е-
Смысл
atom1
equal2
Истина, если аргумент — атом
Истина, если аргумент такое же S — выражение
null1
numberp1
Истина, если аргумент — nil или ( ) Истина, если аргумент — атом цифрового типа
>2
=2
<2
гегор1
minusp1
Истина, если выполняется неравенство
Истина, если выполняется равенство Истина, если выполняется неравенство
Истина, если аргумент — 0
Истина, если аргумент — отрицательное число
not1
andЛюбое
Истина, если аргумент — ложь (nil) Истина, если все аргументы — истина (не nil)
or
Истина, если хотя бы один аргумент — истина
Примечание. В таблице показаны только основные функции, хотя на самом деле число этих функций значительно больше.
Оценка списка и кавычки. Поскольку список рассматривается как часть всей программы, являющейся S-выражением, то при выполнении Лисп-программы объектом обработки является в некотором смысле все S-выражение (при выполнении S-выра-
жения определяется его значение). Выполнение S-выражения и определение его значения называются оценкой S-выражения. При оценке S-выражения сначала оцениваются структурные элементы этого выражения, а затем на основе полученного результата осуществляется оценка всего S-выражения. Например, при оценке (саг х) сначала оценивается х. При оценке х, рассматриваемой в качестве переменной, отбираются значения этой переменной и для них определяется функция саг. В случае (сагаб) ab также рассматривается как переменная и определяется ее значение.
Итак, рассмотрим, что означает запись (саг(а& с)). Поскольку (а b с) также считается S-выражением, то выполним оценку ^abcY В данном случае (а b с) интерпретируется как функция а с двумя аргументами: b и с. Однако если (.а b с) являются только данными, то такой подход нс годится. Для того чтобы показать, что (a b с) нс функция, а данные, перед ними ставится кавычка (’), т. е. представление имеет вид ’(ab с).
Таким образом, (саг Ца b с) )-* а. Кроме того, (car(cdr nil))-> nil, a (car’(cdrnil))-^cdr. То есть необходимо обратить внимание на тот факт, что смысл записи с кавычками совершенно отличается от записи без кавычек.
Если то, что значение является данным,— очевидный факт, то необходимость в использовании кавычек отпадает. Например, в числовом атоме, а также значениям nil и t кавычки не нужны.
Атрибуты атомов и ассоциативная обработка. Как правило, предметы имеют свои атрибуты. Например, атрибутами человека являются имя, возраст, фамилия, имя отца, матери и т. д. В случае если предметом является яблоко, то его атрибутами являются старшие понятия (фрукт), цвет, вкус и младшее понятие (сорт) и т. д. В области *ИИ необходимо запоминать подобные атрибуты в качестве атомов, а затем, извлекая нужные атрибуты, выполнять ассоциативную обработку. Для описания такой обработки в языке Лисп предусмотрены свои базовые функции. Это функции put и get.
Функция put имеет представление (put х’атрибут, значение). Это означает присвоение атому х атрибут ’attribute и значение ’value).
Функция get представляется в виде (get х’attribute). Это функция извлечения значения ’attribute атрибута, присвоенного атому х.
Например, если атрибутами атома Таро являются следующие: возраст — 20 лет, фамилия — Танака, имя отца — Масао, имя матери — Ханако, то эти атрибуты можно задать при помощи функции put следующим образом:
(put * Таро * возраст * 20)
(put * Таро * фамилия * Танака)
(put * Таро ’ отец * Масао)
(put * Таро * мать * Ханако)
Кроме того, с помощью функции get можно извлечь эти атрибуты:
(get ’ Таро ’ мать) -> Ханако
(get * Таро ’ возраст) -> 20
ОПЕРАТОР ПРИСВАИВАНИЯ
Для определения значения переменной осуществляется либо вызов выражения присваивания, использующего функцию присваивания setq, либо вызов функции, который будет рассмотрен ниже. Выражение присваивания имеет представление (setq ХЕ). Здесь Е — это произвольное S-выражение, результат выполнения которого присваивается переменной X (значение переменной X, т. с. результат выполнения является значением выражения присваивания, однако в самом этом выражении его значение нс используется). Например, запись
(setq X (+ 3 5))
означает, что значение X равно 8. Кроме того, если записать
(setq УЧа^Ь с) d))
(setq X (car(cdr У)))
(setq Z' (car (cdr У))),
то значение У будет равно (а (Ь с) d), а значение X — (Ьс). С другой стороны, значение 2 есть (car(cdr У)).
УСЛОВНОЕ ВЫРАЖЕНИЕ
Для составления программ, имеющих условный переход, используются условные выражения cond.
(cond ((условие 1) (выполнение 11) (выполнение 12) ...
(выполнение In))
((условие т) (выполнение ml)(выполнение m2)...
(выполнение mn)))
Такая запись означает, что для самого первого значения условия, которое было истинным, выполняются операции Л ... in. Например,
(cond (null Ху empty) (f non-empty)
означает, что если значением X является nil, то значением условного выражения является ’empty, в противном случае — ’noa-empty. Если перед выполнением этого выражения выполняется (setq X’(а 6 с)), то, поскольку значение X есть (а b с), значение условного выражения есть ’non-empty.
ОПРЕДЕЛЕНИЕ ФУНКЦИИ
В тех случаях, когда пользователь сам определяет функцию, ее основу составляют лямбда-выражение и функция Apply (применение). Их можно считать частными примерами реализации понятий лямбда- абстракции и применения функции в системе лямбда- исчисления, изложенной в гл. 4. Например, используя лямбда-выражение, функцию, определяющую произведение суммы и разности двух чисел, можно описать следующим образом:
(lambda (х у) (X (+ х цН~ х у)))
Для выполнения этого, используя функцию Apply, запишем
(apply ’ (lambda (х у^Х (+ х у) (— х у))) (7 4))
Выполнив эту функцию, получим
(X (+ 7 4)(- 7 4))—>(Х 11 3)-^33
Возможно, этот пример не дает полного представления о записи непосредственно исполняемых выражений, однако главная цель здесь — показать, что в основе понятия функции в языке функционального типа Лисп лежат лямбда-выражение и функция Apply. Например, если упомянутое выше лямбда-выражение подставить в переменную wasa и выполнить функцию Apply, используя эту переменную, то можно легко найти произведение суммы и разности двух произвольных чисел:
(setq wasa’(lambda (х у) (X (+ х у) (— х у^
(apply wasa (5 3))
(apply wasa (8 4))
Для большего понимания определения и выполнения функции используют так называемую функцию defun. С помощью этой функции пользователь может легко определять нужную ему функцию следующим образом:
(defun (имя функции)
((первый аргумент) (второй аргумент) ...
(n-й аргумент)) (тело функции))
Здесь (имя функции), а также (Z-й аргумент) выражаются атомами, а (тело функции) — с помощью произвольного S-выражения.
Кроме того, при выполнении определенной пользователем функции, так же, как и в случае с операцией, используется следующее представление:
((имя функции) (первый аргумент) ... (n-й аргумент)). Здесь (i-й аргумент) представлен S-выражением.
Например, если приведенное выше вычисление представить в виде
(defun wasa (х у) (X (+ х у) (— х у^
то можно определить функцию wasa, вычисляющую произведение суммы и разности чисел, задаваемых аргументами х и у.
Выполнение функции выглядит следующим образом:
(wasa 6 3) > (X (+ 6 3) (- 6 3))
->(Х 9 3)-> 27
(wasa (X 2 4) (+ 7 6))-> (wasa 8 13)
->(Х 21 - 5)->-105
Другим примером использования функции defun является определение функции third, извлекающей третий элемент списка, заданного аргументом х:
(defun third (х) (car(cdr(cdr х))))
Таким образом, если определенную пользователем функцию описать с помощью S-выражения следующим образом, то можно сразу же выполнить эту функцию:
(third’ (1 2 3 4 5))-> 3
(third’ (a b (s с) s d е b^ -> (s с)
РЕКУРСИЯ И ЦИКЛИЧЕСКОЕ ВЫПОЛНЕНИЕ ПРОГРАММ
Циклическую обработку на Лиспе или Прологе можно описать с помощью рекурсивной программы. Вопросы, касающиеся понятий и приемов, используемых в рекурсивных программах, являются чрезвычайно важными. В циклической программе обычно многократно выполняется часть программы, а в рекурсивной программе несколько раз вызывается и выполняется одна и та же функция. Рассмотрим для примера вычисление степени п целого числа т. В основу рекурсивной программы положим метод индукции, ’используемый в высшей математике.
Например, функцию power (m,n), показывающую степень п целого числа т, определим следующим образом:
если п = 0если п = 0power (m, n) = 1
если п = 0
если п = 0
= т X power (m, n — 1) если п > 0
В данном примере для определения функции power в правой части также используется функция power.
power (2,3)
2 ♦ power (2,2)
2 ♦ power (2,1)
2* power (2,0)
I
8« 2*4<—2*2^—2*b1
Рис. 7.3. Выполнение функции power (2, 3).
Таким образом, использование самой функции для определения этой функции называется рекурсией, а определяемая функция называется рекурсивной функцией.
При выполнении рекурсивной функции одна и та же функция вызывается несколько 'фаз и выполняется. Для простоты рассмотрим случай, когда т = 2, а п = 3. Процесс выполнения этой функции показан на рис. 7.3.
Представим функцию power в виде Лисп-программы:
(defun power (m n)
(cond ((zerop n) 1)
(t(X m (power m(— m 1))))))
Аналогично рекурсивная функция, вычисляющая сумму от 1 до п, может быть представлена в следующем виде:
(defun sum (n)
(cond ((zerop n)^ (f (+ n (sum m(— n 1))))))
ПРИМЕРЫ ПРОГРАММ
Рассмотрим несколько простых примеров программ. Поскольку на языке Лисп все программы представлены в виде функций, то и все приведенные примеры программ также представляются в виде функций.
Функция member. Функция member (s, /) определяет наличие S-выражения s в списке /. Идея здесь аналогична случаю с вычислением степени числа.
Если I— пустой список, то ответом является nil.
Если первый элемент списка I равен S-выражению s, то ответом является t.
Если первый элемент списка / нс s, то следует повторно использовать функцию member по отношению к результату применения функции cdr к /.
Если представить это в виде Лисп-программы, то получим
(defun member (е 1)
(cond ((null /) nil)
((equal (car /)) f) ' (f (member s (cdr 1)))))
Здесь (equal x y)—это функция, значение которой равно t, если х и у представляют собой одно и то же S-выражение.
Функция append.
Это функция соединения двух списков х и у и создания одного списка. Другими словами, при выполнении этой функции к концу списка х присоединяется список у. Например, если х = (аЬс), у = = (123), то append(х у)~+(а b с 1 2 3) (обратите внимание на тот факт, что действие этой функции
полностью отличается от функции cons. Так, в результате выполнения cons(x, у) получаем ((а b с), (12 3)), т. e. ((аЬс)123)). Смысл этой функции также можно легко понять, если рассматривать се с точки зрения рекурсии.
Если х — пустой список, то результатом является у.
Если х = ^а 1 а2 ... ап), а у = (Ы Ь2 ... Ьт), то append(х, у), т. с. (al а2 ... ап Ы Ь2 ... Ьт)
U Ы 2YU Ы 2Y(append (а Ь) (12))(append (а Ь) (12))(cons а(6 1 2))(cons а(6 1 2))(6 1 2)(6 1 2)(append (6 ) (1 2))(append (6 ) (1 2))(cons b (1 2))(cons b (1 2))(1 2)(1 2)(append ( ) (1 2))(append ( ) (1 2))7.4.7.4.Рис.
U Ы 2Y
U Ы 2Y
(append (а Ь) (12))
(append (а Ь) (12))
(cons а(6 1 2))
(cons а(6 1 2))
(6 1 2)
(6 1 2)
(append (6 ) (1 2))
(append (6 ) (1 2))
(cons b (1 2))
(cons b (1 2))
(1 2)
(1 2)
(append ( ) (1 2))
(append ( ) (1 2))
7.4.
7.4.
можно представить как присоединение к (а2 ... ... ап Ы Ь2 ... Ьт), полученному путем присоединения (Ы Ь2 ... Ьт) к (а2 ... ап), головного элемента al (т. е. аналогично функции cons).
Представим эту функцию в виде Лисп-программы: (defun append (х у) cond ((null х) у^
(t (cons (car х) (append (cdr x) #)))).
На рис. 7.4 показан пример выполнения для случая, когда х = (а Ь), а у = (1 2).
Функция подсчета атомов в списке. В списке ((a b с) (a ef) (1 2 1 4)) содержится 3 + 3 + 4 = 10 атомов. Таким образом, для подсчета общего числа атомов в некотором списке нужно сосчитать число
атомов в каждом подсписке, составляющем этот список, и сложить полученные значения. Например, если в приведенном выше списке принять х = (а b с), у = (а е f), 2 = (1 2 1 4), то, сосчитав число атомов в каждом списке х, у, z и сложив эти числа, получим 3 + 3 + 4 = 10. Как правило, список может включать несколько списков, поэтому его удобно представить с помощью рекурсивной функции. Для этого обычно используют функцию count языка Лисп и программа описывается следующим образом:
(defun count (s)
(cond ((null s) 0)
((atom s) 1) (/ (+ (count (car s)) (count (cdr s))))))
В данной программе показано, что если список s есть (si s2 ... sn) (где каждый si также является списком), то число атомов в списке si плюс общее число атомов в списке (s2 ... sn) есть общее число атомов списка s. В зависимости от того, какое значение у si —- atom или nil, выдастся значение 1 или 0. В том случае, когда si является списком, он также разбивается и проводятся аналогичные вычисления.
Функция выполнения одной и той же операции с каждым элементом списка. Зачастую приходится несколько раз использовать функцию f для каждого элемента ai списка типа (al а2 ... an), в результате чего получается также список типа (bl Ь2 ... Ьп), элементами которого являются f(ai)=bi. Классическим примером является определение суммы двух списков (иначе говоря, суммы двух векторов). Для этого в языке Лисп предусмотрена функция тарсаг, позволяющая выполнять операцию сразу со всеми элементами списка..
Например, для определения попарных сумм элементов двух списков х и у следует записать
(тарсаг* plus х у)
Для значений х = (1 234), у = (56 7 8) получим (тарсаг’ plus х у)->(6 8 10 12) 20—1145
Для создания пар элементов из двух списков следует записать
(mapcar’ cons’ (a b с d)1 (1 2 3 4))
при этом получим ((a 1)(6. 2) (с. 3)(de 4)).
Действие функции mancan такое же, что и mapcar, но в отличие от mapcar элементы, значение которых равно nil, отбрасываются и собираются только тс элементы, которые нс равны nil. Например, значение (mapcar ’eq’ (a b с d е) ’ (a b е d с)) равно (//nil /nil), а значение (mapcan ’eq’ (a b с de)' X Х^а b е d с)) равно (///).
ЛИСП-МАШИНА
Вычислительная машина, в которой реализованы методы, позволяющие с высокой скоростью выполнять Лисп-программы, называется Лисп-машиной [7]. Систему обработки языка Лисп можно реализовать и на обычной универсальной ЭВМ. Для обработки Лиспа на универсальной вычислительной машине применяют систему компиляции, которая транслирует Лисп-программу в машинную программу универсальной ЭВМ. В последние годы с развитием методов компиляции стала возможной довольно высокоскоростная обработка Лиспа на универсальных машинах.
В то же время разрабатываются и специализированные Лисп-машины, учитывающие особенности этого языка и позволяющие эффективно выполнять Лисп-программы. Независимо от того, будь то система компиляции или специализированная машина, для реализации высокоскоростной обработки языка Лисп необходимы (1) высокоскоростная обработка списковых данных и (2) высокоскоростное выполнение функциональных вычислений.
Рассмотрим сначала аспекты, связанные с высокоскоростной обработкой списковых данных. Согласно вышеизложенному, материалу, на языке Лисп символьные данные, имеющие сложную структуру, представлены в виде бинарного дерева. Кроме того, данные этого бинарного дерева довольно часто изме-
няются в процессе обработки. Следовательно, для сохранения списочных данных в памяти вычислительной машины уже нс годится система предварительного распределения по адресам памяти с последовательными номерами, как это делалось для матричных данных с регулярной (жесткой) структурой. Поэтому в данном случае атомам списка и узлам (называемым данными cons и элементами списка) назначаются ячейки памяти, которые организуются в виде структуры, снабженной указателями. Здесь большое значение имеет то, что пользователю совсем нс обязательно знать, каким образом распределены в памяти ЭВМ списочные данные, т. е. в какой именно ячейке памяти (или адресе) находится конкретный атом или элемент списка. Такое управление ячейками памяти выполняется целиком внутри машины. Поскольку списочные данные имеют структуру со связями с помощью указателей, то при обработке списка большая доля операций приходится на поиск по указателю. Кроме того, из-за частного изменения структуры списочных данных в процессе обработки возникает большая проблема издержек при управлении памятью, например перераспределение ячеек памяти в процессе выполнения программы, изменение указателей, регенерация ненужных ячеек памяти и прочес.
Главной отличительной чертой языка Лисп с точки зрения механизма выполнения программ является то, что, как уже было отмечено выше, важную роль цграют рекурсивные вычисления, в основе которых лежат применение функции и оценка выражения. Следовательно, для высокоскоростного выполнения Лисп-программы наиболее важным моментом является реализация в какой-бы то ни было форме механизма, позволяющего с высокой эффективностью выполнять операцию применения функции.
В современных коммерческих Лисп-машинах управление доступом к памяти и управление распределением памяти для обработки списковых структур реализованы в основном аппаратным путем с помощью специализированных средств, более того, за счет использования микропрограммных средств 20*
выполняется оптимизация обработки списков в рамках последовательной вычислительной машины неймановского типа.
К архитектурным приемам повышения быстродействия Лисп-машин относятся следующие.
Использование специальных команд обработки списков, например команд поиска по указателю или управления памятью, непосредственного выполнения микропрограммными средствами.
Для поиска данных по двоичному дереву, применения функции и управления выполнением рекурсивной функции часто приходится пользоваться стековой памятью типа «последним вошел — первым вышел». Поэтому для реализации быстрого доступа к памяти стековую память следует реализовать на специализированных аппаратных средствах.
В целях сокращения накладных расходов, возникающих при доступе к списочным данным, желательно осуществлять доступ к памяти параллельно с выполнением операций. Кроме того, для увеличения скорости поиска по указателям желательно использовать специальные регистры для доступа к памяти, непосредственно управляемые программными (или микропрограммными) средствами.
Увеличение скорости обработки можно обеспечить, добавив к каждому слову данных информацию (называемую тегом), показывающую тип данных. Путем обследования этой информации осуществляется проверка динамически изменяемой структуры данных (типа данных) и обработка в соответствии с типом данных.
Рассмотрим на конкретном примере, каким образом используется стековая память при поиске данных списка, имеющих структуру бинарного дерева, и при выполнении оценки выражения. На рис. 7.5 показан процесс оценки выражения (+3(Х52)). Бинарная древовидная структура этого S-выражения показана на этом же рисунке (кружочками показаны вершины списка, а прямоугольниками — атомы (в данном примере атомами являются численные значения и символы операций + и X). Обрабатывающая система использует стек, в который помещаются
вершины списка (стек управления) для управления поиском в списке, и стек операций, в который помещаются операторы и данные для выполнения операций. Поиск в бинарном дереве выполняется по
Выполнение Лисп-программы (интерпретатор, операции со стеком)
Программа имеет списковую структуру (написана в виде набора S-выражений)
Пример численного выражения: 3 + 5x2Пример численного выражения: 3 + 5x2Представление в виде S -выражения: (+3 (х 5 2))Представление в виде S -выражения: (+3 (х 5 2))Адрес ДаннывАдрес ДаннывРис. 7.5. Процесс оценки выражения.Рис. 7.5. Процесс оценки выражения.
Пример численного выражения: 3 + 5x2
Пример численного выражения: 3 + 5x2
Представление в виде S -выражения: (+3 (х 5 2))
Представление в виде S -выражения: (+3 (х 5 2))
Адрес Данныв
Адрес Данныв
Рис. 7.5. Процесс оценки выражения.
Рис. 7.5. Процесс оценки выражения.
маршруту от корня (1) к вершинам (2), (3), ..., (6). При достижении обрабатывающей системой атома состояния стека изменяется в последовательности (я), (6), (с), (d), (е), (f), (5). Затем в момент завершения обработки бинарного дерева обрабатывающая система вновь возвращается к корневой
вершине (1) (адресный стек возвращается в первоначальное состояние), результат оценки помещается в стек данных.
Базовые операции со списковыми данными
( 1 ) cons Генерация новых данных
Z-cons(z,y)Z-cons(z,y)Рабочие регистрыРабочие регистры( 2 ) саг( 2 ) сагcar(z)car(z)( 3 ) cdr( 3 ) cdry=cdr(z)y=cdr(z)
Z-cons(z,y)
Z-cons(z,y)
Рабочие регистры
Рабочие регистры
( 2 ) саг
( 2 ) саг
car(z)
car(z)
( 3 ) cdr
( 3 ) cdr
y=cdr(z)
y=cdr(z)
Рис. 7.6. Управление списковыми данными.
На рис. 7.6 показан процесс управления данными списка. Вначале все ячейки памяти соединяются с одним списком, представляющим собой список свободных элементов. Новые элементы списка создаются в процессе выполнения программы с помощью операции cons, причем при выполнении операции cons элементы извлекаются по одному из списка сво-
бодных элементов и создается ячейка cons. Рассмотрим этот процесс для конкретного примера 2 = = cons(x, у). Перед выполнением операции cons соответствующие указатели имеют состояние, показанное на рисунке цифрой (1), а после ее выполнения они изменяются, как показано цифрой (2) (значения переменных х и у сохраняются соответственно в регистрах MGR 0 и MGR 1, а результат выполнения операции cons сохраняется в регистре MGR 2. Список свободных элементов хранится в регистре Free). Операции саг и cdr используются только для извлечения данных из части саг (левое поле) ячейки памяти и части cdr (правое поле) соответственно.
Таким образом, обработка данных выполняется с помощью довольно простых операций, и, комбинируя эти операции, можно организовать обработку сложных символьных данных.
Коммерческая Лисп-машина мало чем отличается по структуре от универсальной вычислительной машины. На рис. 7.7, а показана принципиальная структура универсальной машины, а на рис. 7.7, б — принципиальная структура Лисп-машины. Различия между этими структурами заключаются в следующем.
Для увеличения быстродействия памяти механизм доступа к памяти оснащен специализированными средствами.
Используется быстродействующая стековая память большой емкости. Для реализации стековой памяти используется специальный регистр, показывающий начало стека и называемый указателем стека. С помощью указателя стека выполняется быстрый доступ к стековой памяти.
В качестве команд с развитыми функциями введены специально команды обработки списков, которые выполняются с высокой скоростью. Эти команды реализуются микропрограммными средствами. Для хранения микрокоманд предусмотрена управляющая память большой емкости.
Имеются и другие различия.
К разработанным к настоящему времени Лисп- машинам относятся машина CADR (МТИ) [8],
Универсальный компьютер
Устройство памятиУстройство памяти
Устройство памяти
Устройство памяти
Цикл выполнения команды.Считывание командыДекодирование командыСчитывание операндов4.Выполнение командыЦикл выполнения команды.Считывание командыДекодирование командыСчитывание операндов4.Выполнение командыПам (ПС) —>Ргк Ргк-*БУ Пам (АП)-*-ДП**Р БУ, ДЛУ, РПам (ПС) —>Ргк Ргк-*БУ Пам (АП)-*-ДП**Р БУ, ДЛУ, Р
Цикл выполнения команды
.Считывание команды
Декодирование команды
Считывание операндов
4.Выполнение команды
Цикл выполнения команды
.Считывание команды
Декодирование команды
Считывание операндов
4.Выполнение команды
Пам (ПС) —>Ргк Ргк-*БУ Пам (АП)-*-ДП**Р БУ, ДЛУ, Р
Пам (ПС) —>Ргк Ргк-*БУ Пам (АП)-*-ДП**Р БУ, ДЛУ, Р
Лисп-машинаЛисп-машинаОП^: Пам (РОН^ —► ПС ... Выполнение WCS1 (микропрограмма) ОП2 : Пам (РОН2) —►ПС ... Выполнение WCS2 (микропрограмма) (ОПр ОП2 — это порядка 5—10 команд универсальной машины, выполняемых микропрограммой )ОП^: Пам (РОН^ —► ПС ... Выполнение WCS1 (микропрограмма) ОП2 : Пам (РОН2) —►ПС ... Выполнение WCS2 (микропрограмма) (ОПр ОП2 — это порядка 5—10 команд универсальной машины, выполняемых микропрограммой )
Лисп-машина
Лисп-машина
ОП^: Пам (РОН^ —► ПС ... Выполнение WCS1 (микропрограмма) ОП2 : Пам (РОН2) —►ПС ... Выполнение WCS2 (микропрограмма) (ОПр ОП2 — это порядка 5—10 команд универсальной машины, выполняемых микропрограммой )
ОП^: Пам (РОН^ —► ПС ... Выполнение WCS1 (микропрограмма) ОП2 : Пам (РОН2) —►ПС ... Выполнение WCS2 (микропрограмма) (ОПр ОП2 — это порядка 5—10 команд универсальной машины, выполняемых микропрограммой )
Рис. 7.7. Базовая структура Лисп-машины.
а — базовая структура универсального компьютера; б — базовая струк-тура Лисп-машины.
Symbolics 360 фирмы Symbolics [9], Лямбда-машина фирмы LMI [10], DORADO фирмы «Ксерокс» [11], Explore фирмы TI [12], машина Университета г. Кобэ (Япония) [13], FACOMa фирмы «Фудзицу» [14], ELIS корпорации NTT [15] и т. д.
ЯЗЫК ПРОЛОГ И ПРОЛОГ-МАШИНЫ
Язык Пролог, так же как Лисп, имеет чрезвычайно важное значение как язык искусственного интеллекта. Если на языке Лисп программа пишется на основе таких понятий, как списочные данные и функции, то на Прологе программа пишется на основе такого понятия, как вывод (трехступенчатая аргументация). В языке Пролог также используются списковые данные. Понятие логического вывода, являющееся основой языка Пролог, и механизм получения вывода дают классический пример рассмотрения того, каким образом представляются знания, являющиеся центральным объектом в сфере ИИ, а также то, как с помощью этого механизма получаются выводы.
В данном разделе сначала описывается язык Пролог с точки зрения отношения между логическим представлением знаний и выводом, а затем рассматривается архитектура машин, позволяющих с высокой эффективностью выполнять Пролог-программы.
ПРЕДСТАВЛЕНИЕ ЗНАНИЙ И ЯЗЫК ПРОЛОГ [16]
Знаниями можно называть то, что обычно выражаем словами (напротив, в искусственном интеллекте то, что можно представить словами, используют в качестве знаний). Можно привести бесчисленное количество примеров знаний, представляемых словами, как то: «Сократ — это человек», «люди совершают ошибки», «Ханако — мать Таро», «Кадзуо — отец Хидео», «Отец — это родитель», «мать — это родитель», «отец родителя — это дедушка», «мать родителя— это бабушка» и т. д. Эти знания с точки зрения логического вывода можно разделить на две большие категории. К первой категории относятся
знания, отображающие свойства, отношения и т. п. предметов (объектов), выражаемых именами собственными. Эти знания называются фактами. Например, «Сократ — это человек», «Ханако — это мать Таро», «Кадзуо — это отец Хидео» — являются фактами. Ко второй категории относятся знания, отображающие свойства и причинно-следственные отношения между обычными предметами, выражаемыми именами нарицательными. Эти знания называются правилами и используются в качестве правил логического вывода. Из приведенных выше примеров к ним относятся: «Люди совершают ошибки», «отец — это родитель», «мать — это родитель», «отец родителя — это дедушка», «мать родителя — это бабушка», «факториал п\ — это произведение чисел от 1 до п», «произведение чисел от 1 до п получается путем умножения на п произведения чисел от 1 до (п—1)». Представление знаний на естественном языке должно соответствовать определенному формализму для возможности непосредственной обработки на компьютере. Этот формализм называется логическим выражением (непосредственная обработка представления на естественном языке на компьютере — довольно сложная задача. В частности, очень трудно разделить приведенные выше простые знания на факты и правила. Более того, для обработки знаний, представленных на обычном, естественном языке, например английском или японском, необходимо понимание смысла этого представления. Этим занимается самостоятельное направление исследований в сфере ИИ, называемое пониманием и обработкой естественного языка. Понимание естественного языка — это нс что иное, как преобразование представления на естественном языке в логическое выражение). Детальное обсуждение понятия «логическое выражение» будет проведено ниже, а для начала покажем представление приведенных выше примеров в виде логических выражений.
„Сократ — это человек" „Люди совершают ошибки"„Ханако — это мать Таро"„Сократ — это человек" „Люди совершают ошибки"„Ханако — это мать Таро": человек (Сократ).: совершить ошибку (х) <<-люди (х).: мать (Ханако, Таро).: человек (Сократ).: совершить ошибку (х) <<-люди (х).: мать (Ханако, Таро).
„Сократ — это человек" „Люди совершают ошибки"
„Ханако — это мать Таро"
„Сократ — это человек" „Люди совершают ошибки"
„Ханако — это мать Таро"
: человек (Сократ).
: совершить ошибку (х) <<-люди (х).
: мать (Ханако, Таро).
: человек (Сократ).
: совершить ошибку (х) <<-люди (х).
: мать (Ханако, Таро).
„Кадзуо — это отец Хидео":„отец — это родитель":„мать — это родитель":„отец родителя — это дедушка" :„мать родителя — это бабушка" :„факториал N — это произве- : дение чисел от 1 до N“ „произведение чисел от 1 до N : получается путем умножения на произведения чисел от 1 до (М- 1)"„Кадзуо — это отец Хидео":„отец — это родитель":„мать — это родитель":„отец родителя — это дедушка" :„мать родителя — это бабушка" :„факториал N — это произве- : дение чисел от 1 до N“ „произведение чисел от 1 до N : получается путем умножения на произведения чисел от 1 до (М- 1)"отец (Кадзуо, Хидео) родитель (X, У) <- отец (X, У) родитель (X, У) <- мать (X, У) дедушка (X, Z) <- отец (X, У) родитель (У, Z)бабушка (X, Х)<-мать (X, У) родитель (X, Z)факториал (Nt Z) <<-произведение (1, Nt Z) произведение (Af, Nt Z) <-^L = N-1произведение (М, L, X), Z = ^ X X.отец (Кадзуо, Хидео) родитель (X, У) <- отец (X, У) родитель (X, У) <- мать (X, У) дедушка (X, Z) <- отец (X, У) родитель (У, Z)бабушка (X, Х)<-мать (X, У) родитель (X, Z)факториал (Nt Z) <<-произведение (1, Nt Z) произведение (Af, Nt Z) <-^L = N-1произведение (М, L, X), Z = ^ X X.
„Кадзуо — это отец Хидео":
„отец — это родитель":
„мать — это родитель":
„отец родителя — это дедушка" :
„мать родителя — это бабушка" :
„факториал N — это произве- : дение чисел от 1 до N“ „произведение чисел от 1 до N : получается путем умножения на произведения чисел от 1 до (М- 1)"
„Кадзуо — это отец Хидео":
„отец — это родитель":
„мать — это родитель":
„отец родителя — это дедушка" :
„мать родителя — это бабушка" :
„факториал N — это произве- : дение чисел от 1 до N“ „произведение чисел от 1 до N : получается путем умножения на произведения чисел от 1 до (М- 1)"
отец (Кадзуо, Хидео) родитель (X, У) <- отец (X, У) родитель (X, У) <- мать (X, У) дедушка (X, Z) <- отец (X, У) родитель (У, Z)
бабушка (X, Х)<-мать (X, У) родитель (X, Z)
факториал (Nt Z) <
<-произведение (1, Nt Z) произведение (Af, Nt Z) <-
^L = N-1
произведение (М, L, X), Z = ^ X X.
отец (Кадзуо, Хидео) родитель (X, У) <- отец (X, У) родитель (X, У) <- мать (X, У) дедушка (X, Z) <- отец (X, У) родитель (У, Z)
бабушка (X, Х)<-мать (X, У) родитель (X, Z)
факториал (Nt Z) <
<-произведение (1, Nt Z) произведение (Af, Nt Z) <-
^L = N-1
произведение (М, L, X), Z = ^ X X.
Если сравнить представление на естественном языке, показанное слева, и представление в виде логического выражения, показанное справа, то во втором случае, как видим, представление является более информативным. Например, логическое представление «родитель(X, У)^-отец(Х, У).» означает, что «если для любых переменных X и У X является отцом У, то X является родителем У» (X и У — это переменные. Стрелка означает, что если выполняется условие в правой части выражения, то выполняется условие и в левой части выражения). Кроме того, логическое выражение, показывающее факториал, например «факториал (Л/, Z)^-произведение (1,М Z).», означает, что «если для любых N и Z произведение чисел от 1 до N является Z, то факториал N — это Z», а «произведение (Л1, N, Z)^L = N—1, произведение (Л1, L, X), Z = NX X.» означает, что «если для любых L, М, N, X, Z L равно N— 1, а также произведение чисел от М до L равно X, а X X N равно Z, то произведение чисел от М до N равно Z.» Из этих примеров очевидно, что факты нс содержат переменных, а правила содержат переменные и имеют вид A-*—B\t S2, ..., Вп.
Такое представление в виде логического выражения в сущности и является Пролог-программой. Внутри ЭВМ логические выражения хранятся в виде данных (это называется базой данных). Например, используя эти знания, вычислительная машина может отвечать на следующие вопросы: «Сократ способен совершить ошибку?», «Кто отец Хидео?», «Сколько будет факториал 5?».х Эти вопросы также представ-
ляются в виде логических выражений, показанных ниже. Такое представление тоже является Пролог- программой.
„Способен Сократ совершить ошибку?" : ?-совершить ошибку (Сократ).
„Кто отец Хидео?": ?-отец
(X, Хидео)
„Сколько будет 5! ?“: ?-факториал
(5, Z).
Результатом выполнения первой программы будет ответ «Да», результатом выполнения второй программы— «Да, X = Кадзуо», результатом выполнения третьей программы — «Да, = 120».
Рассмотрим более подробно особенности языка Пролог.
ПРЕДЛОЖЕНИЯ, ПРЕДИКАТЫ, ТИПЫ ДАННЫХ
Пролог-программа представляет собой ряд логических выражений, форма которых показана ниже. В терминологии языка Пролог эти выражения называются «хорновскими предложениями» !):
А Bj, В2, Вп.
Как было указано в разд. 7.2.1, смысл этого предложения заключается в том, что «если выполняются условия Вь В2, Вп, то А» (или для того, чтобы выполнялось условие А, необходимо, чтобы сначала выполнялось условие Вь затем В2 и т. д. до Вп). А и каждое Bi называется атомом или атомарной формулой (т. с. элементарным логическим выражением) (обратите внимание на тот факт, что «атом» на языке Пролог совершенно отличается от понятия «атом» на языке Лисп). Более подробно об атомарной формуле будет сказано ниже, а пока дадим полное определение хорновскому предложению. «Хор- новское предложение представляется в виде (левая
п См. книгу «Представление и использование знаний>/Под ред. X. Уэно, М. Исидзука. — М.: Мир, 1989. — Прим. ред.
частью правая часть), причем в правой части содержится хотя бы одна связка «И» атомов, а в левой части содержится только один атом». В отдельных случаях хорновское предложение интерпретируется следующим образом.
Случай, когда отсутствует правая часть (и = 0): А-*-. Это означает безусловное выполнение А, т. с. А является фактом. В данном случае представление имеет вид А. Это соответствует понятию «факт», изложенному в разд. 7.2.3. Если п ^ 0, то данное выражение называется правилом.
Случай, когда отсутствует левая часть: -+-В1, В2, ..., Вп. Это выражение означает, что предпосылкой является выполнение условия в левой части, следовательно, если выполняются условия Bi, В2, ... ..., Вп, то результатом будет «Да», а если они не выполняются, то результатом будет «Нет». Другими словами, это выражение означает вопрос, выполняются или нет Bi, В2, ..., Вп? На языка Пролог такое предложение имеет следующий вид: ?—Вь В2, ...
Вп.
КонстантыКонстантыИтак, на языке Лисп и данные, и программы представляются в виде списковых данных, называемых S-выражениями. На языке Пролог данные и программы также имеют одинаковое представление — в виде символьных данных, называемых термами. Атомы также иногда употребляют в качестве термов.
Константы
Константы
Ч и с л а Последовательность символов
ТермыТермыПеременныеПеременныеСложные термыСложные термыОбычные переменныеБезымянные переменныеЭлементарное логическое выражение (атом) ФункцияДругиеОбычные переменныеБезымянные переменныеЭлементарное логическое выражение (атом) ФункцияДругие
Термы
Термы
Переменные
Переменные
Сложные термы
Сложные термы
Обычные переменные
Безымянные переменные
Элементарное логическое выражение (атом)
Функция
Другие
Обычные переменные
Безымянные переменные
Элементарное логическое выражение (атом)
Функция
Другие
Константами являются цифры или последовательность символов. Последовательность символов состоит из алфавитно-цифровых символов и начинается со строчной буквы. В переменных также используются алфавитно-цифровые символы, и эта последовательность начинается с прописной буквы. Трудности здесь связаны только с переменными, но если нет необходимости различать тип переменной, то в качестве безымянной переменной используется «_». (Так уже сложилось в процессе разработки языка Пролог, что для машины DEC-10 [17] в качестве констант использовалась последовательность алфавитноцифровых символов, которая начинается со строчной буквы, а в качестве переменной — последовательность алфавитно-цифровых символов, которая начинается с прописной буквы. Здесь могут быть некоторые различия, в зависимости от способа построения системы обработки языка. Поскольку эти различия являются несущественными, на них нс следует обращать внимания.)
Атомы, такие, как отец (X, Y), человек (Сократ), цвет (оранжевый, X) и т. д., обычно представляются в следующей форме:
предикат (тсрмь терм2, ..., термп)
Последовательность символов, расположенная в начале атома, например «отец», «человек» и т. д., называется предикатом. X, Y, Сократ — это термы. Кроме того, в случае, когда используются два терма, допускается и такая форма представления: терм 1 предикат терм 2. Например, L = N — 1 равнозначно = (L, N—1). Используя переменные, можно создать сложный терм. Понятие функции такое же, как и для языка Лисп, однако представление функции несколько отличается от представления на Лиспе: имя функции (термь терм^ .... термпу либо терм Х^имя функции терм 2.
При выполнении функции выдастся соответствующее значение. Например, если
plus (3, 5)->8
то plus — это имя функции, а если
plus (3, 5, 8)-чистина (да), то
plus — это предикат.
Поскольку атом также может быть термом, то аналогично языку Лисп программа может иметь рекурсивную структуру.
Рассмотрим теперь процесс выполнения Пролог- программы.
ОПЕРАЦИЯ УНИФИКАЦИИ И ВЫПОЛНЕНИЕ ПРОГРАММЫ
Главной особенностью механизма выполнения Пролог-программы является то, что запуск программы производится с помощью операции сопоставления образцов одного типа, называемой операцией унификации. Для примера покажем, как происходит обработка вопроса «кто дедушка Тосио?» при условиях хранения в памяти ЭВМ знаний «отец родителя — это дедушка», «отец — это родитель», «Кадзуо — это отец Хидео», «Хидео — это отец Тосио» (считается, что эти знания хранятся в базе знаний или базе данных).
На языке Пролог эти знания представлены в фор
ме
Отец (Кадзуо, Хидео)0(1)
Отец (Хидео, Тосио)(2)
Дедушка (Z,y)<—родитель (Z, У), отец ^Хэ Z) (3)
Родитель (X, У)<-отец (X,У)(4)
и хранятся в базе данных.
Выполняется обработка вопроса
? -Дедушка (%, Тосио)(5)
т. е. выполнение Пролог-программы. Сначала в базе данных ищется хорновское предложение для сопо-
о Строго говоря, слова, начинающиеся с прописных букв, являются переменными языка Пролог. Объекты с известными или постоянными значениями должны начинаться со строчных букв, если они не являются числами (хотя существуют исключения из этого правила). — Прим, перев.
ставления с образцом «дедушка (X, Тосио)». В случае сопоставления образцы должны полностью совпадать. Переменной X при сопоставлении следует задать надлежащее значение. В данном случае обнаруживается совпадение с левой частью выражения (3), поэтому переменным X и X, У соответствует значение «Тосио». Другими словами, когда в переменную X или X, У подставляется значение «Тосио» (что выражается в виде Хч-Х, У^-Тосио), то левые части выражений (5) и (3) полностью совпадают с выражением «дедушка (X, Тосио)». Таким образом, операция сопоставления, при которой переменной внутри атома (у которой в данный момент нс было значения) присваивается соответствующее значение, в результате чего оба атома становятся одинаковыми, называется операцией унификации [18].
Далее, если применить правило (3), используя унификацию, к вопросу «? —- дедушка (X, Тосио)», то можно получить новый вопрос:
? -Родитель (Z, Тосио), отец (X, Z).
Аналогично с помощью операции унификации получаем совпадение атома «родитель (Z, Тосио)» с левой частью выражения (4) и, подставив X^-Z, У Тосио, получим новый вопрос «? —отец (Z, Тосио)». Затем, выполнив унификацию с (2), получим «Z^—Хидео». Таким образом, ответом на самую первую часть вопроса (6), т. с. «родитель (Z, Тосио)» будет «Да» (истина), а теперь попытаемся ответить на вторую часть вопроса «отец (X, Z)». Если обратить внимание на то, что уже выяснено Z = Хидео, то унификация будет успешной между этим вопросом и выражением (1), поэтому получим Х^ Кадзуо. В данном случае ответом на вопрос (6) является истина, ответом на первоначальный вопрос (5) является «Да», поэтому ответом будет X = Кадзуо. Процесс выполнения этой программы показан на рис. 7.8.
Операция унификации обычно выполняется для двух атомов. При проверке на совпадение двух атомов делается попытка унификации каждой пары термов и если унификация завершилась успехом для всех термов, то считается, что операция унификации
завершилась успехом. Данный пример прост с точки зрения того, что термом является либо переменная, либо константа, однако обычно это бывают сложный терм, либо списковые данные, поэтому процесс унификации усложняется.
Унификация двух атомов выполняется в соответствии со следующими правилами.
Константа и константа: унификация завершается успехом, если оба терма совершенно одинаковы.
— Дедушка (X, Тосио) унификация
" ^Дедушка (X, У)^-Родитель (Z, У^Отец (X, У) Y *Тосио
X*z ^Родитель^Х,У)-*Отец (Х,У)У-*-ТосиоX*z ^Родитель^Х,У)-*Отец (Х,У)У-*-Тосио? — Родитель (Z ,Тосио), Отец (X, Y)
X*z ^Родитель^Х,У)-*Отец (Х,У)
У-*-Тосио
X*z ^Родитель^Х,У)-*Отец (Х,У)
У-*-Тосио
? —Отец (Z, Тосио)эОтец (X, Z)
г^Хидео Отец (Хидео, Тосио)
? - Отец (X, Хидео)
i
X-*-Кадзуо^^^Отец (Кадзуо, Хидео)
| (Успех)
Рис. 7.8. Механизм исполнения Пролог-программы.
Константа и переменная: унификация завершается успехом, если переменная пока нс заменена на другую константу. В переменную подставляется константа. Если переменная уже заменена на некоторую константу, то аналогично (1).
Переменная и переменная: если обе переменные нс заменены на константы, то одна из них заменяется на другую переменную. Это делается с той целью, чтобы обе переменные имели одно и то же значение.
Структурная унификация: операция унификации выполняется не только для верхнего уровня, но 21-1145
и по отношению к данным, имеющим гнездовую (вложенную) структуру. Например, операцию унификации можно выполнить для каждого из приведенных ниже термов структурированного образца (данных) типа
читать (Таро, книга (Искусственный интеллект, автор (Нанаси Харахёэ, ASCII)))
ф читать (Личность, книга (Книга, человек)) Личность м~ Таро, Книга м— Искусственный интеллект, Человек м- автор (Нанаси Харахёи, ASCII)
читать (Личность, Объект)
Личность м— Таро, Объект м— книга (Искусственный интеллект, автор (Нанаси Харахёи, ASCII))
Ф читать (Личность, книга (Книга, автор (Имя, Транскрипция)))
Личность м- Таро, Книга м— Искусственный интеллект, Имя-e-Нанаси Харахёэ, Транскрипциям-ASCII
@ читать (-, книга (Книга, -))
Книга м- Искусственный интеллект
На языке Пролог, так же как и на Лиспе, можно обрабатывать списковые данные. Благодаря эффективному использованию операции сопоставления образцов на языке Пролог можно более просто, чем на Лиспе, объединять или разделять списковые данные.
Структура списка представляется в виде «элемент!, элемент2, ..., элемент» [17]. Здесь элементом i может быть константа, переменная, терм, списочная структура. В частности, если и = 0, то структура записывается в виде [ ] и называется пустым списком. Все приведенные ниже примеры являются (относятся) к списковым структурам
[ 1
[а] И] [-1
[а, 6] [а, В) [элемент (а, Д), В, С]
[[X, «1, [У, 6], [Z, с], [Q, и]]
[пара (X, а), пара (У, 6), пара (Z, [список, данные] пара (Z, список (значение))
Объединение двух списков данных а и b представляются как [а [6]. Смысл этой операции такой же, как и операции cons (а -Ь) на языке Лисп.
Сопоставление образцов по отношению к спискам также выполняется в соответствии с правилом унификации.
Например, сопоставление образцов списка [Я|Т] с приведенными ниже списками выполняется следующим образом:
VH\n = VaA^H = a1 Т = [], [Я|Т] = к 6НЯ = а, Т = [6],
[Я|Г] = [а, 6, с\ — Н = а, Т = \Ь. с]
Цели [Я|Т] = [ ], то сопоставление нс производится и операция считается завершившейся неуспехом.
Кроме того,
[Л, В, С] = к Ь, с\ — А = а, В = Ь, С = с, [[*, Г, Z]|T] = [[a, 6, с], [р, q, г], [s, /, ц]] ->Х = а, Y = b, Z = c. T = Wp, q, d, k /, a]]
лев.тигр.корова. животное^лев^. живот ное (тигр).лев.тигр.корова. животное^лев^. живот ное (тигр).Из вышеизложенного понятно, что в основе выполнения Пролог-программы лежит поиск в базе дан-
лев.
тигр.
корова. животное^лев^. живот ное (тигр).
лев.
тигр.
корова. животное^лев^. живот ное (тигр).
7-лев.—►да
7-корова.—>да
7-собака.—►нет
7-животное(лев). —►да
животное(корова). 7-животное(тигр). —► нет
ест (лев .мясо). ест(тигр,мясо). ест(корова .трава). (а)ест (лев .мясо). ест(тигр,мясо). ест(корова .трава). (а)7-животное(кот). —► нет (б)
ест (лев .мясо). ест(тигр,мясо). ест(корова .трава). (а)
ест (лев .мясо). ест(тигр,мясо). ест(корова .трава). (а)
Рис. 7.9. Процесс выполнения программы посредством унификациии поиска в базе данных.
а — факты в базе данных; б — вопросы (справа от стрелки — ответ изкомпьютера).
ных с помощью операции унификации. Для более ясного понимания этого рассмотрим в качестве примера программу, показанную на рис. 7.9. Если в базе данных хранятся факты (см. рис. 7.9,а), то в ответ на вопросы посредством операции унификации будут получены ответы «да» или «нет», как показано на рис. 7.9, б.
Когда по отношению к базе данных возникает вопрос «?—животное (Х)>, то с помощью операции унификации в X подставляется значение. В данном примере осуществляются три сопоставления: животное (лев), животное (тигр), животное (корова). Если факты в базе данных хранятся в последовательности, показанной на рис. 7.9, а, то на языке Пролог сначала осуществляется сопоставление с образцом животное (лев) и выдастся ответ X = лев. Система выдаст решение «да, X = лев*. Если другого решения не требуется, то вводом символа перевода строки поиск решения текущего вопроса прекращается и принимается следующий вопрос. Если желательно получить другое решение, то нужно сразу после этого ввести символ «;», после чего осуществляется сопоставление с образцом животное (тигр) и выдается решение «да, X = тигр*. При следующем вводе «;» будет выдано решение «да, X = корова*. Если еще раз ввести «;», то система выдаст ответ «нет», который означает, что решения нет.
Итак, посмотрим, как выдастся решение вопроса, состоящего из множества атомов
?-атомь атом2, ..., атомд.
Система сначала выдаст решение, при котором условие атома! является истиной (эта процедура называется решением атомаь Далее аналогично). Затем, используя это решение (т. е. используя значения переменных в атомеь которые были найдены), отыскивается решение атомаг. При этом .
если решение не находится, то считается, что решения атомаг при найденном решении атома! не существует (этот ответ называется неуспехом). В данном случае осуществляется возврат и отыскивается другое решение атомаь Если найдено другое решение, то оно используется для повторного поиска решений атомаг-
если решение атомаг найдено, то на основании этого решения осуществляется список решения ато- ма3.
далее аналогично, если эту операцию можно продолжить до атомал, то все значения от атома! до ато-
мал становятся истинными и полученное решение является решением данного вопроса.
Примечание. Требование другого решения Путем ввода символа «;» означает нс что иное, как принудительное установление неудачного исхода, возврат и поиск другого решения. Следовательно, на языке Пролог посредством ввода «;» и принудительного установления неудачного исхода можно посредством вертикального поиска определить все решения, удовлетворяющие вопросу.
Пример. ? -животное (X), есть (X, мясоу
7.2.4. РЕКУРСИЯ, ПЕРЕБОР С ВОЗВРАТАМИ, УДАЛЕНИЕ
В Прологе так же, как и в Лиспе, для циклической обработки используется понятие рекурсии. На примере предиката member, используемого в Лиспе, рассмотрим процесс рекурсивной обработки на Прологе. Сначала дадим определение продикату member:
member (X, Z): если в списке Z содержится элемент X, то истина, в противном случае — ложь
Если Z есть [Х| У], то member(X, Z), т. e. memberX ШИ.является истиной. В противном случае, т. е. Z= [Н7| У], X Ф W, следует проверить истинность member (X, У). Это можно представить в виде Про- лог-программы:*
member (X, JX |У]).(7)
. member (X, [IF j У] )<-Х ^= W, member (X, У) (8)
Предложение (7) является безусловно истинным, поскольку очевидно, что X содержится в списке [Х|У]. Таким образом, в языке Пролог имеется возможность представления фактов с помощью переменных. Что касается выражения (8), то если X и W—разные, то следует проверить, содержится или нет X в списке У без первого элемента W. При выполнении Пролог- программы в первую очередь обязательно выполняется ранее записанное предложение (следовательно.
предложение (7) будет выполняться раньше, чем (8)), поэтому, если выполняется условие предложения (7), то это означает, что X нс равно W. Следовательно, предложение (8) можно записать следующим образом: -
member (X, \W | У] )<- member (X, У). (8')
Итак, если выполнить программу, задав вопрос ?-member (a, [s, w, а, е, г. Л]).
то сначала будет попытка сопоставления с предложением (7). Первый член этого списка Х = а, однако второй член [Х|У] = [а| У] ^ [s, w, а, е9 r9 А], т. с. сопоставление завершается успехом. Затем проводится сопоставление с предложением (8) и получается, что X, W, У равны соответственно X = а, W = s9 У = [w, а, е, г, А], т. с. сопоставление завершается успехом. В итоге выполняется правая часть предложения (8)'. То есть первоначальный вопрос заменяется на
member (X, У) или member (a, [ty, а, е9 г, ft]).
В этом случае также аналогично предыдущему сопоставление с (7) завершается неуспехом, а при сопоставлении с (8) получаем X = a, W = w, У = [а, в, г» А], и вопросом является member (а, [а, е9 г9 А]). На этот раз сопоставление с (7) завершается успехом. Поэтому получаем ответ «Да» на самый первый вопрос.. Процесс выполнения этой программы показан на рис. 7.10.
Давайте посмотрим, что будет, если в этом состоянии ввести символ «;», означающий требование поиска другого решения. Как уже было изложено ранее, при вводе «;» выданное решение признается неудовлетворительным, т. с. считается, что сопоставление завершилось неуспехом, поэтому система делает попытку поиска другого решения. То есть в случае member (a, [s, wra9 е9 г9 А]), несмотря на то что сопоставление прошло успешно и был получен ответ «Да», считается, что сопоставление с (7) при выполнении member (а, [а, е, г, А]) завершилось неуспехом, и делается попытка сопоставления с предложением
. В результате проводится исследование member (а, [е, г, Л]). На этот раз сопоставление завершается неуспехом, поэтому выдастся ответ «Нет». Если при обработке, последующей после успешного завершения выполнения member (X, У), происходит возврат по причине возникновения неуспеха, то для member (X, У) отыскивается другое решение, нс имеющее смысла. Например, если X является элементом спис-
member(а,С^,w,a, е, rtH))
Рис. 7.10. Выполнение программы методом перебора с возвратами. При вводе ”;” принудительно осуществляется возврат и с места, отмеченного стрелкой <= начинается поиск другого решения.
ка У, в следующей программе, целью которой является определение того, является ли X элементом списка У, а также элементом списка Z
?-member (X, У), member (X, Z). (9) положим, что X является элементом списка У, но не является элементом списка Z. В таком случае выполнение member (X, У) завершится успехом, после чего будет предпринята попытка выполнения member (X, Z), однако, так как она завершается неуспехом, то осуществляется возврат и снова выполняется member (X, У). Однако это повторное выполнение лишено всякого смысла. Собственно говоря, когда выполнение member (X,Z) завершается неуспехом, то ответом на вопрос (9) должно быть «Нет». В таких случаях необходимо предотвратить повторное выполнение member(X, У). Одним из способов предотвращения
лишней попытки повторного выполнения программы в случае возврата при неуспехе является использование операции удаления (cut). Операция удаления вводится путем вставки символа удаления «1» в Пролог-программу. При обнаружении символа «I» система полностью отбрасывает всю предысторию выполненных до сих пор вычислений (т. с. состояние вычисления). В предыдущем примере выполнения программы member предыстория выполнения, показанная на рис. 7.10 стрелкой, и текущее состояние запоминаются и каждый раз при возврате восстанавливается это состояние и продолжается обработка для определения другого решения. Если, используя операцию удаления, записать программу в следующем виде:
(7)'(8/(7)'(8/member (X, [X | У]):-!.
(7)'
(8/
(7)'
(8/
member (X, [Н7 | У]) -member (X, У).
то, когда выполнение (7)' завершается успехом, будет выполняться операция <!». Поскольку при выполнении этой операции вся предыстория выполнения отбрасывается, то состояние, показанное на рис. 7.10, в памяти не сохраняется. Поэтому, если даже после выполнения ( 7)' возникает возврат, левая часть предиката (стоящая слева от знака «!»)не выполняется. Другими словами, выполнение оператора I, находящегося справа от предиката (7)', означает, что предложение (8)' не выполняется. Поэтому если выполнение (7)' один раз уже завершилось успехом, то после этого (8)' не выполняется и выполнение member завершается неуспехом.
С помощью приведенного ниже примера программы, определяющей наличие элемента в списке, разница между использованием и неиспользованием операции удаления становится очевидной.
?-member (.животное (X),
Уживотное (лее), животное (тигр), птица (орел).
животное (лошадь)]), print (X), fail.
В данной программе при выполнении первого предиката member определяются значения X, удовлетворяющие предикату «животное (X)», и осуществляется печать этих значений. Затем выполняется предикат «неуспех» и обязательно осуществляется возврат. При возврате определяется следующее значение X. Затем эта операция повторяется снова и определяется следующее решение. Этот процесс будет повторяться до достижения fail (неуспех). Следовательно, так же, как и в случае (7), если операция удаления отсутствует, то Пролог-программа циклически выполняется и определяются все решения
X = лев,
X = тигр,
X = лошадь.
В случае же наличия операции удаления ответ будет только один:
X = лев.
Таким образом, операция удаления эффективна в тех случаях, когда достаточно лишь одного решения.
Рис. 7.11.
Функция append объединения двух списков, рассмотренная выше как функция Лиспа, в Прологе также записывается с помощью понятия рекурсивной обработки. Оговоримся сначала, что список [X | У] будем считать объединением двух списков X и У (на языке Лисп это эквивалентно списку, созданному с помощью функции cons (X, У)). Обозначим соединяемые списки через L1 и L2, а результат соединения — L3. Если L1 = [Х|У], a L3 = [WIZ], то можно
сделать вывод, что выполняется отношение: IF = X a Z получено присоединением к списку У списка L2 (см. рис. 7.11). Кроме того, если список L1 является пустым списком, т. е. L1 = [ ], L2 = L3. Если это отношение представить в виде Пролог-программы, то получим следующее:
append ([X | У], z. [X | Г]:- append (У, Z, Г).
append ([ ], X, X).
ТАЛ. ПРЕДИКАТЫ ВЫСШЕГО ПОРЯДКА
До сих пор изложение касалось обработки предикатов, используемых для описания отношений между объектами и свойств объектов, а также определения их истинности. Однако для того чтобы сделать обработку более универсальной и повысить производительность, необходимо использовать такие операции, как not (не) — отрицание истинности (или ложности) некоторого предиката, операции удаления существующих фактов и правил и введения (дополнения) новых фактов и правил, операцию поиска всех решений и т. д. Поскольку объектами во всех этих операциях являются предикаты, то их уровень отличается от уровня операций, рассмотренных в предыдущем разделе. Предикаты, описанные в предыдущем разделе, которые не являются непосредственно объектами обработки, называют предикатами первого порядка. В отличие от них те предикаты, которые являются объектами операций not, добавления и удаления фактов и правил, а также поиска всех решений принято называть предикатами высшего порядка. Остановимся на них подробнее:
Операция not. Если на языке Пролог записать следующее:
fact (а).
то это будет означать, что факт (а) является истиной. Что следует предпринять, чтобы этот факт был ложью? Одним из способов будет следующая запись:
fact (a):-fail.(10)
При вводе вопроса
?-fact (а).
fact (а) сопоставляется с левой частью выражения (10). Однако так как выполнение его тела «fail» обязательно завершится неуспехом, то факт (о) является ложью.
Если наличие предиката Р в базе данных нс очевидно, т. с. в результате поиска в базе данных Р нс удалось обнаружить, то Р считается ложью. Этот подход называется гипотезой замкнутого мира. Гипотеза замкнутого мира гласит: «то, что мне неизвестно (или не помню), истиной никогда не является (т. е. является ложью)». Иначе говоря применительно к нашему случаю, если в базе данных не хранится факт (а), то при выполнении программы «? — fact (с).» сопоставление завершается неуспехом, поэтому ответом является «нет», т. е. ложь. В то же время на вопрос «? — not (fact (с)).» мы можем получить ответ «да». Тем не менее способ, предложенный выражением (10), не позволяет принять правильное решение в подобных случаях. •
Обычно для того, чтобы показать, что отрицание not(P) некоторого предиката (атома) Р является истиной, нужно показать, что предиката, совпадающего с Р, не обнаружено. Другими словами, когда предиката, совпадающего с Р, нс обнаружено и сопоставление завершается неуспехом, следует сделать так, утобы можно было истину-ложь поменять местами. То есть операцию not(P) следует записать так, чтобы в случае выполнения Р был неуспех, а противном случае — успех. На языке Пролог это нужно записать следующим образом:
not (Р):-Р,!, fail. (11)
not (Р). (12)
Таким образом, при вопросе «?-not(fact(c)).» сначала производится сопоставление с левой частью выражения (11) и получается «p-fact(c)». Затем выполняется правая часть (11). Сначала выполняется первый терм «Р(-fact(с))» справа. Поскольку поиск «fact(с)»
завершается неуспехом, то далее предпринимается попытка выполнения (12). Правая часть выражения (12), безусловно, завершается успехом, поэтому окончательным результатом является успешное завершение и ответом является «да». Посмотрим теперь, что будет при вопросе «? — not (fact (а))». На этот раз «P-fact(a)», поэтому выполнение правой части (11) завершается успехом для Р. Затем выполняется операция удаления, а в заключение выполняется предикат fail и выполнение (11) завершается неуспехом. Однако благодаря операции удаления путь к повторному выполнению программы отрезан даже в случае неуспеха и возврата, поэтому (12) не выполняется. В итоге получается, что выполнение программы завершается неуспехом и ответом будет «нет». Таким образом, оба ответа, «да» и «нет», являются удовлетворительными.
Приведенные примеры касались вопросов относительно истинности или ложности различных фактов, хотя эту операцию можно использовать и для принятия решения относительно истинности и ложности фактов и правил.
Допустим, к примеру, что в базе данных хранятся только следующие записи:
мужчина (джон).•
мужчина (джек)..1
женщина (мэри).
женщина (маргарет).
Тогда, согласно гипотезе замкнутого мира, предикаты мужчина (мэри), мужчина (маргарет) являются ложью. Кроме того, можно убедиться, что предикаты not (мужчина (мэри)) и not (мужчина (маргарет)) являются истиной по определению not(P), данному выражениями (11) и (12). В их истинности или ложности легко можно убедиться. Итак, проблема заключается в том, можно ли получить ответ на вопрос: «Каким должно быть X, чтобы выполнялось условие мужчина (X)?». Этот вопрос на языке Пролог представляется следующим образом:
?-not ^мужчина (X)).
Методом сопоставления с not(P) в правой части выражения (11) получаем Р = мужчина (X) и, оценив цель мужчина (X), получим
’ X = джон
Однако при выполнении fail следует возврат, а поскольку выполнение (12) предотвращается операцией удаления, то результатом not (Р) будет неуспех • и все последующие действия становятся невозможными. В итоге мы нс получаем никаких знаний, кроме того, что not (мужчина (X)) завершилась неудачей. Другими словами, при использовании операции отрицания not прежде нужно задать значение переменной предиката, поскольку определить значение неизвестной переменной невозможно.
Операции assert, retract. Для пополнения базы данных новыми правилами и фактами и удаления из нес старых правил и фактов используются встроенные предикаты, операции assert и retract и т. п.
Существуют следующие три типа предикатов для записи правил и фактов в базу данных:
assert (X),
asserta (X),'
assertz (X)
Первый тип предиката assert (X) используется для помещения значения, которое имеет переменная X, в любое место базы данных (в какое именно место, определяется системой). В отличие от него предикат asserta (X) вводит значение X в начало базы данных, а предикат assertz (X)—в конец базы данных.
Для удаления данных из базы данных используется встроенный предикат
retract (X)
С помощью этого предиката из базы данных удаляется первый факт, который совпал с X.
Если предикаты assert (X), asserta (X), assertz (X) были уже выполнены один раз, то, начиная со второго раза, их выполнение завершается неуспехом. Другими словами, успешное выполнение этих предикатов
бывает только один раз. Следовательно, если записать, например,
?-assert (f (a)), fail.
то при первом выполнении assert (f (а)) в базу данных сначала запишется f(a). Затем выполнение fail завершится неуспехом и последует возврат к assert (f(a)), однако поскольку выполнение этого предиката возможно только один раз, то запись в базу данных 1(a) еще раз не производится. В то же время выполнение retract (X) может неоднократно завершаться успехом. Например, если в базе данных записаны факты ,
: f(Ci), f (се2), ..., Цап\
то при выполнении
?-retract (f (X)), fail.
после выборки очередного f(at) предикат retract (f(X)) производит его удаление. Затем при выполнении fail производится возврат, снова выполняется предикат retract (X) и на этот раз извлекается и удаляется факт f(Oi+i). Таким образом из базы данных удаляются все факты f(at) (1 ^ I ^п).
Операция all. При записи all (Object, Goal, List) предикат all определяет все объекты, удовлетворяющие цели (goal), и выдает их в виде списка (list). Так как значения предиката Object ч определяются при выполнении предиката Goal, то в описании Goal должны содержаться объекты. Например, если в базе данных хранятся следующие отношения.
отношение (а, ^) отношение (a, f) отношение (а, с) отношение (b, g) отношение (b, с)отношение (а, ^) отношение (a, f) отношение (а, с) отношение (b, g) отношение (b, с)отношение (b, d) отношение (a, g) отношение (d, а) отношение (с, Ь) отношение (6, f)отношение (b, d) отношение (a, g) отношение (d, а) отношение (с, Ь) отношение (6, f)отношение (а, е) отношение (е, с) отношение (a, d^ отношение (6, а) отношение (g, с)отношение (а, е) отношение (е, с) отношение (a, d^ отношение (6, а) отношение (g, с)
отношение (а, ^) отношение (a, f) отношение (а, с) отношение (b, g) отношение (b, с)
отношение (а, ^) отношение (a, f) отношение (а, с) отношение (b, g) отношение (b, с)
отношение (b, d) отношение (a, g) отношение (d, а) отношение (с, Ь) отношение (6, f)
отношение (b, d) отношение (a, g) отношение (d, а) отношение (с, Ь) отношение (6, f)
отношение (а, е) отношение (е, с) отношение (a, d^ отношение (6, а) отношение (g, с)
отношение (а, е) отношение (е, с) отношение (a, d^ отношение (6, а) отношение (g, с)
то как организовать сбор X, удовлетворяющих отношению (а, X). Это, очевидно, следует сделать следующим образом:
?- all (X, отношение (а, X), Z).
Выполнив эту операцию, получим ответ Z = (6, d, А с, g, е].
Пример реализации предиката all приведен ниже.
all (X, Goal, У):- asserta (found (mark)), Goal, asserta (found (X)), fail.
all (X, Goal, Solution):-collect ([ ], Solution).
Пример выполнения предиката all показан на рис. 7.12. Сначала в базу данных записывается метка
Рис. 7.12. Процесс выполнения операции all с использованием базы данных как стека (с изменением содержимого базы данных).
с названием found (mark) и оценивается цель Goal. При оценке цели получаем значение переменной X в этом предикате, которое записываем в базу данных в виде found (X).
При выполнении предиката asserta база данных, как видно из рисунка, используется как стек. Фактически found (mark)—это метка, которая показывает дно стека (запись в стек found (X) делается для предотвращения определения двух и более раз значения X). После выполнения предиката asserta (found (X)) выполняется предикат fail, осуществляется возврат к предикату asserta (found (X)), однако поскольку повторное выполнение этого предиката завершается неудачей, то снова выполняется предикат Goal. Затем определяется новое значение X и для этого нового значения выполняется предикат asserta (found (X)). Этот процесс повторяется многократно до тех пор, пока выполнение Goal не завершится -неуспехом. После этого предикат второй строки all вызывает
предикат collect. Предикат collect задается следующим образом:
collect (Д S): - get .next (X), collect ([X | Д], S).
collect (S, S).
get .next (X):- retract (found (X)), ! X #= mark.
Этот предикат обнаруживает значение X, совпадающее с found (X) (сопоставление начинается с вершины стека), и удаляет его из базы данных (база данных используется как стек, т. е. предикат asserta выполняет операцию помещения в стек, а предикат retract — извлечение из стека). Если X не является меткой, то операция get_next(X) завершается успехом, поэтому обнаруженное значение X включается в список. (Это отображается как [Х|Д]). Если же X— это метка, то, как показано на рис. 7.12, предикат all извлекает found (метку), записанную первоначально при помощи asserta. Однако поскольку ХФ метка завершается неуспехом, делается попытка возврата, которая пересекается операцией удаления, поэтому операция get-next (X) завершается неуспехом. В этом случае оценивается collect (S, S) во второй строке и обработка завершается.'
Если возникает множество одинаковых значений X, удовлетворяющих цели Goal, то в списке Solution (Решения) также содержится множество одинаковых значений и нет смысла использовать стек. Для предотвращения «этого первую строку операции all следует изменить, как показано ниже:
all (X, Goal, У):- asserta (found (mark), Goal, already-stored (X), fail.
already-stored (X):- found (X), !.
. already.stored (X):- asserta (found (X))
ПРОЛОГ-МАШИНЫ
Специализированная вычислительная.. машина, предназначенная для быстрого выполнения Пролог- программ, называется Пролог-машиной. Собственно говоря, выполнение Пролог-программы — это есть
получение логического вывода, поэтому Пролог-машину называют еще машиной логического вывода. Из вышеизложенного очевидно, что в Прологе, так же как и в Лиспе, большая доля операций приходится на функции символьной обработки. Однако кроме этого требуются функции управления выполнением программы для получения вывода.
Рис. 7.13. Процесс выполнения Пролог-программы.
На рис. 7.13 показан процесс выполнения следующей Пролог-программы:
бабушка (X, Z):- мать (X, У), родитель (У, Z). родитель (X, У):- отец (X, У).
родитель (X, У);- мать^Х, У)
На рисунке показан процесс выполнения ~, мать^Х, Митико), родитель (Митико, Z), ~. При выполнении атома родитель ^Митико, Z) этот атом вызывает процедуру, хорновское предложение, в левой части которого имеется предикат родитель, интерпретируется как определение процедуры и процедура родитель вызывается (call) посредством сопоставления образцов. При сопоставлении образцов сначала вызывается предложение родитель (X, У): — отец (X, У) 22—1145'
(здесь X = Митико, У = Z) и осуществляется переход к выполнению его левой части отец (Митико, Z). Далее если сопоставить его с фактом отец (Митико, таро), то получим в качестве значения Z = таро. Однако если предикат отец (Митико, *) (где * — любая константа) нс определен, то выполнение этой процедуры завершается неуспехом, осуществляется возврат и выполняется следующая процедура родитель (X, ¥)>матъ (X, Y) (перебор с возвратами). Если выполнение процедуры родитель (X, Yy.-отец (X, Y) завершилось успехом и было выдано значение, но последующая обработка завершилась неудачей и последовал возврат, то эта процедура вызывается повторно.
Для увеличения скорости выполнения подобной обработки в Пролог-машинс необходимо увеличить скорость выполнения следующих функций:
функция символьной обработки,
функция сопоставления образцов, (унификации) для обработки предикатов,
функция обработки неопределенностей и перебора с возвратами.
Что касается первой функции, то это требование является очевидным, поскольку в основе получения логического вывода лежит обработка предикатов, представленных алфавитно-цифровыми символами. Что касается второй функции, то, поскольку выполнение . Пролог-программы базируется на операции унификации посредством сопоставления образа предиката с хорновским предложением, ускорение операции сопоставления образцов за счет использования специальных аппаратных средств является важным моментом в проектировании архитектуры. Что касается третьей функции, то, поскольку в Пролог-машинс не применяется метод проб и ошибок для выполнения программы, необходимо ускорить управление перебором с возвратами.
В архитектуре Пролог-машин первоначально рассматривались методы реализации требований (2) и (3) на основе микропрограммных средств машин символьной обработки, т. с. Лисп-машин. Кроме того,
планировалось реализовать эти требования (2) и (3) в рамках обычных фон-неймановских машин последовательной обработки за счет использования специальных аппаратных или микропрограммных средств. На рис. 7.14 показан процесс реализации машины логического вывода. Например, в машине
Описание вывода (программа)Описание вывода (программа)Прямое выполнениеПрямое выполнениеКомпиляцияКомпиляция
Описание вывода (программа)
Описание вывода (программа)
Прямое выполнение
Прямое выполнение
Компиляция
Компиляция
•Поиск правила ■Сопоставление •Изменение базы данных• Метод проб и ошибок (автоматическое управление)•Операции с символами•Арифметические операции•Поиск правила ■Сопоставление •Изменение базы данных• Метод проб и ошибок (автоматическое управление)•Операции с символами•Арифметические операцииИзменение базы данныхМетод проб и ошибок (автоматическое управление) Арифметические операции Операции с симво ламиИзменение базы данныхМетод проб и ошибок (автоматическое управление) Арифметические операции Операции с симво ламиНеймановский типНеймановский тип
•Поиск правила ■Сопоставление •Изменение базы данных
• Метод проб и ошибок (автоматическое управление)
•Операции с символами
•Арифметические операции
•Поиск правила ■Сопоставление •Изменение базы данных
• Метод проб и ошибок (автоматическое управление)
•Операции с символами
•Арифметические операции
Изменение базы данных
Метод проб и ошибок (автоматическое управление) Арифметические операции Операции с симво лами
Изменение базы данных
Метод проб и ошибок (автоматическое управление) Арифметические операции Операции с симво лами
Неймановский тип
Неймановский тип
Рис. 7.14. Процесс обработки с получением логического вывода.
логического вывода PSI [19], разработанной в рамках проекта ЭВМ пятого поколения, были использованы специальная стековая память для управления операцией перебора с возвратами и специальные средства для сопоставления образцов (операции унификации). Всего было использовано 4 типа стековой памяти:
управляющий стек (для управления последо- довательностью выполнения программы),
локальный стек для управления областью ячеек с переменными,
стек для того, чтобы сделать недействительными значения переменных,
глобальный стек для генерации структурных данных. '
К Пролог-машинам помимо этой модели относятся машина CHI [20], представляющая собой быстродействующий вариант PSI, машина РЕК [21] Уни-
Рис. 7.15. Структура Пролог-машины.
(1) Большая часть времени выполнения уходит на доступ к памяти -* увеличена скорость выполнения операций чтения/записи в память; (2) При выполнении Пролог-программы часто используются операции со стеком -► применение быстродействующей стековой памяти (в отличие от Лисп-машин здесь требуется стек для управления при выполнении программы методом проб и ошибок); (3) Специальные команды обработки Пролог-программ (высокофункциональные команды — сопоставление образцов логических выражений) -► применение микропрограммных средств (между Пролог-машиной и Лисп-машиной разница в аппаратных стредст- вах несущественная).
верситета г. Кобэ (Япония), PLM [22] Калифорнийского университета и др.
Общие отличительные особенности, свойственные этим машинам, показаны на рис. 7.15. Из этого рисунка видно, что конфигурация аппаратных средств этих машин мало чем отличается от Лисп-машин (а следовательно, и от универсальных вычислительных машин).
Глава 8
МАШИНЫ БАЗ ДАННЫХ
Машины баз данных — это специализированные машины, занимающие свое место в архитектуре ЭВМ. Исследования и разработки этих машин особенно оживленно происходили начиная со второй половины 70-х годов по 80-е годы. Исследования, начало которым положила идея параллельного поиска во вторичной памяти, в ходе широких изменений в элементной базе: расцвете и упадке ПЗС, ЗУ на ЦМД, достижении эры СБИС, прогрессе микропроцессорной техники, удешевления и увеличения емкости полупроводниковых ЗУ — имели целью в более широких пределах повысить скорость обработки данных и развивались сопровождаемые нахождением новых компромиссных решений.
В данной главе этот процесс будет изложен еще раз, а также будут рассмотрены технические приемы и обсуждены перспективы на будущее. •
ФУНКЦИОНИРОВАНИЕ БАЗЫ ДАННЫХ
И МАШИНЫ БАЗ ДАННЫХ
ЧТО ТАКОЕ МАШИНА БАЗЫ ДАННЫХ
Начало исследований в области машин баз данных (БД) связано с предложением в начале 70-х гг. Э. Коддом реляционной модели данных. После этого начались бурные исследования в этой области [1—5]. Причинами такого развития событий послужили следующие две. Во-первых, интенсивные исследования и практическое применение реляционных моделей для баз данных привели к пониманию необходимости повышения эффективности обработки с помощью БД и к выявлению новых требований. Во-вторых, поскольку основными операциями для такой модели были операции с множествами, то они являлись пригодными для конвейерной и параллельной обработки и
вызвали определенный интерес исследователей в области параллельных архитектур. Кроме этих двух причин существовала еще и третья причина, которая заключалась в постепенном понимании того, что, хотя существующие универсальные компьютеры и подходят для высокоскоростных вычислений, они непригодны для выполнения с высокой скоростью операций сравнения и сортировки больших объемов записей, хранящихся во вторичной памяти.
В начале 80-х гг. западногерманская фирма Software AG разработала машину ADABAS, американская фирма Britton-Lee — машину IDM500 [9], а другая американская фирма Intel — полупроводниковый диск FAST-3805 и процессор базы данных DBAP. ADABAS — это система управления базой данных (СУБД) реляционного типа, использующая переместимые файлы. В системе ADABAS была использована IBM-совместимая машина, и связь между машиной ADABAS и главным IBM-совместимым компьютером стала возможной благодаря использованию нового, разработанного данной фирмой канала. IDM500 — это машина БД для реляционной модели, и кроме 16-разрядного микропроцессора се можно дополнить акселератором базы данных, выполненным на элементах Шотки-ТТЛ, для конвейерного поиска записей. Производительность системы с акселератором равна приблизительно 10 миллионам операций в секунду. В этой машине был использован спецпроцессор БД, в который передаются из главной машины все операции с БД, и тем самым уменьшается нагрузка на главную машину.
Полупроводниковый диск — это полупроводниковое ЗУ, выполненное на МОП-элсмснтах памяти и совместимое по разъемам с дисковой памятью IBM- компьютера. Использование полупроводникового диска — это один из методов увеличения быстродействия вторичной памяти. Другим средством увеличения быстродействия вторичной памяти является разработанный английской фирмой ICL контроллер диска CAFS (12), имеющий функцию ассоциативного поиска записей. Главными целями, поставленными перед разработчиками этого контроллера, были передача
функции поиска записей из ЦП во вторичную память и повышение эффективности использования основной памяти за счет пересылок из вторичной памяти в основную только необходимых в конкретный момент записей.
Кроме задач коммерческого характера большой объем исследовательских работ был направлен на увеличение скорости выполнения операций, требующих большой затраты времени (например, типа описываемой ниже операции соединения и т. п.), а также на управление и обработку в крупномасштабной БД. Затем по мере понимания того обстоятельства, что при уменьшении пропускной способности канала передачи данных между вторичной памятью и обрабатывающей системой и увеличении быстродействия только обрабатывающей системы за счет параллельной обработки станет невозможным обеспечение достаточно высокого быстродействия вторичной памяти, с которой система обработки обменивается нужными данными. В результате была предложена машина БД с основной памятью, предполагающей, что вся база данных виртуально хранится в основной памяти. Кроме того, были предложены метод разбиения файлов для сокращения частоты доступов ко вторичной памяти и многопортовая дисковая кэш-память, целью которой является нс только снижение частоты доступов ко вторичной памяти, но и резкое увеличение ширины канала передачи данных в обрабатывающую систему.
Кроме того, проект разработки ЭВМ пятого поколения, утвержденный Министерством торговли и промышленности Японии, предусматривает создание машин баз знаний, которые на основе централизованного управления множествами правил, процедур и других знаний способны делать выводы и осуществлять поиск информации.
ФУНКЦИОНИРОВАНИЕ БАЗЫ ДАННЫХ
В реляционной модели базы данных различная информация представлена в виде множества таблиц (см. рис. 8.1). Эти таблицы называются отношениями.
Каждый столбец таблицы называется атрибутом, а каждая строка — кортежем. Например, кортеж (Саппоро, Хоккайдо) отношения, имеющего атрибуты «город» и «префектура», показывают, что в префектуре с названием «Хоккайдо» существует город с названием «Саппоро». Два отношения, имеющие одинаковые множества атрибутов, называются типом
Место рожд.
Фамилия студента
Место рождения
Местонахождение
Город
Префектура
Танака
Накамура
Ямада
Судзуки
Киото
Саппоро
Кобэ
Саппоро
Киото
Кобэ
Саппоро
Киото
Хёго
Хоккайдо
Рис. 8.1. Пример базы данных, состоящей из двух отношений.
Поскольку отношение можно рассматривать как множество, элементами которого являются кортежи, то между двумя отношениями одного типа возможны операции над множествами, такие, как объединение множеств, пересечение множеств, вычитание множеств. Кроме того, для двух произвольных отношений можно определить их общее множество. Это множество соответствует отношению, имеющему множество атрибутов, в которое входят множества атрибутов первых двух отношений.
Помимо этих операций существует еще несколько операций, которые называются реляционными операциями (или операциями реляционной алгебры). Основными из них являются операции выбора, ограничения, проекции и соединения (см. рис. 8.2).
Операция выбора заключается в том, что из всех кортежей отношения R, указанных как R\A=B^, выбираются только тс кортежи, значение атрибута А в которых равно В. Операция ограничения похожа на операцию выбора и заключается в том, что из всех кортежей отношении R, указываемых как R(A =
= 5], выбираются только те кортежи, у которых значения атрибутов Д и В равны. Операция проекции указывается следующим образом: R [X]. Здесь X является подмножеством множества атрибутов R. С помощью этой операции из таблицы отношения R удаляются все столбцы, соответствующие атрибутам, нс входящим в X, а из полученной таблицы удаляются
Рис. 8.2. Отношения иРис. 8.2. Отношения иреляционные операции.реляционные операции.
Рис. 8.2. Отношения и
Рис. 8.2. Отношения и
реляционные операции.
реляционные операции.
кортежи с одинаковыми значениями. Операция соединения является операцией между двумя отношениями и записывается как R [A = 6]3. Здесь R и 3 являются отношениями, а А и В — атрибутами отношений R и 3 соответственно. Эта операция заключается в том, что из всех комбинаций кортежей в отношениях R и 3 выбираются только тс комбинации, в которых значения атрибута А кортежа из отношения R равны значениям атрибута В кортежа из отношения S, и в паре выбранных кортежей кортеж отношения 3 присоединяется к кортежу отношения R, создается новый кортеж, в который входят все атрибуты отношений R и 3, и данный кортеж выводится. Эта операция эквивалентна вычислению
(У? X S) М = В] с помощью прямого произведения и ограничения. При этом предполагается, что В и 3 не имеют общих атрибутов. Проекция соединения У? [Л = = B]S на множество атрибутов У? называется полуобъединением и обозначается как R<A = B^S.
Условия равенств А = и', А = В, определяющие различные реляционные операции, можно заменить па условия неравенств. В частности, операция для случая, когда условие задастся равенством, называется эквивалентностью.
ИСТОРИЧЕСКИЙ ОБЗОР И КЛАССИФИКАЦИЯ МАШИН БАЗ ДАННЫХ
О. Г. Брэй и др. предложили классифицировать машины БД по числу процессоров, входящих в се состав, и способу поиска информации во вторичной памяти следующим образом [1]:
SP1S : одиночный процессор, косвенный поиск;
SPDS : одиночный процессор, прямой поиск;
MPDS : множество процессоров, прямой поиск;
MPIS : множество процессоров, косвенный поиск;
MPCS : множество процессоров, комбинированный поиск.
Машины БД SPIS-типа можно считать машинами, которые основываются (базируются) на нереляционной модели данных, а машины других типов в основном базируются на реляционной модели.
СПЕЦИАЛИЗИРОВАННЫЕ МАШИНЫ БД SPIS-ТИПА
В машинах SPIS-типа универсальный процессор обычно используется в качестве машины БД главной ЭВМ и выполняет функции управления и обработки БД. К машинам этого типа относятся XDMS [6], INFOPLEX фирмы Bell Labs, DATA COMPUTER [7] фирмы CCA, GDS [8] и IQC [38] фирмы NEC и другие. В их число входят также машины, используемые для обработки БД с помощью микропрограммного обеспечения. К коммерческим машинам такого
типа относятся машины ADABAS фирмы Software AG и IDM500 [9] фирмы Britton Lee. Эти машины были разработаны с середины 70-х гг. по начало 80-х гг. Все они нс имели специализированного аппаратного механизма. Машины SPIS-типа иногда называют еще специализированными программными машинами БД (Software backend).
ФИЛЬТРУЮЩИЙ ПРОЦЕССОР, SPDS-ТИП
На протяжении всех 70-х гг. велись разработки машин SPDS-типа, в которых планировалось эффектив-
Запрос на поиск: ВЫБРАТЬ ПОСТАВЩИКА, ЦЕНУ ПРИ УСПОВИЯХ (ПОСТАВЩИК = "ТЕХАС" или ДЕТАЛЬ = "РЕЗИСТОР") и ЦЕНА>ЗФ.
Блок ассоциативного
Блок поиска В главную ЭВМ части записи
Рис. 8.3. Базовая архитектура системы CAPS.
нос использование основной памяти за счет выполнения в контроллере дисковода независимо от главной ЭВМ таких операций с кортежами, как выбор и ограничение, и пересылки с дискового накопителя в главную ЭВМ только тех данных, которые удовлетворяют условиям поиска. Машина CPDC-типа из всего
потока данных, которые пересылаются с дисковой памяти в главную ЭВМ, нс пропускает данные, нс удовлетворяющие условию поиска, поэтому она получила название фильтрующего процессора. Примерами машин этого типа являются CAPS [10], CAFS3 [12] фирмы ICL, Search Processor [11] Технического университета г. Брауншвейга и др. ;
Быстродействие машины CAPS / составляет 4 Мбайт/с, и она способна осуществлять одновременный поиск по нескольким дорожкам. Контроллер НМД этой машины способен управлять несколькими обычными НМД, но для организации ассоциативного доступа он был оснащен блоком ассоциативного поиска и блоком выборки записи (см. рис. 8.3), что позволяло осуществлять поиск записи по ключевому слову без задержки пересылки данных с диска. Функция обновления отсутствует. Разработанная впоследствии машина CAFS3 была способна выполнять операцию полуобъединения с помощью битовой матрицы с хешированием без задержки пересылки данных.
ВНЕДРЕНИЕ ПАРАЛЛЕЛЬНОЙ ОБРАБОТКИ — MPDS-МАШИНЫ
Машина с параллельной обработкой при ассоциативном поиске во вторичной памяти, используемом в машине SPDS-типа, является машиной MPDS- типа. MPDS-машина — это машина БД, которая снабжена специальным дисковым накопителем, имеющим для каждой дорожки головку считывания/за- писи, электронным диском, запоминающими элементами которого являются ПЗС или ЦМД, и процессором для каждой дорожки, который называется процессорным элементом (ПЭ) или ячейкой. Всевозможные машины этого типа разрабатывались на протяжении всех 70-х гг.
RAP1 [14] Университета г. Торонто является классическим примером MPDS-машины, ее структура показана на рис. 8.4. На каждой дорожке специального диска последовательно записаны кортежи одного отношения. Операции выбора и ограничения выполняются с помощью блока сравнения при прохождении
Рис. 8.4. Архитектура системы RAP.
кортежами обводного устройства, организованного в виде буфера. Если все отношение целиком записано на специальном диске, то эти операции выполняются за один оборот диска. На дорожке имеется множество маркировочных битов (для каждого кортежа)^ по результату сравнения кортежу можно присвоить метку.
Используя команду CROSS MARK, можно выполнить операцию полуобъединения, например R<A = = В) (3 [С = v']). При этом сначала в ячейке, в которой хранится отношение 3, кортежу, удовлетворяющему С = V, присваивается метка. Затем используются ячейка; в которой хранится отношение 3, и ячейка, в которой хранится отношение R, и значения атрибута В кортежа, помеченного в отношении 3, по к (штук) пересылаются в ячейку отношения R к — это число схем сравнения в ячейке. В отношении R помечается тот кортеж, который в качестве значе- чения атрибута А имеет значение, равное какому-либо из этих к значений. Операция присвоения метки в некотором отношении на основании метки, присвоенной в другом отношении, называется операцией cross mark.
Каждый кортеж имеет флаг уничтожения, и для сборки мусора, образующегося в результате уничтожения, в одном месте используется функция пересылки данных в головку записи из буфера.
В машине RAP1 для каждой дорожки диска используется один процессорный элемент и на одной дорожке хранится отношение одного типа. Для смягчения этого ограничения можно рассматривать всевозможные архитектуры, в которых допускается хранение атрибутов отношения в других ячейках, однако в основном функции и возможности этих атрибутов мало чем отличаются.
Первая машина MPDS-типа была предложена Слотником в 1970 г. Его идеи были развиты впоследствии Паркером [40] и Минским [41] и нашли свое воплощение в разработанных следом машинах БД MPDS-типа, таких, как CASSS [42] Университета шт. Флорида (США) (1972 г.), CASSM [13] (1973 г.), RAP [14] (1975 г.) Университета г. Торонто (Кана-
да), RARES [15] (1976 г.) Университета шт. Юта (США) и т. д. В конце 70-х гг. благодаря разработкам ПЗС-элементов и ЦМД-элементов, привлекших к себе внимание в качестве элементов памяти, заполняющих промежуток между существующей в то время МОП-памятью и магнитными дисками, активизировались исследования в сфере MPDS-машин [16, 17], однако, по мере того как исследования этих элементов как новых элементов памяти пошли на убыль, интерес к исследованиям MPDS-машин стал также ослабевать.
Аналогично тому как в машине RAP каждая ячейка снабжена буфером, так и в MPDS-машине для каждой дорожки, имеется обходной буфер, и пока данные проходят через этот обходной путь, осуществляется различная обработка без снижения скорости пропускания данных. Такой способ обработки называется непрерывной обработкой (on-the-fly-pro- cessing).
СНИЖЕНИЕ СТОИМОСТИ МОП-ПАМЯТИ — РАННИЙ ЭТАП MPDS-МАШИН
С конца 70-х гг. по начало 80-х гг. главные надежды возлагались на практическое использование памяти большой емкости на базе ПЗС и ЦМД. Однако удешевление МОП-памяти явилось главной причиной, опровергнувшей эти надежды. В результате было предложено использование МОП ЗУ с произвольной выборкой в качестве рабочего буфера в каждом процессорном элементе MPDS-машины. Примером тому являются машины MICRONET [18] Университета шт. Флорида, RAP3 [24] Технологического университета Middle-Eazt и Университета шт. Аризона и другие. Эти машины называют ранними MPDS-машинами. В связи с применением МОП-памяти непрерывная обработка потеряла смысл. '
ОБЩАЯ АРХИТЕКТУРА — MPCS-МАШИНЫ 1
Во второй половине 70-х гг. появились первые образцы MPCS-машин, представляющих собой комбинацию MPDS и MPIS-машин. Примером тому
является машина DBS [30—32]' (1976 г.), разработанная в Университете шт. Огайо (США). Машины MPCS-типа предполагают кластеризацию (группирование) файлов по значению ключевого атрибута и атрибуту доступа и разбиение файлов на сегменты. Процесс обработки заключается в поиске номера сегмента,
ШинаЛиния ШинаЛинияданныхданныхуправленияуправления
ШинаЛиния
ШинаЛиния
данных
данных
управления
управления
Рис. 8.5. Архитектура машины DBG, DBCCP: процессор для декодирования команд и управления; KXU — блок преобразования ключевых слоев; SM—блок структурной памяти; SMIP—процессор для обработки структурированной информации; IXU — блок преобразования индекса; SFP — процессор с ограничением доступа для обеспечения целостности данных; ММ — память большого объема.
являющегося объектом обработки, в каталоге сегментов и обработке содержимого каждого сегмента, имеющего номер, который совпал с обнаруженным в каталоге. Поиск в каталоге сегментов осуществляется MPIS-архитектурой, а обработка содержимого сегмента — MPDS-архитектурой.
Архитектура машины DBC показана на рис. 8.5. Вся база данных (порядка 1010 байт) хранится в массовой памяти, встроенной в систему циркуляции данных, а каталоги (порядка 107—109 байт)—в структурированной памяти с циклической структурой, кото-
рые функционируют независимо. DBC — это машина с функциональным распределением, при котором поиск в каталоге, обработка каталогов, поиск в массовой памяти и другие операции выполняются независимыми функциональными модулями по принципу последовательной конвейерной обработки. В машине DBC нс предусмотрено выполнение операций соединения и полуобъсдинсния. Ес уязвимым местом являются издержки, связанные с тем, что один процессор DBCCP управляет всей машиной.
НЕОБХОДИМОСТЬ СКОРОСТНОЙ ОБРАБОТКИ ДЛЯ ВЫПОЛНЕНИЯ ОПЕРАЦИИ СОЕДИНЕНИЯ И НЕОБХОДИМОСТЬ СЕТИ СВЯЗИ — MPIS-МАШИНЫ
Реляционная модель, предложенная в начале 70-х гг., вызвала бурную дискуссию относительно двух традиционных моделей данных: иерархической и сетевой. Спор между приверженцами каждой модели, продолжавшийся до середины 70-х гг., постепенно перерос в настоящую войну идей, причем один из главных спорных вопросов был связан с применением операции соединения. Защитники традиционных моделей ставили под сомнение необходимость динамического определения логических связей двух отношений при обработке запросов на поиск, а также выражали неудовлетворение величиной времени обработки, требуемой для этого. Сторонники реляционной модели, в свою очередь, главное внимание уделяли расширению функций поиска, которое влечет за собой операция соединения, разделению логической и физической структур и увеличению на основе этого разделения гибкости системы. Эти идеи постепенно стали распространяться начиная со второй половины 70-х гг. Под влиянием этих идей интерес исследователей стал концентрироваться вокруг скоростного выполнения операции соединения. Кроме того, в конце 70-х гг. стал расти интерес к логическому программированию, и по мере этого начали проводиться исследования в области дедуктивных баз данных, поиск в которых осуществлялся на основе дедуктивных выводов. В дедуктивной БД операция соединения является базовой 23—1145
операцией, эквивалентной логическому произведению, поэтому исследования, направленные на увеличение скорости выполнения операции соединения, приобрели более интенсивный характер.
При выполнении операции соединения необходимо обращение к двум отношениям. В описанных выше машинах MPDS-типа и ранних машинах MPIS-типа различные отношения обрабатывались различными процессорными элементами. Поэтому в случае необходимости проведения обработки при одновременной ссылке к двум и более отношениям требовалось выполнять перекрестную ссылку между процессорными элементами, ведающими этими отношениями. Перекрестная ссылка требует пересылки большого объема данных между различными процессорными элементами. Таким образом, MPDS-машины и ранние MPIS- машины нс подходят для увеличения скорости выполнения операции соединения. Точно так же можно показать, что этой цели нс удовлетворяют и машины SPDS-типа.
Решение этой проблемы было предложено Девиттом и др. Они предложили использовать сеть связи, соединяющую группу процессорных элементов и группу дорожек электронного диска, к которым осуществляют доступ эти процессоры (см. рис. 8.6) [21—23]. Сеть связи можно также расположить между группой дорожек электронного диска и группой дисковых накопителей с перемещаемыми головками. В такой сети связи был использован перекрестный коммутатор. Первая машина с подобной сетью связи называлась DIRECT, и поскольку в ней в качестве буфера перемещения (staging) использовался электронный диск, данная машина была отнесена к типу MPIS- машин. С другой стороны, DIRECT — это параллельная машина МКМД-типа. В качестве контроллера БД используется ЭВМ PDP 11/40, которая управляет группой процессоров и памятью. Соединение процессоров с главной ЭВМ осуществляется по способу ПДП. В процессоре запросов используется ЭВМ PDP 11/03, которая осуществляет операции реляционной алгебры со страницами, распределенными контроллером.
Рис. 8.6. Архитектура системы DIRECT.
Модуль памяти представляет собой ЗУ на ПЗС емкостью 16К байт, которое используется в качестве буфера для пересылаемых с диска файлов. Линии, соединяемые перекрестным коммутатором, имеют ширину 1 бит. Предполагается, что кортежи представлены в виде фиксированных таблиц, а операции с отношениями выполняются путем разбиения этих таблиц на страницы. Обработка выполняется постранично, и в процессоре динамически распределяются страницы, подлежащие обработке. Промежуточные результаты сохраняются в модуле памяти как отношения. Управление страницами, например доступ к странице, распределение и обработка страниц, полностью выполняется контроллером БД, поэтому имеется проблема его перегрузки.
Машина DIRECT способна нс только с высокой эффективностью выполнять перекрестные ссылки благодаря использованию сети связи «процессор — память», но и выполнять обработку посредством разбиения отношений на страницы и постраничного поиска информации. Однако в ней недостаточно были продуманы вопросы увеличения скорости выполнения операции соединения при постраничной обработке, сокращения времени доступа к странице и сокращения суммарного числа операций, если операцию со страницей считать отдельной операцией.
ПРОГРЕСС В ТЕХНОЛОГИИ СБИС И ФУНКЦИОНИРОВАНИЕ БД
В конце 70-х гг. в США наступил период становления и упорядочивания среды проектирования и опытного изготовления заказных СБИС. В это время Кунгом были предложены систелические матрицы и начались интенсивные исследования, связанные с поиском алгоритмов, реализуемых аппаратно на специализированных СБИС. Что касается сферы баз данных, то здесь также в целях ускорения операций соединения при постраничной обработке и сортировке активизировались исследования аппаратно реализуемых алгоритмов. Передовыми достижениями в
этой области считаются двунаправленный сортировщик методом слияния [43], предложенный Тоддом (1978 г.), систелическая матрица для выполнения операции соединения [36], предложенная Кунгом (1980 г.), механизм поиска и механизм сортировки [27], предложенные Танакой из Университета Хоккайдо (1980 г.), и другие. Перечисленные средства позволяли выполнять обработку, которая прежде при использовании одного процессора требовала времени О (и log и) для данных объема п, за время О (и) посредством использования конвейерного способа по отношению к потоку последовательно пересылаемых данных. Поскольку обработка осуществляется, пока протекает поток данных, то Танака называл этот тип обработки потоковой обработкой (data-stream processing). Совмещение двух функций — накопления и обработки в одном модуле — ухудшает реализуемость с точки зрения стоимости системы, требующей накопления больших объемов данных, например базы данных. Поэтому обработка обязательно сопровождается пересылкой данных. В базе данных в большинстве случаев объектом обработки является множество данных. Поэтому для такой обработки необходима пересылка множеств данных. Однако одновременная пересылка всех элементов множества невозможна из-за ограничений, накладываемых на ширину канала передачи, поэтому ничего нс остается как пересылать данные последовательно. В результате объектом обработки становится поток данных, а следовательно, необходим аппаратно реализуемый алгоритм, который позволял бы с высокой эффективностью обрабатывать поток данных. Подробности, касающиеся подобных алгоритмов, уже были изложены в разд. 2.3.
Технология заказных СБИС ускорила исследования в области архитектур машин БД, использующих ассоциативный процессор, выполненный на СБИС. Примерами тому являются машины RELACS [34] (1980 г.), Simple Relation Module [35] (1981 г.) и другие. Можно сказать, что свое происхождение архитектура этого типа берет от исследований Мол- дера [44] и Берра [33], касающихся практического
применения ассоциативного процессора STARAN в системе БД. Более подробно об этом сказано в разд. 6.5.
ПАРАЛЛЕЛЬНОЕ ВЫПОЛНЕНИЕ ОПЕРАЦИЙ
СОЕДИНЕНИЯ И ДИНАМИЧЕСКАЯ КЛАСТЕРИЗАЦИЯ
Внедрение сети связи «процессор — память» сделало возможным перекрестную ссылку, однако нс решило проблемы параллельного выполнения операции соединения. Для параллельного выполнения N процессорами (многоэлементной обработки) операции соединения необходимо разбить отношения R и S, являющиеся объектами обработки, на N сегментов равной величины /?ь R2, . .., Rv и Si, S2, ..., S^. В случае когда разбиение на сегменты выполняется без учета того, каким образом распределены кортежи в каждом сегменте, необходимо выполнить операцию соединения Ri и 3/ для всех комбинаций i и /. Всего требуется выполнить N2 операций соединения. Однако если при выполнении операции соединения R[A = B]S можно разбить R и S таким образом, чтобы для различных i и / ЯДА = В]3/ было пустым, то суммарное число операций соединения для сегментов можно сократить до N. Поскольку такое разбиение зависит от того, для каких атрибутов выполняется операция соединения, то заранее выполнить это разбиение невозможно.
Рассмотрим функцию расстановки h (или хэш- функцию), отображающую множество V значений атрибута А отношения R в множестве {1, ..., Щ. Множество V разбивается с помощью хэш-функции h на классы эквивалентности Vi, V2, ..., Vn. Здесь Vi — это множество, состоящее из элементов и множества V, таковых, что Л(и) = Л Ri— это множество, в состав которого из всех кортежей отношения R входят только тс, значения атрибута А которых входят в Vi. Данное разбиение обозначается как R/h^Ay Если, используя одно и то же значение Л, разбить отношения R и S на Rfh^A) и Sfh^By то для разных i и / RiVA = B]Si является пустым. Если используется N процессоров и в i-м процессоре вычис-
ляется /?1[Л=В]31, то операцию соединения 7? [Л = B]S можно получить в виде суммы этих промежуточных ьх результатов. Таким образом, благодаря использованию хэш-функции h каждое отношение R и S можно разбить абсолютно одинаково.
Разбиение отношения R на R/h(A) в ходе выполнения программы называется динамической кластеризацией. Динамическая кластеризация впервые была использована в сети DP [45], предложенной Одой из NTT. Сеть DP — это многоуровневая сеть связи, соединяющая N дорожек одного цилиндра диска, доступ к которым возможен параллельно, с N процессорами. Каждое отношение хранится в одном цилиндре и N параллельно считанных кортежей направляются на z-й процессор в соответствии с хэш-значением i каждого значения атрибута А. В многоуровневой сети это распределение проводится конвейерным способом, нс задерживает вращение диска и завершается за один оборот диска.
Самым проблематичным моментом в динамической кластеризации является выбор хэш-функции, позволяющей осуществлять равномерное разбиение, т. с. самое сложное — это равномерно распределить нагрузки процессоров. Ёсикава из Токийского университета разрешил эту проблему в машине GRACE [46]. В этой машине между группой дисковых накопителей и буферами ОЗУ, а также между буферами ОЗУ и процессорами расположены сети связи [28, 46]. Динамическая кластеризация выполняется в случае параллельного считывания отношений из дисковых накопителей в буферы ОЗУ. Однако число разбиений N можно задать независимо ни от числа банков буфера ОЗУ, ни от числа процессоров. То есть в отличие от сети DP, где отношение Ri закреплялось за f-м модулем, в машине GRACE каждое отношение Ri распределяется в пространстве памяти в виде полос, пересекающих буферные модули (см. рис. 8.7). Если в машине GRACE в каждом процессоре использовать улучшенный вариант двунаправленного сортировщика слиянием Тодда [43], то для выполнения операции соединения /?ДЛ=В]5/ сегментов Ri и Si эти сегменты можно будет последова-
тельно считывать из группы буферов в любой процессор, находящийся в состоянии ожидания работы. Это можно реализовать посредством соответствующего переключения соединения между процессором и группой банков памяти. Благодаря этому можно обеспечить параллельное выполнение операций соедине-
СетьСетьДискиДискиПроцессорыСетьПроцессорыСетьБуферыБуферыНзНгRiНзНгRiРис. 8.7. Динамическая кластеризация в системе GRACE.Рис. 8.7. Динамическая кластеризация в системе GRACE.
Сеть
Сеть
Диски
Диски
Процессоры
Сеть
Процессоры
Сеть
Буферы
Буферы
Нз
Нг
Ri
Нз
Нг
Ri
Рис. 8.7. Динамическая кластеризация в системе GRACE.
Рис. 8.7. Динамическая кластеризация в системе GRACE.
ния пар сегментов, число которых равно числу процессоров. В проекте DSDBC [29] Танака из Университета Хоккайдо предложил сеть связи SD, способную выполнять оба вида работ: динамическую кластеризацию и сортировку всех сгруппированных в результате кластеризации сегментов.
8.3. АНАЛИТИЧЕСКИЙ ОБЗОР
И ПЕРСПЕКТИВНЫЕ НАПРАВЛЕНИЯ
ИЕРАРХИЯ ПАМЯТИ
В предыдущем разделе был дан краткий исторический обзор машин БД, разработанных до 1982 г. Графически это представлено на рис. 8.8 [47]. Исследования в области машин БД, проводившиеся в 70-х гг., и одновременно с этим развитие микропроцессорной техники оказали существенное влияние на
SPIS
SPDS
MPDS
MPIS
MFCS
Ассоциативный процессор
СБИС
1972-
1973-
1974-
1975-
1976-
1977-
1978-
1979-
1981-
1982-
XDMS [61
Data Computer Pl / (фирма CCA) /
СО5(8Нфирма Ниппон дэнки")!
AD АВ AS-машина
(фирма Software AG
IDM 500(9]
(фирма Britton Lee)
CAFS.1 [Ю] ^ирма ICL
Search Processor[11] (Университет г. Брауншвейга)
CAFS.3[12] (фирма ICL)
)
CASSMl13) (Университет шт. Флорида)
R АРЦ^К (Университет г. Торонто) RARES [15^ (Университет шт. Юта)
ЦМД[16] DBM(IBM)
EDC [17]
\ (Университет
д шт. Флорида)^/-—
RAP.2 [20] DBC Processor [19]DIRECT [21-23]
(Университет(Университет(Университет
г Торонто)шт. Огайо) ^/шт. Висконсин)
едокData Flow D| RECT[25] DFDBCR7]
(ТехническийУниверситет(Университет
университет*шт. Висконсин!Хоккайдо)
Meadle East)
GRACE [28]
(Токийский^Р
университет] DSDBC[29] (Университет Хоккайдо)
DBC[30-32] (Университет шт. Огайо)
(STARAN)[33]
(ЕСАМ)
RE LACS [34] (Университет г. Сиракузы)
SRM135] (Принстонский университет)
Systolic array [36] (Университет Карнеги-Меллона)
SEE [27] SOE, (Университет Хоккайдо)
Рис. 8.8. Машины БД до периода их анализа (1982—1983 гг.).
увеличение емкости и снижение стоимости БИС ОЗУ, и основной поток исследовательских работ постепенно стал отклоняться в сторону MPIS-машин. В то время специальные диски, имеющие для каждой дорожки головку считывания/записи, даже не были запущены в производство (исключая использование в
Память обработки
Буферная память
Вторичная память
Машины БД
1972
3
4
1975
6
7
8
9
1980
1
2
198?
Диск
I
CAFS.1
RAP.1
ЦМД DBM
DIRECT
FAST 3805
DSDBC
Ьв кой
Сдвиговый регистр
Диск с головкой на каждую дорожку
Электронный вращающийся дис
к
Электронный | вращающийся дис
Диск
I
Полупроводни- ковый диск
МОП ОЗУ
МОП ОЗУ
Диск|
МОП ОЗУ
МОП ОЗУ
Полупроводниковый диск
Дисковая Диск с пере эш-память щаемой гол
Рис. 8.9. Изменения, происшедшие в иерархии памяти машин БД.
одной коммерческой ЭВМ), а пришедшие им на смену электронные диски на основе ПЗС и ЦМД не смогли противостоять снижению стоимости и увеличению объема МОП ЗУ и уступили им свое место как элементы памяти. В результате в сфере машин БД распространилось понимание того, что без использования НМД с перемещаемыми головками в системе вторичной памяти нс обойтись. Рис. 8.9 иллюстрирует, какие изменения произошли в иерархии памяти машин БД [47]. Память обработки — это такая память, доступ к которой осуществляется непо-
средственно устройством обработки, и она используется как рабочая память в процессе обработки. Буферная память используется в качестве промежуточной для вторичной памяти, она позволяет сократить время доступа ко вторичной памяти и вместе со вторичной памятью предоставляет большое пространство виртуальной памяти.
ОЦЕНКА ВОЗМОЖНОСТЕЙ
Обозначим число кортежей в отношении через п (в случае когда рассматриваются два отношения — п и т), число процессоров —- через Р, число схем сравнения в одном процессоре — С, размер сегмента — 3, суммарный объем буферной памяти — В. В зависимости от используемых методов обработки, которые были предложены до 1982 г., время, требуемое на выполнение только одной операции реляционной алгебры, изменяется, как показано на рис. 8.10 [47].
Сравнительный анализ возможностей различных машин БД с частичным учетом времени доступа к диску и издержек был проведен Хавторном и др. в 1982 г. [48]. Для сравнения они использовали характеристики ассоциативного диска машин CAFS3, CASSM, RAP, DBG, DIRECT, а также усовершенствованную с точки зрения производительности модель машины INGRES в качестве типичного представителя СУБД на основе программного обеспечения. Ассоциативный диск — это дисковый накопитель, головки которого (для каждой дорожки одного цилиндра) снабжены логическими ячейками, выполняющими функцию сравнения, усовершенствованный таким образом, что он способен вести параллельный поиск. При выполнении операции выбора для одного отношения лучшие результаты показали ассоциативный диск, CAFS3, DBC, производительность которых в 1,2—1,3 раза превысила производительность INGRES. Напротив, что касается RAP и DIRECT, то в самом худшем случае для них потребовалось время в 1,5 раза больше, чем для обработки на INGRES. Это объясняется тем, что из-за отсутствия буфера
Операции выбора/ограничения
Операция полуобъединения
Операция соединения
Потоковая обра- О (п) ботка
Перекрестная метка
Перекрестная метка
SIMD-машина
Битовая матрица с хэшированием
О (я + т)
Сортировка в странице
п • m • log SPS
Сортировщик О (п)Сортировщик О (п)Применение пере- ^Л п В \ местимых файлов и ^10£ В ' Р )
Сортировщик О (п)
Сортировщик О (п)
Динамическаякластеризация
Рис. 8.10. Методы обработки в машинах БД и время обработки, п, т— число кортежей в отношении, Р— числопроцессоров; С — число блоков сравнения в одном процессоре; S — размер сегмента; В — суммарная емкость бу-феров памяти.
для хранения отношения — объекта обработки все страницы этого отношения приходилось считывать из вторичной памяти. В машине INGRES, имеющей пе- реместимые файлы, из вторичной памяти считываются только тс страницы, которые содержат кортежи, удовлетворяющие условию поиска.
При выполнении операции соединения двух отношений все машины показали результаты, лучшие, чем у INGRES, причем самый лучший результат показала машина DIRECT, производительность которой в 10 раз превысила производительность INGRES. Второе и третье места разделили ассоциативный диск и DBC, которые немногим уступили DIRECT. Далее места распределились в таком порядке: RAP, CAPS, CASSM. Отмстим, что ассоциативный диск работал с поддержкой со стороны главной ЭВМ.
Операция, при которой по значению некоторого атрибута производится разбиение отношения на группы, определяется сумма значений численных атрибутов, имеющихся в каждой группе, и определяется отношение, состоящее из пар значений, первое из которых — это указанное выше суммарное значение, а второе — значение атрибута, используемое для разбиения на группы, называется операцией агрегациц (или составной операции). Скорость выполнения этой операции в значительной мере зависит от того, имеет ли обрабатывающий модуль арифметические функции или нет. Лучшие результаты здесь показала машина БД, обрабатывающий модуль которой выполнен на базе универсального процессора, например, как в машине DIRECT.
По результатам анализа, проведенного Хавтор- ном, видно, что при выполнении простых реляционных операций ни одна машина БД не способна показать производительность, заметно превосходящую производительность по сравнению с обработкой программным путем. Также следует отмстить, что при выполнении операции соединения весьма заметен эффект от использования сети связи «процессор — память».
В 1983 г. были опубликованы результаты сравнительного анализа характеристик действующих машин
БД и программного обеспечения БД на основе эталонных тестов, который был проведен в Университете шт. Висконсин (США) [49]. Для сравнения были взяты пять машин: DIRECT, разработанная в этом же университете, IDM500 фирмы Britton Lee, университетский и коммерческий вариант машины INGRES и ORACLE, причем последние три — это программные СУБД.
Согласно опубликованным результатам, при выполнении простых реляционных операций DIRECT показывала производительность, худшую, чем у обеих машин INGRES. Такое поведение объясняется двумя причинами. Первая, как уже было показано при анализе Хавторна, заключалась в невозможности эффективного использования переместимых файлов. Однако даже в том случае, когда перемести- мых файлов нс было, производительность DIRECT была хуже производительности коммерческой машины INGRES. Это можно объяснить издержками при передаче сообщений между процессором БД и процессором запросов. Что касается машины IDM500, то в анализе се возможностей принимали участие две модели: с акселератором и без акселератора, однако эффект от использования акселератора был незначителен.
Эта публикация содержала и результаты анализа, касающегося сложного поиска, включающего операцию соединения. При этом в отличие от результатов, полученных Хавторном, машина DIRECT показала производительность, составляющую всего лишь 1/2—1/4 производительности коммерческой INGRES.
В основу этих оценок производительности, опубликованных в 1982—1983 гг., была положена так называемая «силовая» обработка, т. с. параллельная обработка со сравнением всех кортежей в отношении, что ускорило повторные исследования архитектур существующих машин БД. Постепенно получила признание идея о необходимости внедрения архитектур машин БД, в которые можно было бы легко встраивать различные методы, используемые в программных СУБД, например такие, которые бы позволили
эффективно использовать индексную информацию типа переместимых файлов и сократить всевозможные издержки.
ДИСКОВЫЙ ПАРАДОКС
Исследования, относящиеся к оценке производительности, проведенные в 1982—1983 гг., ускорили рассмотрение вопросов, связанных с методами обработки, используемыми в разработанных до этого времени машинах БД. Однако Боралом и Девиттом была обнаружена более существенная проблема, касающаяся исследований в области машин БД [50]. Они провели описанные ниже исследования и показали, что без кардинального изменения вторичной памяти, основу которой составляет магнитный диск, нс имеет смысла создавать высокопараллельную машину.
Как уже было изложено в п. 8.3.1 и 8.3.2, в машинах БД, объектами которых являются крупномасштабные БД, неизбежно использование НМД с перемещаемыми головками в качестве вторичной памяти. При построении машин БД, имеющих пространство вторичной памяти постоянного объема, число N используемых дисков обратно пропорционально емкости V одного диска. Способность подачи данных из системы вторичной памяти в обрабатывающий блок нс должна превышать произведения числа используемых дисков N на скорость пересылки данных р в/из используемого НМД. Это произведение называется максимальной подающей способностью системы вторичной памяти. Поскольку N обратно пропорционально V, то максимальная подающая способность прямо пропорциональна р/К
К сожалению, тенденция развития и разработки дисков большой емкости проводилась в направлении сокращения отношения р/V. Например, если проанализировать системы IBM 3330, 3350, 3380, выпущенные в период с 1970 по 1980 г., то можно заметить, что емкость НМД увеличивалась: 100М, 317М, 630М байт соответственно, скорость пересылки данных также увеличивалась: 0,8Мбайт/с, 1,2Мбайт/с, 3,0Мбайт/с. Однако если максимальную подающую способность
системы IBM 3330 принять за условную 1, то для системы 3350 она составила 0,473, а для 3380—0,595. Это объясняется тем, что увеличение емкости НМД было достигнуто больше за счет увеличения числа дорожек, чем за счет увеличения емкости каждой дорожки. Скорость пересылки данных 3 Мбайт/с в системе 3380 является очень высоким значением и для машины, которая осуществляет обмен данными, и пока этот рекорд нс побит. Однако поскольку в свою очередь существенно возросла и емкость НМД, то по прогнозу максимальная подающая способность системы вторичной памяти будет продолжать снижаться. С развитием техники параллельной обработки обрабатывающий блок можно будет спроектировать так, что его быстродействие станет еще более высоким, однако поскольку при этом максимальная подающая способность из системы вторичной памяти в обрабатывающий блок еще больше упадет, то использование техники высокоскоростной обработки в процессоре оказывается лишенным смысла.
ЗАДАЧА НОВОЙ ТЕХНОЛОГИИ
Как уже было отмечено выше, период с 1982 по 1983 г. можно назвать периодом анализа исследований, проводившихся до сих пор в области машин БД. Этот анализ позволил высветить три необходимости:
обработку с высокой эффективностью множества простых транзакций,
эффективное использование программных методов обработки в БД,
повышение подающей способности системы вторичной памяти.
Первая необходимость обусловлена такими техническими задачами, как эффективное использование индексов, параллельное управление исполнением программ, соответствующее параллельной обработке, разбиение файлов и проч. Вторая необходимость обусловлена применением в обрабатывающем модуле универсального процессора и структуры данных типа бинарного дерева. Посредством структурирования дан-
ных и отказа от «силовой» обработки всех отношений доступ к памяти обработки и к буферной памяти можно сделать произвольным. Чтобы сделать возможным одновременный доступ к индексам от двух и более обрабатывающих модулей, желательно, чтобы эти модули имели общую память.
Создание многопортовой памяти. Для реализации третьего условия предлагаются такие методы, как использование многопортовой дисковой памяти, использование многопортовой страничной памяти большого объема в качестве буферной памяти, разбиение файлов, позволяющее сократить число страниц, которые необходимо считывать с диска при поиске информации, и другие. В современных дисковых накопителях используется способ доступа с помощью исполнительного механизма (активатора), который позволяет разбить общее число дисков на две независимо функционирующие половины. Благодаря такому усовершенствованию получается, что в одном НМД существует два независимых дисковых накопителя половинной емкости. Таким образом, можно сделать многопортовую дисковую память и удвоить се подавляющую способность.
Эффективным является также использование в качестве буферной памяти многопортовой памяти большого объема со страничной организацией, описанной в разд. 6.4.3. Если общее число портов равно NP + + Nd, из которых порты 'Nd используются для подключения к группе дисковых накопителей, то буферная память и диски образуют древовидную иерархическую память, число портов которой равно ND. Если емкость буферной памяти взять достаточно большой, то скорость пересылки данных такой иерархической памяти будет равна скорости пересылки через один порт многопортовой страничной памяти. Поскольку даже при большом числе портов NP скорость пересылки данных через один порт нс изменяется, то скорость подачи данных из системы вторичной памяти можно заметно увеличить. Данный метод был использован в системе MPDC [52, 53] Университета Хоккайдо, о которой будет сказано ниже.
Разбиение файлов. Для увеличения способности подачи данных вторичной памяти необходимо также сократить число страниц, подлежащих считыванию при поиске информации, и сократить частоту доступ с к диску. Если атрибут, который фигурирует в ус- ло^ли поиска, однозначно определен в каждом отношении и если каждое отношение разбить на страницы, размер которых зависит от значения этого атрибута, то независимо от различий в запросах при любом поиске кортеж, удовлетворяющий условию поиска, будет находиться либо в той же, либо в соседней странице. Кластеризация файлов в данном случае называется статической кластеризацией, а поскольку такая кластеризация осуществляется относительно значения некоторого одного атрибута, то она называется одноатрибутной статической кластеризацией.
Кроме того, статическая кластеризация подразделяется на два класса: адаптивную и неадаптивную. Адаптивная кластеризация предполагает динамическое составление каталога страниц в соответствии с распределением значений атрибутов кластеризации объектного файла, причем при обновлении автоматически принимаются меры против переполнения или нехватки страниц, проводится разбиение или слияние страниц для обновления самого каталога страниц. Обновление можно выполнить с помощью локальных операций, т. с. пересмотра всего разбиения файлов нс требуется. Напротив, при нсадаптивной кластеризации предварительно делается предположение относительно распределения значений атрибутов кластеризации объектных файлов, на основании которого сначала составляется каталог. Переполнение каталога страниц при обновлении предотвращается путем увеличения объема хранения и соединения пустых страниц с помощью указателей. Нехватка страниц игнорируется. В любом случае каталог нс обновляется. Если в результате многочисленных обновлений переполнения локализуются, то цепочка страниц, соединенных с помощью указателя, удлиняется и эффект от кластеризации снижается. В таких случаях необходимо снова с самого начала произвести раз-
биение файлов. Эта операция называется реконфигурацией файлов.
При обработке данных базы данных более всего подходит адаптивная статическая кластеризация. Если в каждом отношении существует по одному атрибуту кластеризации, то можно использовать такие методы, как В+-дерево [54], динамическое хеширование [55], виртуальное хеширование [56] и т. д. Методы, перечисленные после динамического хеширования, были задуманы для практического применения в базах данных. Публикации, посвященные им, стали появляться одна за другой во второй половине 70-х гг., и каталог в виде В+-дерева был представлен нс с помощью древовидной структуры, а с помощью хеш-функции, что позволило увеличить скорость поиска в каталоге. Среди перечисленных методов динамическое хеширование и расширяемое хеширование позволяют использовать функцию сохранения порядка в хеш-функции, т. с. имеется возможность выполнять кластеризацию в нескольких диапазонах значений с сохранением порядка следования значений атрибутов. В системе DSDBC Университета Хоккайдо для кластеризации было использовано расширяемое хеширование, причем для управления и обработки его был предложен функциональный модуль, названный механизмом Trie [29].
В случае когда атрибут кластеризации один, то несмотря на то, что указываются значения других атрибутов, для считывания всех кортежей, удовлетворяющих этому атрибуту, из вторичной памяти необходимо считать все страницы, поэтому при таком поиске эффект от кластеризации отсутствует. Когда атрибутов много и указывается любое значение атрибута, то следует использовать способ разбиения файлов, при котором с хорошим балансом уменьшается число страниц, содержащих кортежи, удовлетворяющие этому значению. Этот способ называется многоатрибутным разбиением файлов. Для получения хорошего баланса планируется минимизация среднего и максимального значений числа страниц, к которым запрашивается доступ.
К адаптивным многоатрибутным способам разбиения файлов относятся метод расширенного к — d- дерева Чанга [59], метод к — а-дерева Оренштейна [60], метод цветного двоичного дерева Танаки [61], метод К — D — В-дерева Робинсона [62] и др. Аббревиатура к.— d и К — D, фигурирующая в этих названиях, означает ^-мерное или К-мерное (от (А) /(-dimensional). Если в случае кластеризации с п атрибутами распределения значений этих атрибутов одинаковы, то среднее значение частоты обращений к странице, требуемое, когда указывается значение /-го атрибута из п атрибутов при условии, что общее число страниц равно N, составляет порядка О (N^n-i>)/ny Если i равно 1, то при п, большем 4, эффект от кластеризации уменьшается, и в подобных случаях кластеризация лишена практического смысла. Поэтому одной из задач будущего является проведение исследований многоатрибутных методов разбиения файлов, подходящих для использования в машинах баз данных.
Управление макропотоков данных. Среди способов параллельной обработки, используемых при работе с БД, можно выделить следующие два: параллельная обработка, содержащаяся в каждой операции при каждом запросе на поиск, и параллельная обработка при одновременном поступлении запросов на поиск от множества пользователей. До середины 80-х гг. внимание уделялось в основном первой разновидности параллельной обработки, в частности, исследователей интересовала возможность ускорения выполнения сложных операций типа операции соединения за счет параллельной обработки. В то же время возможность ускорения за счет использования параллельности обработки запросов на поиск оставалась недостаточно изученной.
В системах управления базами данных программным путем скорость обработки была повышена за счет параллельной обработки множества запросов на поиск информации. Термин «одновременное обслуживание» нс отрицает необходимости управления с помощью планировщика для правильного обслуживания запросов на поиск. Допустим, что запрос на пс-
ревод 100 тыс. иен на счет г-на А поступил одновременно от двух вкладчиков. Обработка запросов в подобных случаях заключается в том, что считывается остаток вклада b на счету г-на А и на его счет записывается b + 100. Если эти два запроса обслуживаются последовательно, то остаток вклада на счету г-на А увеличивается на 200 тыс. иен. Однако, если в то время, как обслуживается один из запросов и остаток вклада увеличивается на 100 тыс. иен, выполняется обслуживание другого запроса, то остаток вклада г-на А увеличивается только на 100 тыс. иен. Последовательность операций, выполняемых при обработке денежных вкладов, на которые нс влияют результаты других операций, называется транзакцией. При параллельной обработке множества транзакций или просто параллельной обработке необходимо планировать каждую операцию и весь порядок действий таким образом, чтобы результаты поиска, полученные при этом, и изменения в базе данных были равны результатам, полученным при последовательном выполнении транзакций в любом порядке. Такое управление называется управлением параллельным выполнением транзакций. Для реализации такого управления были предложены различные алгоритмы (методы), например метод с использованием блокировки, метод с использованием отметок времени и другие.
В машинах баз данных параллельная обработка транзакций также необходима для увеличения их быстродействия, поэтому желательно направить усилия исследователей на изучение систем управления параллельным выполнением транзакций, пригодных для любой архитектуры машин БД, а также на изучение архитектур, подходящих для реализации систем управления параллельным выполнением транзакций, обеспечивающих высокопараллельную обработку.
Машина MPDC, разработанная коллективом, возглавляемым Танакой из Университета Хоккайдо, имеет структуру, показанную на рис. 8.11. Многопортовая страничная память машины соединена с группой процессоров, каждый из которых имеет локальную память, а также с группой контроллеров дисковых
Управляющая подсистема
Подсистема данных
VZZZZZZZZZZZZZZZZZA VZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZA Сеть команд/состояний для страничных ^—^операций
Таймерстраничныхопераций
Командерстраничныхопераций
Интерфейсный /супервизорныймодуль
Менеджербуферастраниц
Процессорзапросов
Блок поискав каталоге
Контроллер макропарал лельных потоков данных
Таймер пересылки сегментов
7ZZZZZZZZZZZZZZZZZZZZZZZZz."7ZZZZZ>
Общий буфер страниц
7ZZZZZZZZZZ TZ 7ZZZZZZZZZZZZZZ ZZ TZZZZZZZzA
2ZZZZL
( Ц Процессоры сегментов
Дисковые подсистемы
Командерпересылкисегментов
<Zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz2zzzzzzzzzzZ
V
Шина команд для пересылки
( сегментов
Шина состояний для пересылки сегментов
Рис. 8.11. Структура машины MPDC.
накопителей. Управляющая подсистема выполняет анализ запросов на поиск, осуществляет поиск в каталоге, анализирует операции со страницами в каждой операции в транзакции и планирует операции со страницами [52]. Каждая страничная операция выполняется свободным процессором из группы процессоров. В системе MPDC был использован адаптивный многоатрибутный метод разбиения файлов с использованием цветного двоичного дерева [61], поэтому операции над отношениями разбиваются на операции со страницами, составляющими это отношение. Операции над множеством страниц, полученных в результате разбиения одного отношения, можно выполнять одновременно и независимо друг от друга. Две страничные операции, полученные в результате разбиения различных операций в одной транзакции, имеют зависимость от потока данных, существующего между исходными операциями. Управление порядком выполнения двух страничных операций, полученных в результате разбиения операций в различных транзакциях, осуществляется по алгоритму управления параллельным выполнением, при котором обработка выполняется последовательно, а нс одновременно.
В машине MPDC страничная операция принята за единицу управления параллельной обработкой или единицу управления одновременным выполнением, т. с. управление выполнением осуществляется на основе потоковой архитектуры, описанной в гл. 5 [53]. Поскольку операция в данном случае является макрооперацией, операндом в которой является страница, то управление потоком данных в этом случае называется макроуправлснисм потоком' данных. При мак- роуправлении время обработки запускаемой операции больше времени, требуемого на управление се запуском, поэтому издержками, вызванными управлением запуском, которые являются серьезной проблемой при обычном управлении потоком данных, можно пренебречь.
В системе MPDC работа управляющей подсистемы основана на управлении потоком данных, при котором последовательно запускаются команды страничных операций. Если запускаемая команда является
командой пересылки страниц между диском и многопортовой страничной памятью, то она посылается в контроллер диска, в котором указывается адрес страницы, и там выполняется. Об окончании выполнения команды извещается управляющая подсистема и соответствующая фишка перемещается к началу на графе потока данных. Если запускаемая команда предназначена для выполнения операции в странице, хранящейся в многопортовой страничной памяти, и результат этой операции должен быть помещен в другую страницу этой же памяти, то управляющая подсистема пересылает данную команду в процессорный блок. Эта команда принимается и обрабатывается любым процессором, который в данный момент нс занят обработкой. Процессор считывает исходную страницу из многопортовой страничной памяти в свою локальную память, выполняет автономно нужную обработку и пересылает результаты, помещенные в его память, в страницу назначения. После окончания всех этих действий он передаст сигнал окончания в управляющую подсистему. При приеме этого сигнала управляющая подсистема перемещает соответствующую фишку в начало на графе потока данных.
Другие направления в развитии техники. Чрезвычайно важным моментом является наделение конт- троллера НМД интеллектуальными возможностями, позволяющими только с его помощью выполнять различного рода обработку. Благодаря этому появится возможность не только снизить нагрузку на процессорный блок, но и уменьшить объем передаваемой информации между НМД и процессорами.
Для эффективного использования программных методов обработки в базе данных следует не только рассматривать использование специализированных механизмов, осуществляющих обработку потоков данных, но также тщательно изучить возможность их совместного использования вместе с универсальными процессорами. Такой подход был реализован в машине IDP фирмы «Хитати», где большая универсальная ЭВМ имела встроенный матричный процессор для обработки потоков данных. Благодаря этому операции с потоками данных, например операция
соединения, выполняются с высокой скоростью с помощью встроенного матричного процессора, а для простой обработки транзакций, например обработки с использованием традиционных программных приемов с перемещением файлов и др., используются вычислительные возможности универсальной ЭВМ [63]. Танака из Университета Хоккайдо для обоюдного использования параллельной обработки и программных методов серьезное внимание уделяет использованию многопортовой памяти, поэтому вслед за публикациями, посвященными многопортовой страничной памяти, появились публикации, в которых описывается структура многопортового ОЗУ [64]. Интерес к созданию многопортовых ОЗУ на элементном уровне проявляли и другие исследователи, однако отличительная особенность работ Танаки заключается в том, что он пошел по пути комбинирования однопортовых БИС ОЗУ или БИС ОЗУ с малым числом портов и создания на их основе многопортового ОЗУ. Что касается параллельной обработки в базе данных, то и в прошлом предлагались методы параллельной обработки массивов данных, конвейерной обработки и др., однако для эффективного использования программных подходов необходимо обращение со структурами данных, например со списковой структурой, снабженной указателями, или древовидной структурой, поэтому для параллельной обработки в данной ситуации возникает проблема совместимости этих структур. Эту проблему может разрешить многопортовое ОЗУ. Если сделать возможной параллельную обработку различных структур данных, то будет сделан еще один шаг на пути развития баз данных и, очевидно, появится возможность разработки машин баз знаний, способных выполнять параллельную обработку в базе знаний.
Наибольший интерес с точки зрения перспектив развития архитектур высокоскоростной обработки баз данных представляют оптические средства хранения и обработки информации. Поэтому с полной уверенностью можно .ожидать появления архитектур, в которых будут удачно использованы свойства оптических и магнитооптических дисков.
СПИСОК ЛИТЕРАТУРЫ
Глава 1
Goldstein, Н. Н.: The Computer from Pascal to von Neumann, Princeton University Press, Princeton, N. J. (1972)
Smith, D.E.: A Source Book in Mathematics, McGraw-Hill, New York (1929)
3) Morrison, P., and Morrison, E. (eds.) : Charles Babbage and His Calculating Engines, Dover, New York (1961)
Randell, B. (ed.) : The Origins of Digital Computers: Selected Papers, Springer-Verlag, Berlin <1973)
5) Burks, A. W„ Goldstine, H. H., and von Neumann, J.: “Preliminary Discussion of the Logical Design of an Electronic Computing Instrument” (1946) (# #Ш6), (7)0^5^, (8)^MM)
6) Bell, C. G. and Newell, A.: Computer Structures: Readings and Examples, McGraw-Hill, New York (1971)
7) von Neumann, J.: Collected Works (ed. A. H. Taub), 6 vols., Pergamon, New York (1963) ; vol. 5: Design of Computers, Theory of Automata and Numerical Analysis.
Swartzlander, E. E. (ed.) : Computer Design Development: Principal Papers, Hayden, New York (1976)
9) Samet, J. E.: Programming Languages: History and Fundamentals, Prentice Hall, Englewood Cliffs, N. J. (1969)
Wilkes, M. V.: “The Best Way to Design an Automatic Calculating Machine,” Rept. of the Manchester University Computer Inaugural Conf., Manchester University, Electrical Engineering Dept., pp. 16-18 (1951) (#^X1IM8)^MM)
Husson, S. S.: Microprogramming: Principles and Practices, Prentice-Hall, Englewood Cliffs, N. J. (1970)
Chu, Y.: Computer Organization and Microprogramming, Prentice-Hall, Englewood Cliffs, N. J. (1972)
Chu, Y.: High-Level Language Computer Architecture, Academic Press (1975)
Flynn, M. J.: “Very High-Speed Computing Systems,” Proc. IEEE, vol. 54, pp. 1901-1909 (1966)
Swan, R. J., Fuller, S. H., and Siewiorek, D. P.: “The Structure and architecture of Cm*: A Modular, Multi-Microprocessor,” in Computer Science Research Review, Carnegie-Mellon Univ. Dept, of Computer Science (1976)
Seitz, C. L.: “The Cosmic Cube,” CACM vol. 28, no. 1, pp. 3-44 (1983)
7п-тч>Х-^Ч>Ь-^ХтДХй: FPS-T ^9 -Х-з>е^-7 (1986)
Ж^№^: Occam k h7>7t^^-7, ^№(1986)
Fuller, S. Н., Swan, R., and Wulf, W. A.: “The Instrumentation of C. mmp: A Multi-miniprocessor,” IEEE Compcon (1973)
Lawrence Livermore Laboratory: “The S-l Project: Annual Reports,” vol. 1 Architecture, vol. 2 Hardware, and vol. 3 Software, UCID-18619, Univ, of Calif., Livermore (1979)
Tandem Computers, Inc.: Tandem/16 System Description (1976)
Kowalik, J. S. (ed.) : Parallel MIMD Computation: HEP Supercomputer and Its Applications, The MIT Press, Cambridge, MA (1985)
Bouknight, W. J. et. al.: “The ILLIACIV Systems,” Proceedings of IEEE, vol. 60, no. 4, pp. 369-388 (1972)
Ш, ^:^№ЖМ1Ж, *-Att(1976)
Hord, R. M.:. The ILLIAC IV, Computer Science Press (1982)
Jensen, C.: “Taking Another Approach to Super Computing,” Datamation, Feb., 1978, pp. 159-172
Kuck, D. J. and Stokes, R. A.: “The Burroughs Scientific Processor (BSP),” IEEE Trans, on Comp., C-31, no. 5, pp. 363-376 (1982)
Lawrie, D. H. and Vora, C. R.: “The Prime Memory System for Array Access,” IEEE Trans, on Comp., C-31, no. 5, pp. 435-442 (1982)
Unger, S. H.: “A Computer Oriented .toward Spatial Problems,” WJCC, 13 (1958)
Slotnick, D.L, Borck, W.C.and McReynolds, R.C.: “The Solomon Computer,” FJCC, 22, pp. 97-107 (1962)
Gregory, J. and McReynolds, R.: “The Solomon Computer,” IEEE Trans, on Electronic Comp., EC-12, no. 6, pp. 774-781 (1963)
Beetem, J., Denneau, M. and Weingarten, D.: “The GF-11 Super Computer,” Proc, of the 1985 Infl Conf, on Parallel Processing, pp. 108-115 (1985)
ЙШ. 1£Ш, ИЖ SP: “ЙЖГМШ PAX-128”, Ж^М¥^^ J 67-D g, 8^, pp. 853-860 (1984)
SP ЛШ: PAX □>t°i-^, *-Д#(1985)
Batcher, К. E.: “Design of a Massively Parallel Processor,” IEEE Trans. C- 29, no. 9, pp. 836-840 (1980)
Batcher, К. E.: “Bit Serial Parallel Processing Systems,” IEEE Trans. C-31, no. 5, pp. 377-384 (1982)
Potter, J. L. (ed.) : The Massively Parallel Processor,” MIT Press (1985)
Duff, M. J. B.: “A User’s Look at Parallel Processing,” Proc, of 4 th Infl Conf, on Pattern Recognition, pp. 1072-1075 (1978)
Hockney, R. W. and Jesshope, C. R.: Parallel Computers: Architecture, Programming and Algorithms, Adam Hilger Ltd., Bristol, England (1981)
Kondo, T. et. al.: “An LSI Adaptive Array Processor, ” IEEE Trans. SC-18, no. 2, pp. 147-156 (1983)
Barr, R. G. et. al.: “A Research-Oriented Dynamic Microprocessor,” IEEE Trans. C-22, no. 11, pp. 976-985 (1973)
Hagiwara, H. et. al.: “A Dynamically Microprogrammable Computer with Low Level Parallelism,” IEEE Trans. C-29, no. 7, pp. 577-595 (1980)
Tomita, S. et. al.: “A Computer with Low-Level Parallelism QA-2: Its Applications to 3-D Graphics and Prolog/Lisp Machines,” Proc, of 13 th Inti Sympo. on Computer Architecture, pp. 280-289 (1986)
НЖ ffe: “v^D>t^-?Be£fi^XrAMC-l”, 1tWM^ 7-^WtM^ CA58-5 (1985)
Ramamoorthy, С. V. and Li, H. F.: “Pipeline Architecture,” ACM Computing Surveys, vol. 9, no. 1, pp. 61-102 (1977)
MacDougall, M. H.: “Instruction-Level Program and Processor Modelling,” IEEE Computer, vol. 17, no. 7, pp. 14-24 (1984)
Lee, J. K. F. and Smith, A. J.: “Branch Prediction Strategies and Branch Target Buffer Design,” IEEE Computer, vol. 17, no. 1, pp. 6-22 (1984)
McFarling, S. and Hennessy J.: “Reducing the Cost of Branches,” 13 th Inti Sympo. on Computer Architecture, pp. 396-403 (1986)
Hwang, K.: Computer Arithmetic: Principles, Architecture and Design, Wiley, New York (1979)
Kogge, R. M.: The Architecture of Pipelined Computers, McGraw-Hill (1981)
Riganati, J. P. and Schneck J. P.: “Super Computing,” IEEE Computer, vol. 17, no. 10, pp. 97-113 (1984)
Floating Point System, Inc.: АР-120 В Processor Handbook, Portland (1976)
IBM Corp.: “IBM 3838 Array Processor Functional Characteristics,” no. 6 A24-3639-0, file no.S370-08, Endicott, N.Y. (1976)
Datawest Corp.: “Real Time Series of Microprogrammable Array Transform Processors,” Prod. Bulletin Series В (1979)
m, 16£: “ЖЯШ^ММК? b /Р^Ж^^”, 1*$№£1^Й, 24^2^, pp. 191-199 (1983)
Riganati, J. P. and Schneck, P. B.: “Super Computing,” IEEE Computer, vol. 17, no. 10, pp. 97-113 (1984)
^MB8: “X-/O>t° Л-^АН”, з > e • 7 7 b 7 =-7, 2 # 3 ^, pp. 2-26 (1985)
TO, ФЭ, W*: X-/<D>e^-?, ^#(1985)
#Ж, W*. ±^№: X-/O>t°^-7, ^№№(1985)
Control Data Corp.: Control Data STAR-100 Features Manual, St. Paul, Minn., pub. no. 60425500 (1973)
Texas Instruments Inc.: Description of the ASC System: Part 1 to 5, Manual Nos. 934662 to 934666 (1971)
Russel, R. M.: “The CRAY-1 Computer System,” CACM vol. 21, no. 1, pp. 6372 (1978)
Lubeck, О., Moore, J., and Mendez, R.: “A Benchmark Comparison of Three Super Computers: Fujitsu VP-200, Hitachi S810/20 and CRAY X-MP/2,” IEEE Computer, vol. 18, no. 12, pp. 10-23 (1985)
W, ВВЯЗ, «*, ВВП: “v^-iM 9 )V 7.5ns «-^L^^J/M ^A > teS^OX-vx-nye^-^ FACOM VP”, Bgxu; bn-^x, no.314, pp. 131-155 (1983)
Myers, G. J.: Advances in Computer Architecture, John Wiley & Sons, N. Y. (1978)
Iliffe, J. K.: Basic Machine Principles, 2nd ed., Macdonald, London (1972)
Feustel, E. A.: “On the Advantages of Tagged Architecture,” IEEE Trans. Comput, vol. C-12, pp. 644-656 (1973)
Creech, B. A.: “Architecture of the Burroughs B-6500,” in J. Tou (ed.), Software Engineering, pp. 29-43, Academic, N. Y. (1970)
^ Ш*: XM^WO)^ МЖ№(1981)
^VA. }.-№<, Кй^-ЩК: “7t-/^. bU7>b• WK*\ t^u ?Ь:М±(1986)
Katzman, J. A.: “System Architecture for Non Stop Computing,” Compcon, pp. 77-80, (1977)
Jones, A. K.: “The Object Model: A Conceptual Tool for Structuring Software,” in Operating System, Lecture Notes in Computer Science Series, Springer-Verlag (1978)
Fabry, R. S.: “Capability-Based Addressing,” CACM, vol. 17, no. 7, pp. 403412 (1974)
Dennis, J. B. and Van Horn, E. C.: “Programming Semantics for Multiprogrammed Computations, ” CACM, vol. 9, no. 3, pp. 143-155 (1966)
Houdek, M. E., Soltis, F. G., and Hoffman, R. L.: “IBM System/38 Support for Capability-Based addressing, ° Proc. 8 th Sympo. on Computer Architecture, pp. 341-348 (1981)
Rattner, J. and Cox, G.:- “Object-Based Computer Architecture,” SIGARCH, vol. 8, no. 6, pp. 4-11 (I960)
Rumste, M. V.: “The iAPX 432, a Next Generation Microprocessor,” Microprocessing and Microprogramming, vol. 11, pp. 69-106 (1983)
Backus, J. W.: “Can Programming be Liberated from the von Neumann Style ? A Functional Style and Its Algebra of Programs,” CACM, vol. 21, pp. 613-641 (1978)
Kung, H. T. and Leiserson, С. E.: “Systolic Arrays (for VLSI),” Proc. 1978 Sympo. on Sparse Matrix Computations and their Applications, I. S. Duff and G. W. Stewart (eds.), pp. 48-53 (1978)
Kung, H. T.: “Why Systolic Architectures,” IEEE Computer, vol. 15, pp. 37-46 (1962)
Mead, C. and Conway, L.: Introduction to VLSI Systems, Addison-wesley,
Mass. (I960)
Markoff, J.: RISC CHIPS, Byte, Nov. (1984)
Guteri, F.; “Chip Architecture; A Revolution Brewing,” IEEE Spectrum, July, pp. 30-37 (1963)
Colwell, R. P. et, al.: “Peering Through the RISC/CISC Fog; An Outline of Research,” Computer Architecture Note, vol. 11, no. 1, pp. 44-50 (1963)
Patterson, D. A. and Sequin, С. H,: “RISC I: A Reduced Instruction Set VLSI Computer,” IEEE Computer Architecture Conf., pp. 443-457 (1961)
Radin, G.: “The 801 minicomputer,” IBM J. Research and Development, vol. 27, no. 3 (1963)
Gross, T. R.: “Code Optimization Techniques for Pipelined Architectures/* COMPCON Spring, pp. 278-285 (1983)
Gastan, M. and Organics, E. I.: "д 3 L : An HLL RISC Processor for Parallel Execution of FP-Language Programs," IEEE Computer Architecture Conf., pp. 239-247 (1982)
Basart, E, and Folger, D.: “RIDGE 32 Architecture-A RISC Variation," IEEE Computer Architecture Conf, pp. 443-457 (1983)
Kelley, R. R. and Clark, R.: "Applying RISC Theory to a Large Computer/’ Computer Design (1983)
May, D, and Shepherd, R.: "The Transputer Implementation of Occam, Proc. Inti Conf, on Fifth Generation Computer Systems 84, pp. 533-541 (1984)
Reddaway, S. F.: "DAP-A Distributed Array Processor," 1 st Annual Sympo. on Comput. Architecture, IEEE (1973)
Hillis, W. D.: The Connection Machine, The MIT Press (1985>
Глава 2
Hwang, K.: Computer Arithmetic, John Wiley & Sons (1979)
MacSorley, O. L.: "High-Speed Arithmetic in Binary Computers," Proc. IRE, vol. 49, no. 1, pp. 67-91 (1961)
3) Wallace, C. S.: "A Suggestion for a Fast Multiplier,” IEEE Trans. Elec. Comp., vol. EC-13, February, pp. 14-17 (1964)
4) Goldschmidt, R. Z.: "Applications of Division by Convergence," M. S. Thesis, M. I. T. Cambridge, Mass., June (1964)
5) Kung, H. T. and Leiserson, С. E.: "Systolic Arrays (for VLSI)," Proc. 1978 Sympo. on Sparse Matrix Computations and their Applications, pp. 48-53 (1978)
6) Kung, H. T.: "Why Systolic Architectures," IEEE Computer, vol. 15, pp. 37-46 (1982)
Moore, W.,. McCabe, A., and Urquhart, R. (eds.): Systolic Arrays, Adam Hilger, Bristol (1987)
Ward, С. and Davie, Е.: "The Application and Development of Wavefront Array Processors for Advanced Front-End Signal Processing Systems," in (7), pp.295-301
ШФ Ш: "T-^^-^M^W^fll^MfLI-^^-^/V-b -^-F^ л70ЙЙ", 0ЦхкХ bn-^X, 1963 ^8Я10^, pp. 141-178
Шф M:“7-7, У-Ь-^-К^хТО^ЗДЖ^О^ЯГ, 1*Ж№Ж, vol. 23, no. 8, pp. 742-747 (1982)
Aki, S. G.: Parallel Sorting Algorithms, Academic Press (1985)
Tanaka, Y., Nozaka, Y. and Masuyama, A,: “Pipeline Searching and Sorting Modules as Components of a Data Flow Database Computer," IFIP Congress 80, pp. 427-432 (I960)
Tanaka, Y.: "Bit-Sliced VLSI Algorithms for Search and Sort," Proc. 10 th VLDB, pp. 225-235(1984)
Todd, S.: “Algorithms and Hardware for a Merge Sort Using Multiple Processors," IBM J. of Research & Development, vol. 22, no. 5, (1978)
Tanaka, Y.: "A VLSI Algorithm for Sorting Variable-Length Character Strings," New Generation Computing, vol. 3, no. 3, pp. 307-328 (1985)
Batcher, К. E.: "Sorting Networks and Their Applications," Proc. SJCC, pp. 307-314 (1968)
Stone, H. S.r “Parallel Processing with the Perfect Shuffle," IEEE Trans, on Comput., vol. C-20, no, 2, pp. 153-161 (1971)*
Глава 3
McCarthy, J.: “Recursive Functions of Symbolic Expressions and. Their Computation by Machine," CACM, vol. 3, pp. 184-195 (1960)
Landin, P. J.: “The Next 700 Programming Languages," CACM, vol. 9, pp. 157-166 (1966)
Turner, D. A.: “A New Implementation Technique for Applicative Languages," Software Pract. Exper., vol. 8, pp. 31-49 (1979)
Backus, J.: “Can Programming be Liberated from the von Neumann Style ?”, CACM, vol. 21, pp. 613-641 (1978)
5) Arvind: “Semantics of Loops in ID," Note 11, March 1977, Univ, of California, Irvine.
Ackerman, W. B. and Dennis, J. B.: VAL-A Value-Oriented Algorithmic Language: Preliminary Reference Manual, MIT Lab. for Computer Science Tech. Rep. 218, June (1979)
Wadge, W. W. and Ashcroft, E. A.: Lucid, the Dataflow Programming Language, Academic Press, N. Y. (1985)
Henderson, P.: Functional Programming Application and Implementation, Prentice-Hall (1980)
Hewitt, C. et. al.: “A Universal Modular Actor Formalism for Artificial
Intelligence/' Proc. Inf1 Joint Conf, on Artificial-Intelligence, pp. 235-245 (1973)
Hewitt, C.: “Viewing Control Structures as Patterns of Passing Messages,” J. of Artificial Intelligence, vol. 8 (1977)
Geshke, С. M., Morris, Jr, J. H., and Satterthwaite, E. H.: “Early Experience with Mesa," CACM, vol. 20, no. 8, pp. 540-553 (1977)
Liskov, В. H., Snyder, A., Atkinson, R., and Schaffert, C.: “Abstraction Mechanism in CLU," CACM, vol. 20, no. 8, pp. 564-576 (1977)
Ingalls, D. H. H.: “Design Principles behind Smalltalk," BYTE, pp. 286-298, Aug. (1981)
Goldberg, A. and Robson, D.: Smalltalk-80, The Language and its Implemen-. tation, Addison-Wesley (1983)
Bobrow, D. G., and Stefik, M.: The LOOPS Manual—A Data and Object Oriented Programming System for Interlisp-Preliminary Version, Xerox Knowledge-Based VLSI Design Group, Memo KB-VLSI-81-13 (1962)
Kowalski, R. A.: Logic for Problem Solving, North Holland (1979)
Clocksin, W. F. and Mellish, C. S.: Programming in Prolog, Spririger-Verlag (1961)
Clark, K. L. and Gregory, S.. “PARLOG: Parallel Programming in Logic,” PR DOC 84/4, Imperial College (1984)
Shapiro, E.: “A Subset of Concurrent Prolog and Its Interpreter,” ICOT TR- 003, Jan. (1983)
Ueda, K.: “Guarded Horn Clauses," ICOT TR-103 (1985)
Treleaven, P. C.: “Parallel Models of Computation," in Parallel Processing Systems (D. J. Evans ed.), Cambridge Univ. Press, pp. 275-282 (1982)
Г л а в a. 4
Barendregt,H.P.: The Lambda Calculus-Its Syntax and Semantics, 2 nd Edition, North-Holland, 1984.
( 2 ) StoyJ.E.: Denotational Semantics, MIT Press, 1981.
Curry,H.B. and Feys,R.: Combinatory Logic, Vol.l, North-Holland, 1958.
) Wadsworth,C.P.: Semantics and Pragmatics of the Lambda Calculus, Chapter 4, PhD Thesis, Oxford, 1971.
5 ) Abelson,H. and Sussman,GJ.: Structure and Implementation of Computer Programs, MIT Press, 1985.
) Henderson,P.: Functional Programming-Application* and Implementation, Prentice-Hall, 1980.
Peyton Jones,S.L.: The implementation of Functional Programming Lart* guages, Prentice-Hall, 1987.
Gordon,M.J.,Milner,A.J. and Wadsworth,C.P.: Edinburgh LCF, Lecture Notes on Computer Science, No.78, Springer Verlag, 1979.
Burstall, R. M., MacQueen, D. B. and Sanella, D. T.: F ope: An Expert-
mental Applicative Language, CSRt62-80, University of Edinburgh, 1980.
Turner,D.A.: The SASL Language Manual, University of Kent, 1963.
Turner,D.A.: Recursion Equations as a Programming Language, in Functional Programming and Its Applications, Dralington et al (Ed), pp.1-28,1962.
Augustsson,L.: A Compiler for LAzy ML, Proc. ACM Symposium on Lisp and Functional Programming, pp.218-227, 1984.
Turner,D.A.: Miranda-A Non-strict Functional Language with Polymorphic Types, in Conference on Functional Programming Languages and Computer Architecture, LNCS 201, Springer Verlag, pp.1-16, 1985.
Turher.D.A.: A New Implementation Technique for Applicative languages, Software-Practice and Exprerience, Vol. 9, pp.31-49, 1979.
Kieburtz, R. B.: The G Machine; A Fast, Graph-Reduction Evaluator, LNCS 201, Springer Verlag, pp.400-413, 1985.
Darlington J. and Reeve,M.: ALICE-A Multiprocessor Reduction Machine for the Parallel Evaluation of Applicative Languages, Proc. ACM Symposium on Functional Languages and Computer Architecture, pp.65-76, 1981.
Глава 5
Backus J.: Can Programming be Liberated from the Von Neumann Style? A Functional Style and its Algebra of Programs, Comm.ACM, Vol.21, No.8, pp. 613-641(1878).
) Darlington,J.,Henderson,P. and Turner,D.A.(eds.): Functional Programming and its Application, Cambridge Univ. Press(1982).
DeiinisJ.B.: First Version of a Data Flow Procedure Language, Lecture Notes in Computer Science, Vol. 19, Springer, pp.362-376 (1974).
ms : T-nn-T-^T^tt^VX, TF/tx-^ Ь^Т, Vol. 1, No.l, pp.42-63(1984).
ss:M«s!iisw№iiw^mi, voi.26.
No. 7, pp.765-779(1985).
ms, Ш1 :MaSSMValid£J;S£JiHro:yXTA0gei& W^^ 26, No.5, pp.506-520 (1985).
' Ackerman,W.B. and DennisJ.B.: VAL-A Value Oriented Algorithmic Language, Preliminary Reference Manual, Tech. Rep. TR-218, LCS MIT (1979).
McGrawJ.R.: The VAL Language Description and Analysis, ACM Trans, on. Programming Languages and Systems, Vol.4,. No.l, pp.44-82(1982).
SISAL: Streams and Iteration in a Single Assignment Language, Language Reference Manual Version 1.2, M 146, Report of Cooperation of the Colorado State University, DEC, Lawrence.Livermore National Laboratory, and University of Manchester(1984).
Arvind, Gostelow.K.P, and Plouffe,W.: An Asynchrqnous Programming Language and Computing Machine, Tech. Report 114 a, Dep. Inf. and Computer Science, Univ. California Irvine (1978).
25—1145
Ж^, /Ь», Й^Л1: т-9 У п-*7>/>ЖЖ1»ЖМ ValidM^fflitlg^. Vol. 33, No.6, NTT, pp.1167-1181 (1984).
Shimada,T., Hiraki,K. and Nishida,K.: An Architecture of a Data Flow Machine and Its Evaluation, Digest of Papers, COMPCON Spring 84, pp.486~ 490(1984).
Takahashi.N. and Amamiya^!.: A Data Flow Processor Array SystemDesign and Analysis, Proc. 10 th Ann. Int. Synp. on Computer Arch., pp.243250(1983).
Arvind and Gostelow,K.P.: The U-Interpreter. IEEE Computer, pp.42 - 49(1982).
GurdJ. and Watson J.: Data Driven System for High Speed Parallel Computing Part 1 and Part 2, Computer Design, Vol.19, No.6,7, pp.91-100, pp.97106(1980).
Ito.N., Masuda,Y. and Shimizu,H.: Parallel Prolog Machine Based on the Data Flow Model, ICOT Technical Report TR-035(1983).
Amamiya, M., Hasegawa, R., Nakamura, O. and Mikami, H.: A ListProcessing-Oriented Data Flow Machine Architecture, Proc, of National Computer Conference, AFIPS, pp.143-151 (1962).
Amamiya,M., Hasegawa,R. and Mikami,H.: List Processing with A Data Flow Machine, Lecture Notes in Computer Science, No.147, pp.165-190, Springer (1983).
Amamiya,M., Takesue,M., Hasegawa,R. and Mikami,H.: Implementation and Evaluation of A List-Processing-Oriented Data Flow Machine, Proc. 13 th Ann. Int. Symp. on Computer Architecture, pp.10-19 (1986).
McCarthy,}., et.al.: Lisp 1.5 Programmers Manual,MIT Press(1962).
SSJII, H±, Ж8: ')ль№1[й]?7-^7п-7^у7-*7^*01Н1, Ж^МГ^МЯЙ, Vol.J6 7-D.No.9, pp.957-964 (1984).
Yamaguchi,Y., Toda,K. and Yuba,T.: A Performance Evaluation of LISPBased Data Driven Machine (EM-3), 10 th Ann. Int. Symp. on Computer Architecture, pp.363-369 (1983).
Kahn,G.: The Semantics of a Simple Language for Parallel Programming, Information Processing * 74, Proc, of the IFIP Congress, pp.471-476(1974).
Dennis,} B./and Weng,K.: An Abstract Implementation for Concurrent Computation with Streams, Proc, of the 1979 International Conference on Parallel Processing, pp.34-45 (1979).
Amamiya,M. and Hasegawa,R.: Data Flow Computing and Eager and Lazy Evaluation, New Generation Computing Vol.2, No.2, pp.106-129 (1984).
Arvind and Thomas,R.E.: 1-Structures: An Efficient Data Type for Functional Languages, Rep. LCS/TM-178, Laboratory for Computer Science, MIT (1980).''
Dennis,}.B. and Misunas,D.P.: A Preliminary Architecture for a Basic Data-
Flow Processor, Proc. 2nd Ann. Symp. Computer Architecture, pp.126132 (1975).'
GurdJ., Kirkham,C.C. and Watson,!.: The Manchester Prototype Dataflow Computer, Comm.ACM, Vol.28, No.l, pp.34-52 (1985).
Dennis,J.B.: Data Flow Supercomputers, IEEE Computer, Vol.13, No.ll, pp. 46-54(1980).
^, ^JH, H±: 9 X №№?-Пп-^>®Ж №^№S^^ ge^W^W*4 13-3(1980).
Hiraki,K., Shimada,T. and Nishida,K.: Hardware Design of the SIGMA-1 A Data Flow Computer for Scientific Computations, Int. Conf, on Parallel Processing, pp.524-531 (1984).
web, йж фк ш£:т-т-1Ш№М ш^ш, voi.33, N0.6, pp.1183-1196 (1980).
ДЖ, RIM : & ДЙ mWI £ЖЙ L tz 7 - 7 7 □ - У и ^ у 7 7 v л itM «0ЙЖ&еМШ*©МШЖ LT, Ж^Й^^Ж^ tfM»^^ EC 80-24 (1980).
Ackerman,W.B.: A Structure Memory for Data Flow Computers, LCS/TR- 186, MIT (1977).
Keller,R.M.: A Loosely Coupled Applicative Multi-Processing System, Proc. National Computer Conference, AFIPS, pp.861-870 (1978).
Keller,R.M. and Lin,F.C.: Simulated Performance of a Reduction-Based Multiprocessor, IEEE Computer, Vol.17, No.7, pp.70-82(1984).
Jagannathan,R. and Ashcroft,E.A.: Eazyflow Engine Architecture, Proc. Phoenix Conference on Computers and Communications IEEE (1985).
Treleaven,P.C. etal.: Combining Data Flow and Control Flow Computing, The Computer Journal, Vol.2 5, No.2, pp.207-217(1982).
@Ю : T-^u-Tny^-^fctfb 7 A -гУ^^п/^ДО^ЖЖ, Ж ^i6<8¥£&, Vol.J67-D, No.5, pp.579-584 (1984).
RIM ’ Data Flow, Control Flow and Reduction, 0^7 7 b 7 x 7^^^% 1 0 *£#£#, pp. 187-196(1984).
Iwashita,M. et. al.: Modular Dataflow Image Processor, Proc. COMPCON Fall’83, pp.464-467(1983).
Kung,S.Y.: On Supercomputing with Systolic/Wavefront Array Processors, Proc. IEEE, Vol.72, No.4 7, pp.867-884 (1984).
Hewitt,C.: Viewing Control Structure as Patterns of Passing Messages, A.I. Journal, Vol.8, No.3, pp.323-364 (1977).
^W. A*. М$Л1: WOttllS&S^XTAoM^ (^-770-^6/^-$;7n0, BS^l ^»Ж^Ю¥££ВЛ£, S 14-6(1986).
Dennis,J.B., Stoy J. and Guharoy.B.: VIM: An Experimental Multi-User System Supporting Functional Programming, Proc. Int. Workshop on High Level Computer Architecture 84, pp.l. 1-1.9(1984).
Watson,!., Private Communication./
Глава 6
Denning» P. К: “The Working Set Model for Program Behavior,” CACM, vol. 11, no. 5 (1968)
2) Denning, P. J.: “Working Sets Past and Present,” IEEE Trans on Soft. Eng., SE-6, no. 1 (1980)
Denning, P. J.: “Virtual Memory.” ACM Computing Surveys, 2, Sept. pp. 153— 189 (1970)
) Peterson, W. W,: Error Correcting Codes, MIT Press, Cambridge, Mass. (1961)
) Hellerman, Нл Digital Computer System Principles, McGraw - Hill, N. Y. (1967)
Burnett, G. J. and Coffman, E. G.: “A Study of Interleaved Memory Systems,” AFIPS Conf. Proc., vol. 36, pp. 467-474 (1970)
7) Lawrie, D. H. .and Vora, C. R.: “The Prime Memory System for Array Access,” IEEE Trans. On Comp., C-31, no. 5, pp. 435-442 (1982)
Pohm, A. V. and Agrawal, О. P.; High-Speed Memory Systems, Reston. Publishing Comp., Virginia (1983)
Hwang, K. and Briggs, F, A.; Computer Architecture and Parallel Processing, McGraw-Hill (1984)
Conti, C. J.: “Concepts for Buffer Storage,” Computer Group News, 2, Mar., pp. 9-13 (1969)
Bell, J., Casasent, D., and Bell, C. G.: “An Investigation of Alternative Cache Organizations,” IEEE Trans, on Comp. C-23, Apr., pp. 346-351 (1974)
Kaplan, K. R. and Winder, R. V,; “Cache-Based Computer Systems,” Computer, 6, Mar., pp. 30-36 '(1973) *
Smith, A. J.: "Cache Memories,” ACM Computing Surveys, vol. 14, no. 3, pp. 473-530 (1982)
Smith, A.J.: "Comparative Study of Set-Associative Memory Mapping Algorithms and Their Use for Cache and Main Memory,” IEEE Trans. Soft. Eng., vol. SE-4, March, pp. 121-130 (1978)
Meade, R. M.: "Design Approaches for Cache Memory Control,” Computer Design, Jan., pp. 87-92 (1971)
Pohm, A. V., Agrawal, О. P., and Monroe, R. N.: "The Cost and Performance Tradeoffs of Buffered Memories,” Proc. IEEE, vol. 63, Aug., pp. 1120-1135 (1975)
Yeh, P. C.: "Shared Cache Organization for Multiple-Stream Computer Systems,” Coordinated Science Lab., Univ, of Ill., Tech. Rep. R-904, Jan. (1981)
^W^«^:"2 V<)\Mvr;:L^4774 >№lOl£tiimift: AS П > e ^ - ? ACOS 1500”, ggxu; b D^^ Л, no. 373, pp. 233-279 (1985)
Sherr, A, L.: “The Design of IBM OS/VS2 release 2,” Proc, of NCC, pp. 387- 394 (1973)
Dennis, J. B.: “Segmentation and the Design of Multiprogrammed Computer Systems,” J ACM, vol. 12, no. 4, pp. 589-602 (1965)
. IWHE: "^SMlSftO^ V ICW^”, 4 >7-7^-X, no. 123, pp. 180- 240 (1987)
Wu, C. and Feng, T.: Interconnection Networks for Parallel and Distributed Processing, IEEE (1984).
Clos, C.: "A Study of Non-Blocking Switching Networks,” Bell Sys. Tech. J., 1953 March, pp. 406-424
Benes, V. E.: Mathematical Theory of Connecting Networks and Telephone Traffic, Academic Press (1965)
Nassimi, D. et. al.: "A Self-Routing Benes Network and Parallel Permutation Algorithms,” IEEE Trans. C-30, no. 5, pp. 332-340 (1981)
Lenfant, J.: “Parallel Permutations of Data: A Benes Network Control Algorithms for Frequently Used Permutations,” IEEE Trans, C-27, no. 7, pp. 637-647 (1978)
Batcher, К. E.: “Sorting Networks and Their Applications,” Proc. SJCC, pp. 307-314 (1968)
Beetem, J., Denneau, M. and Weingarten, D.: “The GF-11 Super Computer,” Proc., of the 1965 Int’l Conf, on Parallel Processing, pp. 108-115 (1985),
Stone, H. S.: “Parallel Processing with the Perfect Shuffle,” IEEE Trans. C- 20, no. 2, pp. 153-161 (1971)
Lawrie, D. H.: “Access and Alignment of Data in an Array Processor,” IEEE Trans. C-24, no. 12, pp. 1145-1155 (1975)
Chen, P. et. al.: “Interconnection Networks Using Shuffles,” IEEE Computer, vol. 14, no. 12, pp. 55-64 (1981)
Pease III, M. C.: “The Indirect Binary ц-Cube Microprocessor Array,” IEEE Trans. C-26, no. 5, pp. 458-473 (1977)
Siegel, H/J. et. al.: "The Multistage Cube: A Versatile Interconnection Network,” IEEE Computer, vol. 14, no. 12, pp. 65-76 (1981)
Lipovski, G. L. et. al.: "Banyan Networks for Partitioning Multiprocessor Systems,” Proc, of 1st Int’l Sympo. on Computer Architecture, pp. 21-28 (1973)
Pfister, G. F. and Norton, V. A.: “'Hot Spot’ Contention and Combining in Multistage Interconnection Networks,” IEEE Trans, on Computers, vol. C-34, no. 10, pp. 943-948 (1985)
Dubois, M. and Briggs, F. A.: “Effects of Cache Coherency in Multiprocessors,” IEEE Trans, on Comp., C-31, no. 11 (1982)
Censier, L. M. and Feautrier, P.: “A New Solution to Coherence Problems in Multicache Systems,” IEEE Trans, on Comp., C-27, Dec., pp. 1112-1118 (1978)
Tanaka,Y.: “A Multiport Page-Memory Architecture and A Multiport DiskCache System,” New Generation Computing, vol. 2, no. 3, pp. 241-260 (1984)
Van, S. S. and Fung, H. S.: “Associative Processor Architecture - A Survey,” ACM Computing Surveys, vol. 9, no. 1, pp. 3-28 (1977)
Thui her, K. J.: Large Scale Computer Architecture - Parallel and Associative Processors, Hayden Book Co., N.J. (1976)
Foster, С. C.: Content-Addressable Parallel Processors, Van Nostrand Reinhold Co.,N. Y.»(1976)
Batcher, К. E.: “STARAN Parallel Processor System Hardware,” NCC, pp. 405-410 (1974)
Batcher, К. E.; “The Multidimensional Access Memory in STARAN,” IEEE Trans. C-26, no. 2, pp. 174-177 (1977)
Batcher, К. E.: “The Flip Network in STARAN,” Proc, of 76 Int’l Conf, on Parallel Processing, pp. 65-71 (1976)
Woods, W. A.: “What’s in a Link ? Foundations for Semantic Networks,” in Representation and Understanding: Studies in Cognitive Science, D. G. Bobrow and A. M. Collins (eds.), Academic Press, pp. 35-82 (1975)
Fahlman, S. E.: NETL: A System for Representing and Using Real-World Knowledge, MIT Press (1979)
Hillis, W. D.: “The Connection Machine,” MIT Artificial Intelligence Lab. Memo 646 (1981)
Hillis, W. D.: The Connection Machine, MIT Press (1985)
Gupta, A.: “Parallelism in Production Systems: The Sources and Expected Speed-up,” CMU-CS-84-169 (1984)
Brooks, R. and Lum, R.: “Yes an SIMD Machine Can be Used for Al,” Proc, of IJCAI, pp. 73-79 (1985)
Stolfo, S. J.; “Five Parallel Algorithm for Production System Execution on the DADO Machine,” Proc, of AAAI ’84, pp. 300-306 (1984)
Глава 7
McCarthy,}.: Recursive Functions of Symbolic Expressions and Their Computation by Machine, Comm.ACM, 7, pp. 184-195, 1960.
) Moon,D.: MACLISP Reference Manual, Project MAC, MIT, 1974.
3) Teitelman,W.: INTERLISP Reference Manual, Xerox Palo Alto Research Center, Palo Alto, California, or Bolt, Beranek, and Newman. Cambridge, Massachusetts, 1974.
) Moon,D., Stallman,R. and Weinreb.D.: LISP Machine Manual, Fifth Edition, МГГ Artificial Intelligence Laboratory, 1983.
5 ) Steel Jr.,G.; Common Lisp: The Language, Digital Press, 1984.
»«, ^ : Common Lisp АП, ^fc»#, 1986.
Greenblatt,R.: The LISP Machine, MIT AI Memo, No.79, 1974.
) Steel Jr.,G. and Moon,D.: CADR, MIT AI Memo, DRAFT, 1979.
Symbolics 3600 Technical Summary, Symbolics Inc. 1984.
The LMI Lambda, Technical Summary, LMI, 1984.
Lampson, B.W. and Pier,K.A.: A Processor for a High-Performance Personal Computer, Proc. 7 th Symposium on Computer Architecture, pp.146-160, 1980.
Hidon, H.J.: Silicon Software Tackles AI Problems, Computer Design, March 15, p.42, 1985.
#, 1$^ : Lispv’>>0«^7- + т^^^Ь LISPM^Ott», 1ШЯЮ1
^£ЗЙ££, Vol.20, No.6, pp.481-486, 1979.
Hayashi,H. et al.: ALPHA: A High-Performance LISP Machine Equipped with a New Stack Structure and Garbage Collection System, Proc. 10 th Symposium on Computer Architecture, pp.342-348, 1983.
Hit», 1$ : LISP 7->y ELIS ©M*»tt, 1t^3S^^%^##4, ^^^ Ж 12-15, 1980.
Kowalski,R.: Logic for Problem Solving, North-Holland, 1979.
Warren,D.H.D.: Implementing PROLOG, Res. Rep. 39, 40, Dept, of A.I., Univ, of Edinburgh, 1977.
Chang,C.L. and Lee,R.C.: Symbolic Logic and Mathematical Theorem Proving, Academic Press, 1973.
Yokota,M.,,Yamamoto, A., Taki,K., Nishikawa,H. and Uchida,S.: The Design and Implementation of a Personal Sequential Inference Machine: PSI, New Generation Computing 1, 2, 1983.4
Nakazaki,R. Konagaya,A., Habata,S„ Shimazu,H., Umemura,M., Yamamoto, M., Yokota,M. and Chikayama,T.: Design of a High-speed Prolog Machine (HPM), Proc. 12 th Annual Symposium on Computer Architecture, 1985.
Kaneda, Y., Tamura, N., Wada, K. and Matsuda, H.: Sequential Prolog Machine РЕК Architecture and Software System, Proc. International Workshop on High-1 evel Computer Architecture ’ 84, 1984.
Dobly,T.P., Despain,A.M. and Patt,Y.N.: Performance Studies of a Prolog Machine Architecture. Proc. 12 th Annual Symposium on Computer Architecture, 1985,
Г лава 8
Bray, О. H. and Freeman, H. A.:. Data Base Computers, Lexington Books (1979)
IEEE Computer, vol. 12, no. 3 (1979)
Hsiao, D. K.: "Data Base Computers,” in Advances in Computers, vol. 19 (1980)
MK, «Hl:f-^*^ m*M*^(1980)
ШФ: “7-7^-X • v>>0^t^R2”, bit, Vol. 14, No. 4, pp. 38-50 (1982)
Canady, R. H. et al.: "A Back-end Computer for Data Base Management,”
САСМ, vol. 17, по. 10, рр. 575-582 (1974)
Maril, Т. et al.: “The Data Computer-A Network Data Utility,” Proc. AFIPS, vol. 44, pp. 389-395 (1975)
Hakozaki, K. et al.: "A Conceptual Design of a Generalized Database Subsystem,” Proc. 3rd VLDB, pp. 246-253 (1977)
Epstein, R. et al.: “The IDM 500 - Communication Issues with Backend Processors,” COMPCON, pp. 112-114 (1981)
Coulouris, G. F. et al.: “Towards Content-Addressing in Databases,” Computer Journal, vol. 15, no. 2, pp. 95-98 (1972)
Leilich, H. O. et al.: “A Search Processor for Data Base Management,” 4 th VLDB, pp. 280-287 (1978)
Babb, E.: “Implementing a Relational Database by Means of Specialized Hardware,” ACM TODS, vol. 4, no. 1, pp. 1-29 (1979)
Copeland, G. P. et al.: “The Architecture of CASSM : a Cellular System for Nonnumeric Processing,” Proc. 1 st Annu. Symp. Computer Architecture, pp. 121-128 (1973)
Ozkarahan, E.A. et al.: “RAP-An Associative Processor for Data Base Management,” Proc. AFIPS, vol. 44, pp. 379-387 (1975)
Lin, C. S. et al.: "The Design of a Rotating Associative Memory for Relational Data base Applications,” ACM TODS, vol. 1, no. 1, pp. 53-65 (1976)
Chang; H.: "On Bubble Memories and Relational Data Base,” 4 th VLDB, pp. 207-229 (1978)
Uemura, S. et al.: “The Design and Implementation of a Magnetic-Bubble Database Machine,” IFIP 80, pp. 433-438 (1980)
Su, S. et al.: “MICRONET: A microcomputer network system for managing distributed relational data bases,” 4 th VLDB, pp. 288-298 (1978)
Hsiao, D. K. et al.: "The Post Processing Functions of a Database Computers,” Tech. Report, OSU-CISRC-TR-79-6, Ohio State Univ. (1979)
Schuster, S. A. et al.: "RAP. 2 - An Associative Processor for Databases and Its Applications,” IEEE Trans. Comput., vol. C-28, no. 6, pp. 446-458 (1979)
Dewitt, D. J.: "DIRECT-A Multiprocessor Organization for Supporting Relational Database Management Systems,” IEEE Trans. Comput., vol. C-28, no. 6, pp. 395-406 (1979)/
Dewitt, D. J.: "Query Execution in DIRECT," ACM SIGMOD, pp. 13-22 (1979)
Boral, H. B. et al.: “Processor Allocation Strategies for Multiprocessor Database Machines,” ACM TODS, vol. 6, no. 2, pp. 227-254 (1981)
Oflazer, K. et al.: "RAP. 3 - A Multi-Microprocessor Cell Architecture for the RAP Database Machine,” Proc. Int’l Workshop on High Level Language Computer Architecture, pp. 108-119 (1980)
Boral, H. et al.: "Design Consideration for Data Flow Database Machines,” ACM SIGMOD, pp.94104 (1980)
Wah, В. W. et al.: “DIALOG - A Distributed Processor Organization for Data Base Machine,” NCC, pp. 243-253 (1980)
Tanaka, Y et al.: “Pipeline Searching and Sorting Modules as Components of a Data Flow Data Base Computer,” IF1P 80, pp. 427-432 (1980)
И/Н f&: "Hash L Sort ici ^M^^v>>”, fg^^lB, EC81-35 (1981)
Tanaka, Y.: "A Data Stream Database Machine with Large Capacity,”. Proc. Int’l Workshop on Database Machines (1982)
Baum, R. I. et al.: "Database Computers - A Step toward Data Utilities,” IEEE Trans. Comput., vol. C-25, pp. 1254-1259 (1976)
Banerjee, J. et al.: “Concepts and Capabilities of a Database Computer,” ACM TODS, vol. 3, pp. 347-384 (1978)
Banerjee, J. et al.: "DBC - A Database Computer for Very Large Databases,” IEEE Trans. Comput., vol. C-28, no. 6, pp. 414-429 (1979)
Berra, P. B.: "Some Problems in Associative Processing Applications to Data Base Management,” AFIPS, vol. 43, pp. 1-5 (1974)
Oliver, E. J. et al.: "RELACS: A Relational Associative Computer System,” Proc. 5 th Workshop on Computer Architecture for Non-Numeric Processing, pp. 108-114 (1980)
Arden, B. et al.: "A Single Relation Module for a Data Base Machine,” COMPCON, pp. 227-237 (1981)
Kung, H. T. et al.: "Systolic (VLSI) Arrays for Relational Database Operations,” ACM SIGMOD, pp. 105-116 (1980)
Madnick, S. E.: "INFOPLEX - Hierarchical Decomposition of a Large Information Management System Using a Microprocessor Complex,” AFIPS, vol. 44, pp. 581-^86 (1975)
Sekino, A. et al.: "Design Considerations for an Information Query Computer,” Advanced Database Machine Architecture (D. K. Hsiao ed.), Prentice- Hall, pp. 130-167 (1983)
Slotnick, D. L.: "Logic per Track Devices,” Advances in Computers, Academic Press, pp. 291-296 (1970)
Parker, J. L.: "A Logic per Track Retrieval System,” Proc. IFIP Congress 71, pp. (TA-4-146)-(TA-4-150), (1971)
Minsky, N.: "Rotating Storage Devices as Partially Associative Memories,” AFIPSi vol. 41, pp. 587-596 (1972)
Healy, L. D. et al.: "The Architecture of a Cbntent Addressed Segment Sequential Storage,” AFIPS Conf. Proc., vol. 41, pp. 691-701 (1972)
Todd, S.: "Algorithms and Hardware for a Merge Sort Using Multiple Processors,” IBM J. R & D, vol. 22, no. 5 (1978)
Moulder, R.: "An Implementation of a Data Management System on an Associative Processor,” AFIPS, vol. 42, pp. 171-176 (1973)
ФШ ffe: “т-^№^'У V 7-^ %^^Ггт-^ ^-^ttW^O«^’\ (g
^№ ЕС 80-72 (1980)
Kitsuregawa, М., Tanaka, Н. and Moto oka, Т.: "Application of Hash to Data Base Machine and Its Architecture,” New Generation Computing, vol. 1, pp. 63-74 (1983)
(4 7) ШФ Г"т-^-Х'Т'>У”,1№1, 23^, 10^, pp.939-947 (1982)
Hawthorn, P. B., et al.: "Performance Analysis of Alternative Database Machine Architectures,” IEEE Trans, on Software Engineering, no. 1, pp. 61- 76 (1982)
Bitton, D„ DeWitt, D. J. and Turbyfill, C.: "Benchmarking Database Systems, A Systematic Approach,” Proc, of 9 th VLDB, Florence (1983)
Boral, H. and DeWitt, D. J.: "Database Machines: An Idea Whose Time has Passed?”, Database Machines, Springer-Verlag, pp. 166-187 (1983)
Tanaka, Y.: "A Multiport Page-Memory Architecture and A Multiport Disk-Cache System,” New Generation Computing, vol. 2, no. 3, pp. 241-260 (1984)
Tanaka, Y.: "MPDC: Massive Parallel Architecture for Very Large Databases,” Proc. Int’l Conf, on Fifth Generation Computer Systems 1984, pp. 113-137 (1984)
Tanaka, Y.: "Massive Parallel Database Computer MPDC and Its Control Schemes for Massively Parallel Processing,” NATO ASI Series, vol. F 24, Database Machines (A. K. Sood and A. H. Qureshi eds.), Springer-Verlag, pp. 127-158 (1986)
Bayer, R. and McCreight, E.: "Organization and Maintenance of Large Unordered Indices,” Acta Informatica, vol. 1, fasc. 3, pp. 173-189 (1972)
Larson, P.: "Dynamic Hashing,” BIT, vol. 18, pp. 184-201 (1978)
Litwin, W.: "Virtual Hashing: A Dynamically Changing Hashing,” Proc. 4 th VLDB, pp. 517-523 (1978)
Litwin, W.: "Linear Hashing: A New Tool for File and Table Addressing,” Proc. 6 th VLDB (1980)
Fagin, R., Nievergelt, J., Pippenger, N., and Strong, H. R.: "Extendible Hashing - a Fast Access Method for Dynamic Files,” ACM TODS, vol. 4, no. 3, pp.315-344 (1979)
Chang, J. and Fu, K.: "Extended k-d Tree Database Organization: A Dynamic Multiattribute Clustering Method,” IEEE Trans. Software Engineering vol. 7, no. 3, pp. 284-290 (1981)
Orenstein, J. A.; "Multidimensional Tries Used for Associative Searching,” Info. Proc. Lett., vol. 14, no. 4, pp. 150-157 (1982)
Tanaka, Y.: “Adaptive Segmentation Schemes for Large Relational Database. Machines," Database Machines, Springer-Verlag, pp. 293-318 (1983)
Robinson, J. T.: “The K-D-B-Tree : A Search Structure for Large Multidimen" sional Dynamic Indexes," S1GM0D 1981, pp. 10-18 (1981)
Kojima, K., Torii, S. and Yoshizumi, S.: "1DP - A Main Storage Based Vector Database Processor," Proc, of 5 th Infl Workshop on Database Machines, pp. 60-73 (1987)
№ Ш: “v^^7f-b - >^9 • 7-Wf< Ж 35 01tlg^S^±a Х^ХЖ( I ), pp. 157-158 (1987)
ОГЛАВЛЕНИЕ
Глава 1. Исторический обзор архитектур ЭВМ и их классификация.. 7
Основные положения, касающиеся архитектур ЭВМ7
История развития вычислительной техники от механических машин до электронных . .. . 10
Становление и упрочнение позиций архитекту
ры фон Неймана13
История и классификация параллельных ЭВМ неймановского типа38
Пересмотр принципов неймановской архитектуры и оживление в сфере ненеймановских архитектур 66
Архитектуры для обработки знаний79
Глава 2. Высокоскоростная обработка и архитектура СБИС 83
Повышение скорости выполнения четырех арифметических действий . . 83
Повышение скорости выполнения макроопераций 91
Ускорение поиска и сортировка97
Глава 3.Вычислительные модели и методы оценки....114
Вычислительные модели114
Модели вычислительных механизмов....128
Глава 4.Редукционные машины 134
Синтаксис лямбда-исчисления134
Семантика лямбда-исчисления138
Порядок редукции146
Рекурсивные функции149
Редукция графов151
Комбинаторы160
Параллельная редукция162
Редукционные машины167
Глава 5.Потоковые машины . . . . 176
Поводы для разработки потоковых машин..177
Параллельная обработка и функциональный язык . . 179
Обрабатывающие модели потокового типа . .184
Понятия запуска функции и сверхмультиобработки . . 194
Биографическая зависимость и обработка структурированных данных . . 200
Аппаратные средства потоковых машин . . . 208
Задачи и перспективы на будущее222
Глава 6. Архитектуры памяти227
Архитектуры памяти227
Архитектура быстродействующей памяти . . . 236
/6.3. Архитектура виртуальной памяти256
Архитектура общей памяти . ....... 267
Архитектура интеллектуальной памяти . . .281
Глава 7. Языки искусственного интеллекта и машины искусственного интеллекта. . 288
Язык Лисп и Лисп-Машина289
Язык Пролог и Пролог-машины313
Глава 8. Машины баз данных. . . 341
Функционирование базы данных и машины баз данных .341
Исторический обзор и классификация машин баз данных346
Аналитический обзор и перспективные направления 360
УВАЖАЕМЫЙ ЧИТАТЕЛЬ!
Ваши замечания о содержании книги, ее оформлении, качестве перевода и другие просим присылать по адресу: 129820, Москва, И-ПО, ГСП, 1-й Рижский пер., д. 2, издательство «Мир».
Учебное издание
Макото Амамия, Юдзуру Танака
АРХИТЕКТУРА ЭВМ И ИСКУССТВЕННЫЙ ИНТЕЛЛЕКТ
Зав. редакцией Э.Н. ВадиковВедущий редактор СВ. БогдасаровРедакторы М.Ю. Григоренко, И.К. КоротковаХудожник В.С. СтуликовХудожественные редакторы Н.М. Иванов, О.Н. АдаскинаТехнический редактор Е.В. АлехинаКорректор В.И. Киселева
ИБ № 7507
Сдано в набор 23.08.90. Подписано к печати 14.03.91.
Формат 60x84/16. Бумага книжно-журнальная.
Печать офсетная. Гарнитура литературная.
Объем 6,25 бум. л. Усл. печ. л. 23,25. Усл. кр.-отт. 23,48.Уч.-изд. л. 21,70. Изд. № 6/7672. Тираж 5000 экз.
Зак. 1145. С165.
Издательство «Мир»Министерства печати и информацииРоссийской Федерации129820, ГСП, Москва, 1-й Рижский пер., 2.
Отпечатано в Московской типографии № 11113105, Москва, Нагатинская ул., д. 1.