Открытые системы #05/2003Ревизия первооснов — конец застоя?В течение полувека инженеры, создающие компьютеры, оставались в преимущественном положении по сравнению с теми из своих коллег, которые работают в других областях техники. Оно обеспечивалось темпом развития полупроводниковых технологий, диктуемым законом Мура. Опережающий рост плотности кристаллов избавил их от необходимости преодолевать те барьеры, преодоление которых в большинстве случаев составляет главную часть инженерного труда. Специалистам по компьютерам не приходилось бороться с сопротивлением внешней среды и иными факторами, в борьбе с которыми и достигается совершенство изделий. Однако сегодня есть полное ощущение, что этой избранности пришел конец.
Популярно расхожее сравнение прогресса компьютеров и автомобилей. Более быстрый рост производительности компьютеров дает основание некоторым утверждать, что если бы автомобили совершенствовались с той же скоростью, то сегодня они стоили бы копейки, были бы удобны, как «ролс-ройсы» и перемещались со сверхзвуковой скоростью. Увы, эта эффектная метафора ошибочна. Вот если исключить вес, сопротивление воздуха, трение и многие другие факторы, тогда все стало бы корректно. Типовая задача конструктора состоит в комплексном преодолении внешних ограничений. Это утверждение можно отнести к проектированию практически любого современного продукта — кроме компьютеров и прочих изделий электронной промышленности. А раз нет ограничений, инженерная культура не растет. В условиях недостаточной инженерной культуры современный компьютер при всех его достоинствах все еще напоминает биплан братьев Райт, на который навесили реактивные двигатели, приделали фюзеляж попрочнее да попросторнее, предусмотрели кучу опций, однако сохранили основные черты первоначальной конструкции. Эстетическое сходство компьютеров с техникой начала прошлого века еще точнее обнаруживается в многостоечных системах — например, в шахматных монстрах, соревнующихся с человеком. (Странно, но даже двести лет назад люди действовали поразумнее: тогда никому и в голову не пришло устроить соревнование между человеком и паровозом.) Но вот на пороге тысячелетия, наконец, обнаружился момент сопротивления. Название ему — сложность. Именно вследствие достижения пороговых значений сложности компьютинг выступает в новую, чрезвычайно интересную полосу своего развития. Просматривается неизбежный конец безудержному росту технологических возможностей, который избавлял от необходимости искать серьезные инженерные и научные решения. Как и всегда, в первую очередь новации видны на примере машин, предназначенных для наиболее серьезных вычислительных задач. ИстокиКак это ни покажется кому-то странным, но практически все, что сегодня называют информационными технологиями, имеет в своем основании всего нескольких постулатов, формулирующих то, как устроен компьютер. А именно: во-первых, совместное хранение программ и данных в одной памяти, во-вторых, пошаговое выполнение программ в форме команд, адресованных процессору, в-третьих, синхронное функционирование в ритме, задаваемом тактовым генератором. Эти аксиомы были предложены в 40-х годах группой американских инженеров и исследователей. Нет слов, идея хранить исполняемую программу в той же самой памяти, что и данные, представляет собой удивительно изящное инженерное решение. Однако его единственность и оптимальность никем и ничем серьезно не обоснованы, и, вообще говоря, возможны были и иные решения. Схема, предполагающая использование оперативной памяти для хранения программ и данных, родилась и окрепла в Соединенных Штатах. Однако Америка — не единственное место, где рождались первые компьютеры. Кто знает, какой бы оказалась судьба современной вычислительной техники, если бы Конрад Цузе, который видел проблему создания компьютера иначе [1], жил и работал не в Германии, потерпевшей поражение во Второй мировой войне, а в стране-победителе? Может быть, тогда именно его, а не Джона фон Неймана, укрепившего свой научный авторитет среди современников главным образом своим активным участием в создании атомной бомбы, считали бы основоположником компьютеров?
Были и другие альтернативные походы. Например, английский компьютер Colossus, в создании которого принял участие Алан Тьюринг и который использовался для расшифровки немецких радиограмм, закодированных машиной Enigma. (Обнаружилось, в частности, что в битве на Курской дуге немалую роль сыграла информация, добытая посредством Colossus.) Но индустрией было выбрано фон-неймановское решение, а история, как говорят, не имеет сослагательного наклонения. И раз уж вычислительная техника пошла в этом направлении, значит, таковы были объективные условия, и иного не дано. Однако уже сейчас в целом ряде бизнес-приложений, а еще раньше при построении высокопроизводительных вычислительных машин обнаружился конфликт между этими исходными положениями и необходимостью в высокоскоростной обработке потоковых или «просто» очень больших массивов данных. Первым, очевидным и наиболее распространенным разрешением конфликта стал параллелизм. Но является ли параллелизм единственным выходом из положения, и если есть какие-то иные решения, то где их искать? Верным ли путем идем, товарищи?Несмотря на радикальное отличие современных компьютеров от своих предков, принципы, на основе которых создавалась архитектура вычислительных машин в 40-х — 50-х годах, сохраняют свою справедливость. Надо признать, что и в ряде смежных областей, например, в теории информации, за полвека тоже, по существу, ничего радикально не изменилось. За редким исключением все видимые достижения были достигнуты только за счет количественного роста основных показателей и миниатюризации. Возможно, подобное доминирование технологий и стало причиной того, что (особенно в последние десятилетия) заметно ослаб интерес к фундаментальным исследованиям собственно в компьютинге, а на первое место вышли достижения поддерживающих его технологий. Возможно также, что по этой причине так часто к месту и не к месту используется само это слово «технологии», особенно информационные. В последнее время даже возник замечательный неологизм «технологии ИТ». Конечно же, отрицать очевидные успехи информационных технологий невозможно. Прогресс огромен, его осознаешь особенно, когда оборачиваешься к недавнему прошлому и сравниваешь современный ПК с вполне передовым компьютером, скажем, двадцати—двадцатипятилетней давности. Но главные показатели для оценки эволюционного развития вычислительной техники на протяжении десятилетий оставались неизменными. А именно — тактовая частота процессоров, объем оперативной и внешней памяти. Причина проста: все это время действовал и продолжает действовать закон Мура. Он причина, надежда и опора для экстенсивного роста. Зачем искать фундаментально новые решения, если и так за полтора года произойдет двукратное ускорение? Очевидно, скорость поиска альтернатив уступает скорости роста технологий, поэтому обнаруживается удивительный феномен. За всю историю цивилизации ни одна из индустрий не имела такого потенциала для количественного роста без внедрения качественно новых решений. Везде гораздо раньше в той или иной форме обнаруживались природные ограничения, стимулировавшие революционные изменения. В авиации буквально сразу же пришлось решать проблемы аэродинамики, потом с переходом за звуковой барьер возникла проблема флаттера, потом — тепловой барьер и т.п. А вот возможность перманентной миниатюризации кажется ничем не ограниченной. В результате количество транзисторов в современном процессоре измеряется сотнями миллионов, почти миллиардами, и приблизилось к числу клеток в мозге человека. Увы, по своим возможностям самому совершенному кристаллу до мозга далеко. Обнаруживается обратная сторона медали. Необходимо признать, что постоянным технологическим усовершенствованием компенсируется затянувшаяся идеологическая стагнация, как следствие возникает проблема сложности. Слишком сложными стали современные процессоры, серверы и корпоративные системы. Помимо этих рассуждений есть явные признаки качественного развития вычислительных систем.
Можно указать еще несколько аналогичных, но менее популярных проявлений прогресса в области вычислительных систем, которые находятся в стороне от основного потока. Среди них особое место занимают попытки создать асинхронные процессоры (недавно появилась вторая редакция отличного обзора на эту тему [3]). Эти направления роднит фундаментальная общность: перед нами ни что иное, как попытки преодолеть ограничения, присущие компьютерам, построенным по фон-неймановской схеме. Процессор по фон Нейману выбирает команду и фрагмент данных из памяти, обрабатывает этот фрагмент и записывает результат в ту же память. Любое вычисление сводится к пошаговому изменению состояния памяти; процесс по определению является последовательным и с небольшими пошаговыми изменениями. Подобная простота схемы есть ее главное достоинство и одновременно основная слабость. Много лет назад Джон Бэкус назвал его бутылочным горлом машины, построенной по архитектуре фон Неймана. Бэкус против схемы фон Неймана
Бэкус был одним из первых великих программистов. Большинству его имя известно, прежде всего, по нотации Бэкуса-Наура для описания синтаксиса алгоритмических языков программирования. Между словами «алгоритмический» и «программирование» есть очевидное противоречие. Второе имеет фон-неймановское звучание, оно предполагает создание записи, служащей для управления компьютером, а не описание алгоритма решения. Однако в конечном счете, задача программирования состоит не в том, чтобы заставить компьютер выполнить нужную последовательность операций, а решить задачу. Именно так можно упрощенно представить замысел знаменитой лекции «Можно ли программирование освободить от фон-неймановского стиля?» [4], прочитанную Джоном Бэкусом в 1978 году. За нее он был удостоен высокой академической награды — Тьюринговской премии, однако заметного последействия это выступление не оставило. Индекс цитирования лекции невысок — скорее всего, потому, что Бэкус опередил свое время. Реально же в массовом порядке иного стиля, чем подвергаемый Бэкусом сомнению фон-неймановский стиль, и быть не могло. Значит, и освобождаться не от чего. Стиль, о котором говорил Бэкус, есть прямое следствие привязанности к «фон-неймановской» архитектуре, которую еще часто называют «схемой фон Неймана». Она была разработана для машины ENIAC в середине 40-х годов инженерами Джоном Эккертом и Джоном Мочли. Фон Нейман предал ее гласности в 1945 году в меморандуме First draft of a report on the EDVAC, и с тех пор она отождествляется только с его именем. Спустя год вышла его статья Preliminary discussion of the logical design of an electronic computing instrument, написанная в соавторстве с Артуром Бурксом и Германом Гольдшейном, которая стала своего рода катехизисом вычислительных систем. В ENIAC была впервые реализована идея хранения в общей оперативной памяти и данных, и программ. С тех пор она на многие годы стала аксиомой. Решение оказалось находкой, впрямую соответствующей существовавшему на тот момент уровню технологий. Во-первых, благодаря данной схеме очень дорогая быстродействующая память могла быть использована для программ и для обрабатываемых ими данных. Во-вторых, единственная существовавшая возможность для программирования на языке машинных команд оказалась чрезвычайно простой в реализации. Но любое инженерное решение является паллиативом. За все надо платить, данные и программа располагаются в одном и том же месте, следовательно, доступ к ним осуществляется через один и тот же проход. Для того, чтобы выполнить арифметическое действие, следуя оригинальной схеме, нужно извлечь из памяти нужную команду, затем переместить операнды в регистры, выполнить действие, предписанные командой, и возвратить результат в память. В трехадресных машинах почти на каждую команду приходилось по четыре обращения к памяти — высокая цена, ведь все эти манипуляции производятся по одному каналу, связывающему процессор с памятью. Наличие органического, присущего этой схеме порока было очевидно с самого начала. Он достаточно широко обсуждался еще в 60-е и 70-е годы. В качестве первой реакции появились мэйнфреймы и миниЭВМ с более сложной системой адресации, с большим количеством рабочих регистров, обладающие развитыми системами команд, наконец, появилась кэш-память, в том числе и многоуровневая. Все эти находки есть ни что иное, как первые инженерные попытки расширить бутылочное горло. Однако усомниться в самой схеме фон Неймана, позволяли себе немногие. Бэкус был одним из первых. Можно только удивиться тому обстоятельству, что человек, сделавший так много для утверждения фон-неймановского стиля в программировании, сам же спустя два десятилетия так громко высказал сомнение в нем. Бэкус не посягал на всю схему в целом, он лишь задумался о возможности альтернативного стиля в программировании. Он показал, что большинство известных языков программирования — от Фортрана до Си — построены в логике фон-неймановской архитектуры; в программах, написанных на них, в той или иной форме отражается необходимость управления процессором и памятью, поэтому он и назвал эти языки императивными (imperative), т. е. повелительными или распорядительными. В них переменной соответствует слово в памяти и в каждый момент времени выполняется одна команда. Альтернативный стиль программирования Бэкус назвал функциональным, он ближе к естественному математическому языку, в нем нет таких хорошо известных операций, как условные переходы и присваивания, нет итерационных конструкций, а переменные имеют математический смысл. К числу отличных от фон-неймановских языков относятся Лисп, Пролог, ML и ряд других языков. Стоит упомянуть, что предшественник Кобола, язык Flowmatic, созданный единственной в истории США женщиной-адмиралом Грэйс Хоппер для описания бизнес-процессов, был тоже не вполне императивным (об этом свидетельствует само название языка). Сравнение двух типов языков выходит за рамки темы, выделим одно: они обеспечивают слабую связанность при передаче состояний семантик. Это свойство, loosely coupled, является одним из важнейших для Web-служб. Заметим это на будущее, идеи функционального программирования могут оказаться чрезвычайно близкими к Web-службам. Тем, кто заинтересуется глубже идеями функционального программирования, можно порекомендовать в качестве введения статью Евгения Нонко [5]. Проблемы архитектуры фон Неймана и способы их преодоленияУзкое горло классической фон-неймановской архитектуры связано с тремя генетически присущими ей свойствами:
На протяжении нескольких десятков лет складывались направления работ, которые ставили своей целью преодоление перечисленных проблем. Исследователями предлагаются: параллельное выполнение команд, асинхронность выполнения команд, совмещение нескольких действий за время выполнения одной команды и т. д. Естественно, в каждый период времени предлагаемые решения определяются доступными технологиями. Все начиналось с простого параллелизма и потоковых систем. Появление тонких и ультратонких серверов привело к резкому снижению стоимости кластеров; соответственно возрос интерес к кластерным конфигурациям. В последние годы особый интерес привлекают к себе распределенные системы, Grid, децентрализованные параллельные архитектуры (Decentralized Parallel Computer Architecture) и метакомпьютеры, построенные на принципах обмена сообщениями с использованием технологий Web-служб. Особое место занимают нейронные сети. В поисках выхода традиционными средствамиМожно пытаться повысить производительность вычислительных систем, сохраняя верность фон-неймановской схеме, где базисным понятием является квант времени, в течение которого выполняется одна команда, служащая для обработки одной порции данных. Не нарушая первооснов, для распараллеливания можно использовать три подхода: выполнять в один квант времени несколько команд, оставляя неизменной порцию данных; наоборот обрабатывать увеличенное количество данных одной командой; наконец, совместить то и другое. Этот взгляд на вещи был предложен в классификации Флинна еще в 1966 году [6], с тех пор мало что изменилось. (Помимо ее известны также таксономия по Шору, классификация по Хэндлеру и структурная классификация по Хокни и Джессопу.) Согласно Флинну компьютеры можно разделить на четыре класса:
Классическая фон-неймановская машина попадает в категорию SISD. Отдельные усовершенствования в рамках SISD ограничиваются включением конвейеров и других дополнительных функциональных узлов (например, таких, как процессоры с плавающей точкой, векторные и графические сопроцессоры). В категорию SIMD попадают компьютеры, имеющие несколько идентичных процессоров, подчиненных одному устройству управления, которое одновременно передает им одинаковые команды. Каждый из процессоров работает с собственным потоком данных, расположенным в его собственной памяти. Класс MISD теоретически возможен, однако на практике машин, которые бы обрабатывали один элемент данных множественным потоком команд, работающим на нескольких процессорах, создано не было. Большинство современных многопроцессорных и многокомпьютерных систем попадают в категорию MIMD. Теоретически возможны четыре возможных метода взаимодействия между процессорами. Первые два основаны на совместном использовании памяти, которая может представлять собой единый блок или распределяться между процессорами. Они различаются степенью связанности, т. е., возможна «жесткая связь» (tightly coupled) или «слабая связь» (loosely coupled). Два других способа — использование общей шины или коммутатора и сетевое объединение с использованием обмена сообщениями. Компьютеры MIMD с распределенным доступом к памяти (shared memory) обязаны иметь механизм доступа к общему адресному пространству. С одной стороны, наличие общего пространства дает преимущества (значительно упрощается программирование), но в то же время оно накладывает существенные ограничения. Во-первых, требуется синхронизация между процессорами; обычно эту функцию выполняют операционные системы. Во-вторых, в машинах типа UMA (Uniform Memory Access), к которым относится большинство, особенно остро проявляется проблема бутылочного горла; машину трудно сделать очень большой из-за необходимости организовать обмен между процессорами и памятью. Паллиативом служит архитектура NUMA (Non-Uniform Memory Access), где каждый процессор имеет свою небольшую область памяти. Такие машины строить проще, но и цена простоты очевидна — усложняется программирование, поскольку возникает необходимость в репликации данных. MIMD-машины с распределенной памятью (MIMD-DM) строить легче (типичный пример — кластер типа Beowulf), но гораздо сложнее программировать. Обычно координация между машинами осуществляется на основе обмена сообщениями.
От бумажных компьютеров, управляемых данными, к серверу на кристаллеМы не замечаем фон-неймановского подхода — примерно так, как не замечаем того, что говорим прозой. В данном случае проза жизни заключается в том, что работа всех современных компьютеров подчинена устройству управления, выполняющему программу (control driven), т. е. поток команд обрабатывает массив данных. Но теоретически вполне возможна и обратная ситуация: можно было бы построить «зеркальную» машину, в которой поток данных определяет необходимую для их обработки последовательность операций. Если вдуматься, то в природе именно такая ситуация встречается куда чаще. Так, входной поток информации управляет поведением животного, а не программа. В подобной альтернативной машине процессор, управляемый данными (data driven), выполняет ту или иную операцию, когда доступен соответствующий операнд. Сам термин dataflow впервые был предложен в 1969 году Адамсом из Стэнфордского университета. Вскоре в Массачусетском технологическом институте появился бумажный проект такого компьютера; потом появился язык Id (Irvine dataflow). В 1979 году во Франции был построен первый многопроцессорный DFC-компьютер, называвшийся CERT-ONERA. Примерно в то же время компания Texas Instruments разрабатывала свою версию системы DDP (Data-Driven Processor). Первым коммерческим отличным от фон-неймановского проектом стал процессор Data-Driven Media Processor (DDMP), предложенный в 1995 году компанией Sharp для обработки мультимедийных данных. Ни одна из этих попыток не получила серьезного признания и не была успешной с коммерческой точки зрения. Тем не менее, считать потоковые подходы к созданию компьютеров тупиковой веткой эволюции было бы неверно. Идеи, родившиеся в качестве альтернативы фон-неймановской схеме, продолжают жить, вступая с ней в конвергенцию. Парадигмы control flow и data flow оказались вовсе не ортогональны; в действительности, они образуют единую ось, являясь в чистом виде ее полюсами. В результате появились разнообразные многопотоковые модели (single-token-per-arc dataflow, tagged-token dataflow, explicit token store, threaded dataflow, large-grain dataflow, RISC dataflow, cycle-by-cycle interleaved multithreading, block interleaved multithreading, simultaneous multithreading). В [7] дан исторический обзор сорокалетней эволюции асинхронных подходов к параллельным вычислениям. Эта работа заслуживает прочтения, но стоит учесть, что она написана в 1998 году, и за прошедшие с того времени несколько лет произошли существенные изменения. Современный обзор направлений, по которым эволюционирует архитектура микропроцессоров в последние годы, написан двумя новозеландскими авторами [8]. Они вводят собственную классификацию и подразделяют современные подходы к проектированию процессоров на четыре класса, в зависимости от того, как соответствующая архитектура связана с фон-неймановской:
В последнюю категорию попадает проект MAJC компании Sun Microsystems. В отличие от других известных процессоров, в том числе и процессоров Sun UltraSPARC, этот проект обладает серьезной научной новизной. Показательно, что главный евангелист Sun Грег Попадопулос написал статью на близкую тему еще в 1991 году [9, 10]. К тому же, корни MAJC можно поискать в архитектурах RISC и Parallel RISC (приверженность Sun последней хорошо известна). Процессоры с архитектурой MAJC — реальный шаг в новом направлении аппаратной интеграции, называемом «сервером на кристалле». Более десяти лет существовало сложившееся представление о том, что сервер — это монолитное устройство. Потом появились тонкие серверы, затем на серверное пространство стремительно ворвались «лезвия», они поколебали это представление, а грозящие появиться в ближайшие годы серверы на кристалле могут вообще радикально изменить его. Не исключено, что этот шаг может оказаться по важности сравнимым с появлением первых микропроцессоров: тогда в кристалл упаковали собственно центральный процессор, а сейчас — и весь сервер. От сервера на кристалле к мегакомпьютеру и самоуправляемым системамОписанные отдельные попытки преодоления «бутылочного горла» фон-неймановской архитектуры на уровне процессора можно отнести к «микроуровню». Макроуровень определен гораздо хуже; будем им считать, например, grid-сеть, корпоративную информационную систему или высокопроизводительный кластер. Представления о том, что такое макроуровень, появились относительно недавно, поэтому сейчас говорить о его потенциале в полном объеме еще сложно. Однако ясно, что в перспективе появятся сложные самоуправляемые компьютерные системы (Autonomous Computing). С подачи IBM близким термином Autonomic Computing стали называть технические системы с элементами саморегулирования и самодиагностики, которые позволяют преодолеть проблемы сложности, свойственные, например, современным серверам. Понятие Autonomous Computing на ступень выше; оно относится к системам, состоящим из нескольких компьютерных систем, каждая из которых управляется (controlled/managed) совершенно независимо [11, 12]. Системы находятся в некоторых взаимоотношениях друг с другом; принципиально важно, что эти отношения не являются детерминированными и отдельные системы не должны доверять друг другу полностью — т. е. вести себя примерно так, как люди в обществе. В полном масштабе реализация подобного рода идей — удел будущего, но уже сейчас понятно, что взаимодействие между системами, как и между людьми, может быть основано на обмене сообщениями. Оказывается, на макроуровне тоже есть необходимость в преодолении унаследования фон-неймановской схемы, но здесь главным не является проблема бутылочного горла, а принцип командного управления, заложенный в транзакционную модель. Первыми практическими решениями на пути к будущему Autonomous Computing являются системы, основанные на Web-службах, развивающих идеи «вычислений, ведомых сообщениями» (Message Driven Computation, MDC). Идеи MDC тоже известны давно [13], но для них не было технологического базиса, который явился в образе Web-служб, что оказалось неожиданностью. В истории техники нередко случается, что область, где та или иная новация получает наибольший спрос, оказывается далека от первоначально предполагаемой. Вспомним, что предшественник Java, язык Oak задумывался в качестве средства для автоматизации пультов и выключателей, потом на Java писали простенькие игры, и во что все вылилось в конечном итоге? Точно так же, когда несколько лет назад впервые заговорили о Web-службах, наблюдалась полная растерянность. Почти всем было понятно, что открыто нечто важное, но что именно? Даже два года назад почти никто толком не мог объяснить, зачем Web-службы нужны. Но когда представления о Web-службах начали приобретать более конкретный характер, стало очевидно, что это не просто возможность обеспечения обмена между приложениями, как казалось поначалу. MDC-архитектуры обладают несколькими важными особенностями.
А дальше остается сделать всего еще один шаг. Если можно построить корпоративный мегакомпьютер, то почему нельзя аналогичным образом построить суперкомпьютер для высокопроизводительных вычислений? В [14] эту идею назвали посткластерными вычислениями (Post-Cluster computing). Авторы построили на основе Web-служб мегакомпьютер для решения популярного научного приложения — моделирования методом конечных элементов. Что сказал бы Джон фон Нейман?В этой статье так часто упоминалось имя Джона фон Неймана, что возникает чувство неловкости перед ним. Думаю, как ученый-математик он был лишен всякого догматизма и был бы сам против консервации науки технологическими средствами, наблюдавшейся в последние десятилетия. А что до его схемы, то никто ее не отменит. Как основной инженерный принцип она еще долго будет оставаться одной из первооснов вычислительных архитектур. При этом она будет развиваться, но пути развития на микро- и макроуровне пока явно расходятся. |