Асинхронная логика – второе пришествие

     Я был бы рад стать лучше, — сказал он, — но не знаю, как этого добиться…
     К. Джексон. Толстый неуклюжий слоненок

     

     Понятное дело, что избыточный вес и неуклюжесть пороками назвать нельзя (по крайней мере, в общем случае): растолстеть можно в результате неожиданного заболевания, а неуклюжесть — это уже от Бога. Но как быть в ситуации, когда и ожирение, и неповоротливость начинают упорно совершенствоваться в ходе искусственной эволюции в целях достижения якобы идеала?

     Вы уже догадались, что речь пойдет не о слонах (хотя в некотором смысле и о них тоже). Сказавши в предыдущей статье "А", автор не смог остановиться — и в поисках уже упомянутых "корешков" процессорных архитектур нам с вами предстоит совершить небольшой экскурс на несколько уровней ниже. Так как экстенсивные методы совершенствования микропроцессоров неинтересны и не столь эффективны, попробуем разобраться с основами — может, есть способ "чего-нибудь в консерватории исправить…".
     

     Перспективное прошлое

     В результате возникла отрасль, влияющая на судьбу миллионов людей, но доступная лишь немногим. Компьютеры представляют собой тайну, покрытую мраком, и этот мрак сгущается.
     Д. Зиссос, 1978 г.

     
     Идеей этой статьи автор обязан уже не удачному "улову" в Сети, а напротив — старой, растрепанной, но любимой книге, которую сегодня можно без преувеличения отнести к классу культовых реликтов. Выпущенная в 1982 г. киевским издательством "Технiка", почти в точном соответствии с высказыванием классика прошлого столетия ("Россия всегда копировала взгляды Франции, но с опозданием на шесть лет…") — через четыре года после "заморского" оригинала, "Проектирование систем на микропроцессорах" Д. Зиссоса стала одной из лучших русскоязычных книг, до сих пор не утратившей актуальности (по крайней мере, ее перечитывание и сегодня доставляет удовольствие).

     В далеком 1978 г. профессор университета Калгари (Канада) еще мог позволить себе в массовом учебнике для инженеров посвятить две небольшие главы еретическим методам проектирования "асинхронных нетактируемых последовательных схем". В дальнейшем, после полной и окончательной победы дешевой микроэлектроники асинхронность старательно пытались забыть — рынок требовал много микросхем, потом еще больше — недорогих чипов, затем — необъятное количество дешевых VLSI (схем сверхвысокой степени интеграции). И всех представителей сегодняшней массовой "полупроводниковой породы" независимо от функционального назначения объединяет одно важное свойство — за крайне редкими исключениями все, в первую очередь вычислительные, чипы — синхронны. Пока не вдаваясь в пусть элементарные, но все же тонкости, ограничимся кратким описанием свойства синхронности электронной схемы: она может изменять свое состояние только в строго определенные моменты времени. Эта "определенность" гарантируется столь же строго обязательным наличием единого управляющего сигнала, именуемого "тактовой частотой". Таким образом, синхронность подразумевает "временную привязку" событий в схеме к изменениям тактирующего сигнала.

     Главное достоинство синхронных схем, предопределившее на долгие годы один путь развития полупроводниковой цифровой схемотехники — простота реализации (но до некоторого предельного масштаба в терминах электроники — соотношения тактовой частоты и линейных размеров физического исполнения электронной схемы). К счастью, основоположники компьютеростроения не были связаны "по рукам и ногам" неумолимыми маркетинговыми требованиями, и целое поколение ушедших в прошлое компьютеров по сегодняшним меркам можно смело назвать революционным — первые медленные многотонные "монстры" были, о ужас… асинхронными! У них не было единого генератора тактовой частоты. Даже несмотря на прозвучавший еще 20 февраля 1947 г. с трибуны Лондонского математического сообщества весьма обоснованный призыв "главного из титанов" — Алана Тьюринга — о формальной необходимости тактирования в последовательных схемах. В 1951 г. в Университете штата Иллинойс была построена ЭВМ ORDVAC, а в Принстонском университете под руководством великого фон Неймана спроектирована и воплощена в металле машина IAS. Общим для двух весьма передовых по тем временам компьютеров было полное отсутствие понятия тактовой частоты. Значительно запоздавшая (и по причине консервативности, и сдерживаемая необходимостью "залечивать раны" после второй мировой) Европа пришла к асинхронным ЭВМ только к концу 60-х; в 1969 г. в Манчестерском университете была разработана заслуживающая самого пристального внимания и сегодняшних конструкторов асинхронная машина MU5, чуть позже к "компьютерным играм" подключились шведы — в их DataSaab D-23 также напрочь отсутствовала единая тактовая частота. К этому времени американцы уже реализовали целый ряд удачных проектов — Maniac и созданная на его основе ЭВМ Rice Computer (уникальный 64-разрядный гибрид ламповой, полупроводниковой и только зарождающейся интегральной технологий) показывали производительность до 20 тыс. операций в секунду и также были полностью асинхронными (об интересных особенностях Rice Computer — позже).
     

     Что такое хорошо…

     К середине 70-х асинхронные компьютеры первых поколений отправились на свалку. Система высшего образования сконцентрировалась на обучении новой генерации специалистов куда более простой и, с маркетинговой точки зрения, перспективной синхронной логике. О ее недостатках говорить было не принято, посему считалось, что недостатков у синхронных конструкций нет. Одни достоинства — дешево, быстро, легко в проектировании… Правда, за пределами академической теории инженеры сталкивались с реальными "болячками" синхронных схем: термины "гонка" и "визит-эффект", обильно перемешанные с куда более неформальными высказываниями, вошли в обиход повседневной речи инженера-электронщика — возрастающие тактовые частоты вынуждали учитывать, например, временные задержки в отдельных логических элементах. "Гонки" возникали именно по этой причине — если сигналы с выходов разных элементов схемы с разными задержками (а создать элементы с идеально одинаковыми задержками невозможно) участвуют в одной логической операции, например "Логическое И" (общепринято обозначаемой как &, рис. 2), вместо ожидаемого результата на выходе схемы формируется нечто трудновообразимое — совершенно лишние короткие импульсы, которых в принципе (по теории) не должно было быть (см. рис. 2).


     "Визит-эффект" придавал этой сумятице чуть ли не паранормальные свойства: "гонки" могли возникать или исчезать при изменении температуры и вообще зависеть от присутствующих в одной комнате с испытываемым устройством людей… На самом деле никакой эзотерики в этом явлении нет — незначительные изменения электрической емкости, вызванные перечисленными и огромным количеством не поддающихся перечислению факторов, влияли на времена задержек в схеме, соответственно, длительность паразитных импульсов-гонок "плавала" с капризностью погоды и Бог знает чего еще. Инженеров срочно начали учить формальным методам проектирования цифровых электронных схем, позволяющим гарантированно добиваться работоспособности устройств, созданных на элементной базе с более чем 33%-ным разбросом времени задержки (к слову, ничего страшного в этих методах нет — просто прочтите Д. Зиссоса). Методы эти элементарны, поддаются алгоритмической формализации (значит, на их основе можно написать облегчающие жизнь конструкторов программы) и достаточно эффективны — в этом убеждает успешная и надежная работа наших компьютеров. Вот только размытое определение "достаточно" у любого инженера сразу вызовет подозрение…

     Действительно, насколько достаточно? В поисках ответа на этот вопрос автору пришлось изрядно попутешествовать в Сети, и вот краткая (неутешительная) сводка результатов продолжительных поисков. В современных синхронных процессорах проблема гарантированного устранения "гонок" не только не теряет актуальности, но и ставит труднорешаемые задачи перед проектировщиками. При тактовых частотах порядка нескольких сотен мегагерц и линейных размерах кристалла в диапазоне десятков миллиметров паразитные задержки могут составлять единицы наносекунд — т. е. сигнал тактовой частоты в одной точке кристалла может отставать по времени от того же сигнала в другой точке на 1—3 нс. Таким образом, период тактовой частоты становится сравнимым с возможными задержками — к чему это приводит, объяснять после вышеупомянутого примера, надеюсь, излишне. Для борьбы с подобным явлением разработчики используют различные методы — например, проектирование специальной топологии проводников, по которым к узлам процессора подводятся сигналы единой тактовой частоты с последующим буферированием этих сигналов. Буферирование необходимо потому, что идеально прямоугольные импульсы бывают только в плохих учебниках — скорости нарастания и спада сигнала всегда конечны, а распространение такого сигнала по цепи, обладающей конечной емкостью и индуктивностью (именно такие цепи почему-то встречаются в реальной жизни), изменяет эти скорости, и сигнал становится более близким к "трапеции", чем к прямоугольнику. Буферы, грубо говоря, восстанавливают прямоугольность сигнала для надежной работы узлов процессора.

     В общих чертах идея понятна, теперь пора задуматься, во что обходится ее материализация. В одном из очень удачных RISC-процессоров DEC Alpha с весьма скромными по сегодняшним меркам степенью интеграции (1,68 млн. транзисторов) и размером кристалла (16,8 x 13,9 мм) расплатой за синхронность стали: более 10% площади чипа и около 40 Вт рассеиваемой мощности. Именно столько места и энергии нужно дополнительным цепям, обеспечивающим максимальное время несогласованности тактовой частоты в разных точках процессора 300 пикосекунд ("Digital Technical Journal", 1993, vol. 4).

     Еще один интересный аспект "достаточной эффективности" синхронной логики связан с энергопотреблением. Изучавшие курс полупроводниковых устройств хорошо знают, что схемы, выполненные по КМОП-технологии ("бутерброд" из кремния, металла, окисла и полупроводника, в "западном" варианте — CMOS), потребляют энергию только в моменты изменения состояний. Получается, что в синхронной схеме с постоянно "включенной" единой тактовой частотой энергию расходуют ВСЕ функциональные узлы, даже те, которые в данный момент времени совершенно ничего не делают. От этой "болячки" придумали также десятки "лекарств", ни одно из которых не является сильнодействующим. Например, в микроконтроллеры, предназначенные для критичных к энергопотреблению (иначе называемых "батарейными") применений, встраиваются команды, позволяющие программно уменьшать/увеличивать тактовую частоту: при низких ее значениях количество срабатываний элементов схемы за единицу времени уменьшается, следовательно, снижается и энергопотребление. Придуман и режим "сна" процессоров: специальная команда вообще выключает генератор тактовой частоты, который затем может быть включен только внешним аппаратным сигналом. "Тяжеловесные" процессоры оснащаются механизмами отключения питания отдельных, не задействованных в данный момент времени функциональных узлов. Среднее энергопотребление в результате таких мероприятий, естественно, снижается, но… Дополнительные схемы, реализующие все эти удовольствия, также требуют синхронизации, следовательно, большей (и весьма ощутимо) площади кристалла, и, как это ни странно, большей потребляемой мощности (почему — рассказано выше).
     

     Divide et impera

     Ну любит автор отступления, что поделаешь, и без очередного "заноса", увы, не обойтись. Великим изречением "разделяй и властвуй" — девизом хороших инженеров (в том числе и специализирующихся на "социальном инжиниринге"), этот раздел статьи озаглавлен не случайно. Существует на редкость точная аналогия (на редкость потому, что аналогии — вещь опасная) между ПО и цифровыми аппаратными средствами. Собственно говоря, — это две стороны одной медали: программы могут быть реализованы "в железе", "железо", в свою очередь, можно представлять в программной форме. В контексте этой всеобъемлющей аналогии массовому переводу разработки ПО на "объектно-ориентированные рельсы" должно соответствовать какое-то явление в аппаратной сфере. По мнению Б. Страуструпа (автора языка программирования C++), основной смысл объектной ориентации "состоит в разделении малозначащих деталей реализации… от свойств, имеющих определяющее значение для правильного использования сущности…". Вот еще одно очень характерное для ООП (объектно-ориентированного программирования) высказывание того же автора по поводу чрезмерной зависимости объектов от внешнего контекста: "Этого следует избегать".

     В случае с синхронной логикой проектные объекты не просто сильно зависят от "внешнего контекста" — тактовой частоты, они принципиально не могут без нее существовать. А ведь речь идет о громадных проектах — с миллионами строк кода или миллионами логических вентилей в аппаратном случае… Следовательно, "сильнодействующее лекарство" c латинским названием "divide et impera", доказавшее свою эффективность в разработке ПО, просто обязано помочь в лечении "хронической синхронной болезни". Надо только найти аналог объекта из ООП в аппаратной области — самодостаточный, максимально независимый от внешнего контекста и предоставляющий минимальный, но удобный интерфейс для "дружелюбного общения" с другими объектами функциональный узел. Теоретические исследования такого "кремниевого объекта" начались еще в 50-х годах (Мюллер), а в 1987 г. знаменитый Айвэн Сазерленд (Ivan Sutherland) — пионер машинной графики, посвятил свою Тьюринговскую лекцию (выступление, сопутствующее получению премии имени А. Тьюринга) одному из самых популярных и сегодня варианту "объекта в железе", названному "микроконвейером" (micropipeline).

     Детали реализации микроконвейера Сазерленда ни нас, ни разработчиков (теоретически) могут не интересовать (в конце концов, на то он и "выходец" из объектно-ориентированной области) — по аналогии с ООП "программисты" (извиняюсь, инженеры) должны создавать функционально новые микроконвейерные объекты наследованием свойств (и элементов реализации) от базового micropipeline. А вот базовый микроконвейер по Сазерленду на уровне интерфейсов с "внешним миром" совершенно элементарен и основан на принципе "рукопожатия" (иначе называемого квитированием, подтверждением и т. д., рис. 3). Принцип действия (протокол интерфейса) также прост (минимален): один из участников процесса взаимодействия (S, см. рис. 3) посылает запрос (request, RQ) другому (R) и ожидает подтверждения (acknowledge, ACK) готовности его к взаимодействию. R в свою очередь отвечает подтверждением ACK, только когда он свободен от выполнения своих внутренних действий. В более конкретном случае, например с пересылкой данных от S к R, процесс обмена состоит из пяти основных временных интервалов, продолжительность пауз между которыми не ограничивается никакими внешними по отношению к паре (R—S) сигналами:

     1. R подготавливает данные на шине D.
     2. R посылает запрос RQ для S.
     3. S заканчивает текущее задание и читает данные с шины D.
     4. S посылает сигнал ACQ для R.
     5. R "очищает" шину D, "убирая" с нее уже ненужные данные.

     Вот, собственно, и все. Что делают устройства внутри микроконвейера — совершенно неважно. Например, R готовит адрес следующей выбираемой команды в процессоре (т. е. играет роль счетчика команд) и выдает его S, который, в свою очередь, читает команду из оперативной памяти и отправляет ее микроконвейерному декодеру команд и т. д. Никакой тактовой частоты нет — достаточно первого "толчка" (пусть это будет число 0, загружаемое в R), как вся структура начинает работать, образуя одно целое. Модель универсального (даже слишком) микроконвейера Сазерленда проще всего изготовить на основе отлично известного и выпускающегося не первый десяток лет микропроцессора Motorola 68000 — механизмы управления шинами этого чипа полностью соответствуют идее micropipeline. Уже упомянутый лампово-транзисторно-микросхемный Rise Computer работал именно по такому принципу: он содержал шесть основных устройств, весьма напоминающих микроконвейеры Сазерленда, называемые разработчиками "полями" (fields). Они связывались между собой с помощью механизма "рукопожатия", тактирование схемы отсутствовало, а для индикации производительности компьютера в цепочке "полей" был предусмотрен аппаратный "счетчик команд в секунду". К сожалению, практически вся информация об удивительном Rise сегодня утеряна, а эти жалкие крохи "выужены" из старых архивов конференции comp.arch.
     

     Живее всех живых…

     Все преуменьшать — это мания величия.
     Э. Диктуниус

     В отличие от разработок — "героев" прошлых статей автора, асинхронной технологии, можно сказать, везет. Есть и коммерческие полностью асинхронные микропроцессоры (их единицы, но если вы пользуетесь пейджером Philips, наверняка, один из них — PCA5007 — в вашем пищащем "друге" присутствует), есть замечательные исследовательские чипы, воплощенные "в кремнии" (проект AMULET, в ходе которого с 1990 г. ученые из Манчестерского университета создали уже несколько моделей совместимых с популярными ARM полностью асинхронных RISC-процессоров).

     Наконец, активно развиваются программные системы автоматизации проектирования асинхронных цифровых схем. Так что преуменьшать важность этой простой и надолго забытой идеи действительно не следует — возможно, что уже в ближайшее время асинхронные процессоры заявят о себе "во весь голос".