39277

АРХИТЕКТУРА СПЕЦИАЛИЗИРОВАННЫХ СИСТЕМ ОБРАБОТКИ, АНАЛИЗА И ИНТЕРПРЕТАЦИИ ДАННЫХ

Конспект

Информатика, кибернетика и программирование

Команды. Опережающий просмотр команд. Структура ЭВМ с множественным потоком команд Глава 12. Компьютеры становятся весьма сложными кудато пропадает дружественность интерфейса программная среда переходит на жесткий командный язык и начинает требовать от пользователей предоставления такой информации которая не всегда известна и т.

Русский

2013-10-01

1.33 MB

19 чел.

Министерство образования и науки Российской Федерации

Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования

РЯЗАНСКИЙ   ГОСУДАРСТВЕННЫЙ   РАДИОТЕХНИЧЕСКИЙ   УНИВЕРСИТЕТ

                                                                                                             

ФАКУЛЬТЕТ ВЫЧИСЛИТЕЛЬНОЙ ТЕХНИКИ

Кафедра Электронных Вычислительных Машин

КОНСПЕКТ ЛЕКЦИЙ

по дисциплине

АРХИТЕКТУРА СПЕЦИАЛИЗИРОВАННЫХ СИСТЕМ ОБРАБОТКИ, АНАЛИЗА И ИНТЕРПРЕТАЦИИ ДАННЫХ

магистерская подготовка

для направления 230100 « Информатика и вычислительная техника »

Очная форма обучения

Рязань 2011


Конспект лекций по курсу

АРХИТЕКТУРА СПЕЦИАЛИЗИРОВАННЫХ СИСТЕМ ОБРАБОТКИ, АНАЛИЗА И ИНТЕРПРЕТАЦИИ ДАННЫХ

Содержание

      Введение

Принципы построения параллельных вычислительных систем.

ЧАСТЬ I. ПАРАЛЛЕЛЬНЫЕ ВЫЧИСЛИТЕЛЬНЫЕ СИСТЕМЫ

Глава 1. Что скрывают "обыкновенные" компьютеры

§ 1.1. Немного об устройстве компьютера

Представление информации. Общее устройство компьютера. Операции и операнды. Команды. Управление. Арифметико-логическое устройство. Память. Устройство ввода/вывода. Центральный процессор.

§ 1.2. Языки программирования и программы

Языки низкого и высокого уровня. Проблемно-ориентированные языки. Контроль эффективности программ. Компьютерная зависимость. Портабельность программ. Компиляторы и эффективность программ. Необходимость привлечения дополнительной информации.

Глава 2. Как повышают производительность компьютеров

§2.1. Усложнение и наращивание аппаратных средств

Уменьшение размеров. Скалярная, конвейерная и параллельная обработка. Иерархия памяти. Опережающий просмотр команд. Локальность вычислений и использования данных. Примеры. Вопросы и задания.

§ 2.2. Повышение интеллектуальности управления компьютером

Закон Мура. Спецпроцессоры. Суперскалярные и VLIW-архитектуры. Коммутационные схемы. Топологии связей процессоров. SMP-компьютеры. Архитектуры XIМЛ и ccNUMA. Развитие программного обеспечения. Примеры. Вопросы и задания.

§ 2.3. Система функциональных устройств

Простые и конвейерные устройства. Стоимость работы. Загруженность. Пиковая и реальная производительность. Эффективность. Различные соотношения. Законы Амдала и Густавсона - Барсиса. Взаимосвязь законов. Вопросы и задания.

Глава 3. Архитектура параллельных вычислительных систем

§ 3.1. Классификация параллельных компьютеров и систем

Классификация Флинна, Хокни, Фенга, Хендлера, Шнайдера, Скилликорна. Взаимосвязь классификаций. Архитектура компьютеров и структура задач.

ЧАСТЬ II. ПАРАЛЛЕЛЬНОЕ ПРОГРАММИРОВАНИЕ

Глава 4. Большие задачи и параллельные вычисления

§ 4.1. Большие задачи и большие компьютеры

Моделирование климатической системы. Обтекание летательных аппаратов. Математические модели и вычислительная техника. Огромные объемы вычислений и размеры памяти.

Глава 5. Технологии параллельного программирования

§ 5.1. Использование традиционных последовательных языков

Обилие средств параллельного программирования. Трудности применения. Необходимость дополнительной информации. Системы программирования Open MP, DVM, mpC. Примеры использования.

Глава 6. Тонкая информационная структура программ

§ 6.1. Выбор класса программ

Статический анализ структуры программ. Статистическая значимость отдельных операторов. Линейный класс программ.

Глава 7. Эквивалентные преобразования программ

§ 7.1. Наиболее распространенные преобразования программ

Перестановка циклов. Слияние циклов. Переупорядочивание операторов. Распределение цикла. Скашивание цикла. Расщепление пространства итераций. Выполнение итераций цикла в обратном порядке. Треугольные преобразования.

ЧАСТЬ III. СМЕЖНЫЕ ПРОБЛЕМЫ И ПРИМЕНЕНИЕ

Глава 8. Вычислительные системы и алгоритмы

Глава 9. Пользователь в среде параллелизма

ЧАСТЬ 1V  ОРГАНИЗАЦИЯ ПАРАЛЛЕЛЬНЫХ ЭВМ И СУПЕРСКАЛЯРНЫХ ПРОЦЕССОРОВ

Глава 10. Принципы параллельной обработки

& 10.1. Формы параллелизма в алгоритмах и программах

Глава 11. Структура ЭВМ с множественным потоком команд

Глава 12. Структура процессора на основе параллелизма. Другие типы параллельных процессов.

$  12.1. Структура и функционирование конвейера.

& 12.2. Структура суперскалярного прцессора.

Глава 13. Программное обеспечение параллельных ЭВМ

&13.1. Особенности ПО параллельных ЭВМ.

&13.2. Языки программирования для транспьютерных систем.

&13.3. ПО и служебные алгоритмы суперскалярных процессоров.

Глава 14.Параллельные алгоритмы.

&14.1. Принципы создания параллельных алгоритмов.

Заключение. Параллельные вычисления: интеграция от А до Я

Список литературы

Интернет-ресурсы

 Введение

Принципы построения параллельных вычислительных систем.

В активе человечества имеется не так много изобретений, которые, едва возникнув, быстро распространяются по всему миру. Одним из них является компьютер. Появившись в середине двадцатого столетия, он через несколько десятков лет повсеместно стал незаменимым инструментом и надежным помощником в обработке самой разнообразной информации: цифровой, текстовой, визуальной, звуковой и др.

Известно, что первопричиной создания компьютеров была настоятельная необходимость быстрого проведения вычислительных работ, связанных с решением больших научно-технических задач в атомной физике, авиастроении, климатологии и т.п. Решение таких задач и сейчас остается главным стимулом совершенствования компьютеров. Однако в настоящее время основная сфера их применения связана с совсем иной деятельностью, в которой вычислительная составляющая либо отсутствует совсем, либо занимает небольшую часть.

Работа биржи, управление производством, офисные приложения, корпоративные информационные системы, процессы образования, игры, ведение домашнего хозяйства — это всего лишь отдельные примеры областей невычислительного использования компьютеров. В подобных областях вполне приемлемо применение персональных компьютеров и рабочих станций для достижения необходимых целей. Относительная простота процесса использования и комфортная программная среда формируют здесь устойчивое впечатление о компьютере как о весьма дружественном помощнике. И мало кто из пользователей такой техники догадывается и, тем более, знает, что все радикально меняется с переходом к решению больших и очень больших задач. Компьютеры становятся весьма сложными, куда-то пропадает дружественность интерфейса, программная среда переходит на жесткий командный язык и начинает требовать от пользователей предоставления такой информации, которая не всегда известна, и т.п.

Эта книга о больших и супербольших компьютерах и особенностях их использования. О тех проблемах, с которыми неизбежно приходится сталкиваться любому пользователю, вынужденному применять вычислительную технику на пределе ее возможностей.

Вообще говоря, большие задачи сами по себе не являются предметом нашего обсуждения, тем более, детального. Но иногда мы будем обращаться к ним явно, чтобы проиллюстрировать какие-то положения. Неявно же большие задачи буквально пронизывают всю книгу, т.к. любое обсуждение чаще всего предполагает, что решается именно большая задача. Формально характер обсуждения никак не связан с типом задач, хотя может ощущаться некоторая ориентация на научно-техническую сферу деятельности. Это объясняется всего лишь тем, что основное применение больших и супербольших компьютеров связано именно с данной сферой и потребности данной сферы оказывают наибольшее влияние на развитие компьютеров, по крайней мере, в настоящее время. Тем не менее, обсуждаемые в книге проблемы в одинаковой мере относятся к большим задачам как научно-техническим, так и любым другим, например, информационным.

Все, что связано с большими компьютерами и большими задачами, сопровождается характерным словом "параллельный": параллельные компьютеры, параллельные вычислительные системы, языки параллельного программирования, параллельные численные методы и т. п. В широкое употребление этот термин вошел почти сразу после появления первых компьютеров. Точнее, почти сразу после осознания того факта, что созданные компьютеры не в состоянии решить за приемлемое время многие задачи. Выход из создавшегося положения напрашивался сам собой. Если один компьютер не справляется с решением задачи за нужное время, то попробуем взять два, три, десять компьютеров и заставим их одновременно работать над различными частями общей задачи, надеясь получить соответствующее ускорение. Идея показалась плодотворной, и в научных исследованиях конкретное число объединяемых компьютеров довольно быстро превратилось в произвольное и даже сколь угодно большое число.

Объединение компьютеров в единую систему потянуло за собой множество следствий. Чтобы обеспечить отдельные компьютеры работой, необходимо исходную задачу разделить на фрагменты, которые можно выполнять независимо друг от друга. Так стали возникать специальные численные методы, допускающие возможность подобного разделения. Чтобы описать возможность одновременного выполнения разных фрагментов задачи на разных компьютерах, потребовались специальные языки программирования, специальные операционные системы и т.д. Постепенно такие слова, как "одновременный", "независимый" и похожие на них стали заменяться одним словом "параллельный". Всё это синонимы, если иметь в виду описание каких-то процессов, действий, фактов, состояний, не связанных друг с другом. Ничего иного слова "параллелизм" и "параллельный" в областях, относящихся к компьютерам, не означают.

Далеко не сразу удалось объединить большое число компьютеров. Первые компьютеры были слишком громоздкими, потребляли слишком много энергии, да и многие технологические проблемы комплексирования еще не нашли эффективного решения. Но со временем успехи микроэлектроники привели к тому, что важнейшие элементы компьютеров по многим своим параметрам, включая размеры и объем потребляемой энергии, стали меньше в тысячи и более раз. Идея объединения большого числа компьютеров в единую систему стала главенствовать в повышении общей производительности вычислительной техники. В одной из самых больших современных систем ASCI White объединено 8192 процессора. При этом достигаются весьма впечатляющие суммарные характеристики: пиковая производительность более 12 Тфлопс, оперативная память 4 Тбайт, дисковый массив 160 Тбайт. Но всем этим богатством нужно еще уметь воспользоваться.

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

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

Вот уже более полувека параллельные вычисления привлекают внимание самых разных специалистов. Три обстоятельства поддерживают к ним постоянный интерес. Во-первых, это очень важная сфера деятельности. Занимаясь параллельными вычислениями, исследователь понимает, что он делает что-то, относящееся к самым большим задачам, самым большим компьютерам и, следовательно, находящееся на передовом фронте науки. Как минимум, близость к передовому фронту науки вдохновляет. Во-вторых, это очень обширная сфера деятельности. Она затрагивает разработку численных методов, изучение структурных свойств алгоритмов, создание новых языков программирования и многое другое, связанное с интерфейсом между пользователем и собственно компьютером. Параллельные вычисления тесно связаны и с самим процессом конструирования вычислительной техники. Структура алгоритмов подсказывает необходимость внесения в компьютер изменений, эффективно поддерживающих реализацию структурных особенностей. Инженерные же новшества стимулируют разработку новых алгоритмов, эффективно эти новшества использующих. И, наконец, в-третьих. С формальных позиций рассматриваемая сфера деятельности легко доступна для исследований. Достаточно более или менее познакомиться с ее основами на уровне популярной литературы и уже можно делать содержательные выводы, возможно, даже никем не опубликованные.

Последнее обстоятельство придает характерную окраску исследованиям в области параллельных вычислений. Легкое освоение основных положений привлекает к параллельным вычислениям большое число специалистов из других областей. Это порождает немало новых задач, особенно на стыке вычислительной техники и приложений. Некоторые из них оказываются интересными и перспективными. Но, с другой стороны, простота освоения основ порождает массу легковесных результатов, что не делает параллельные вычисления привлекательной областью для серьезных исследований и не позволяет раскрыть все их богатство и многообразие связей.

В подтверждение сказанного приведем некоторые данные на начало 80-х годов прошедшего столетия. Это был период, когда в широкое использование стали поступать самые разнообразные компьютеры и вычислительные системы параллельной архитектуры. К этому времени только по проблемам их освоения было опубликовано более 5000 работ, и поток публикаций имел явную тенденцию к расширению. В данном потоке заметную часть составляли работы, связанные с обсуждением особенностей реализации параллельных численных методов, главным образом, по линейной алгебре. Интерес к методам линейной алгебры вполне понятен, т. к. они составляют основу процессов решения многих сложных проблем. Согласно данным, взятым из библиографических указателей на начало 80-х годов XX века, в области вычислительных методов линейной алгебры было опубликовано примерно 8000 работ. При этом около 120 ученых мира имели по этой тематике более чем по 10 работ. Казалось бы, что именно им и развивать параллельные методы линейной алгебры. Но среди них на тот период лишь около 10 человек имели по одной-две публикации, косвенно относящихся к параллельным численным методам и их применению на параллельных вычислительных системах. И только несколько человек имели публикации, прямо посвященные обсуждению этих проблем.

Интересно отметить, что в определенном смысле история повторяется. Аналогичной была ситуация на рубеже появления первых вычислительных машин. Тогда математики - алгоритмисты также принимали слабое участие в разработке численных методов и программ для компьютеров. Прошло много лет, прежде чем положение изменилось. Последствия же этого периода ощущаются до сих пор. В настоящее время вычислительное сообщество активно переходит на использование кластеров, больших многопроцессорных систем, неоднородных систем и систем, распределенных по значительной территории. И опять ведущая роль в освоении новейшей техники в целом принадлежит не профессионалам в создании численных методов, а разработчикам языков программирования, компиляторов, операционных систем и просто лицам, которым необходимо решать задачи. К тому времени, когда математиками будет понято, как надо правильно реализовывать численные методы на новой технике, менять программную среду, скорее всего, будет поздно. Но именно от численных методов во многом зависит, насколько успешно используется вычислительная техника.

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

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

Это в значительной мере определило представленный в книге материал. Мы сразу отказались от искушения описать многие, в том числе, весьма красивые инженерные, программистские и математические идеи, оказавшиеся по каким-либо причинам либо нереализованными, либо апробированными недостаточно. Но даже при таком ограничении интересных идей и достижений, относящихся к параллельным вычислениям, оказалось немало. Отбор материала и структура его описания подчинены одной из целей книги — показу многообразия и глубины связей различных направлений деятельности в параллельных вычислениях с соседними областями. В первую очередь, с созданием вычислительной техники, разработкой программного обеспечения и математическими исследованиями.

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

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

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

Проблемы пользователей нам известны не понаслышке. За плечами лежит более двадцати лет научной, производственной и педагогической деятельности в области параллельных вычислений. За это время освоены многие компьютеры и большие вычислительные системы. Было решено немало задач. Но не было ни одного случая, когда одна и та же программа эффективно реализовывалась без существенной переделки при переходе к другой технике. Конечно, хотя и трудно, но все же можно заново переписать программу, удовлетворяя требованиям языка программирования и штатного компилятора. Однако новую большую программу суперсложно сделать эффективно работающей.

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

Наши исследования показывают, что большинство из узких мест может быть объединено в три группы. Первая связана собственно с компьютером. На любом параллельном компьютере не все потоки данных обрабатываются одинаково. Какие-то из них реализуются предельно эффективно, какие-то достаточно плохо. Изучая особенности архитектуры компьютера, очень важно понять, что представляет собой те и другие потоки и описать их математически. Вторая определяется структурой связей между операциями программы. Не в каждой программе обязаны существовать фрагменты, реализуемые эффективно на конкретном компьютере. И, наконец, третья зависит от используемой в компиляторе технологии отображения программ в машинный код.

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

Акцентированное внимание к узким местам процесса решения задач является характерной чертой настоящей книги. Узкие места описываются и изучаются практически всюду: в параллельных компьютерах и больших вычислительных системах, процессах работы многих функциональных устройств, конструировании численных методов, языках и системах программирования, различных приложениях и даже в работе пользователей. Особое внимание уделяется узким местам, связанным с выявлением параллельных структур алгоритмов и программ и их отображением на архитектуру компьютеров.

Исследуя различные вопросы параллельных вычислений, мы неоднократно убеждались в том, что все они связаны многими незримыми нитями как между собой, так и с совершенно далекими от любого параллелизма областями знаний. Эти связи не лежат на поверхности, и почувствовать их можно, лишь поставив исследования на строгую математическую основу. И тогда начинает возникать ощущение, что параллельные вычисления своими корнями уходят во что-то очень фундаментальное. Возможно, это что-то есть информационная структура алгоритмов. Возможно, оно окажется чем-то иным. Но в любом случае появляется уверенность, что глубокое изучение параллельных вычислений приведет, в конце концов, к пониманию того, как должны быть устроены наши алгоритмы, компьютеры и программное обеспечение. Сейчас параллельные вычисления представляются гигантским айсбергом, верхушка которого исследована весьма основательно. Исследование же остальной его части только начинается. Перспективу этого процесса мы также попытались отразить в нашей книге.

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

Создание учебного пособия широкого профиля по параллельным вычислениям — это, пожалуй, самая главная цель написания настоящей книги. Мы постарались с единых позиций не только рассказать об основах данного научного направления, но и показать его проблемы и перспективы развития. Конечно, по параллельным вычислениям имеется немало хороших книг и публикаций. Но все они, на наш взгляд, слишком фрагментарны и не создают цельного впечатления о рассматриваемой сфере деятельности, осуществляемой на стыке многих наук. Структура и форма изложения материала этой книги формировались довольно долго. Научные исследования позволили выделить опорные точки параллельных вычислений среди огромного числа общих результатов и наметить их связь между собой. В предварительных публикациях была предпринята попытка развить и систематизировать эти связи на основе строгих математических определений и выкладок. Различные фрагменты книги неоднократно обсуждались на конференциях, семинарах и в дискуссиях с коллегами. На основе отобранного материала в течение многих лет читаются основные и специальные курсы в Московском государственном университете им. М. В. Ломоносова, физико-техническом институте и международном государственном университете в г. Дубна. Решающим обстоятельством, повлиявшим на ускорение процесса написания книги, стало наше участие в молодежных научных школах. Необходимость создания учебных пособий по параллельным вычислениям там ощущалась особенно остро.

Заниматься параллельными вычислениями довольно сложно. Эту область за короткое время трудно освоить и, тем более, трудно получить хорошие результаты. Поэтому в коллективах, где проводятся подобные работы, имеет большое значение создание атмосферы поддержки, заинтересованности и терпеливости. Нам приятно выразить признательность академику Г. И. Марчуку, который такую атмосферу создал в институте вычислительной математики Российской академии наук и в течение многих лет поддерживал это направление исследований.

Мы благодарны академику В. А. Садовничему за столь же благоприятную атмосферу в Московском университете и поддержку работ научно-исследовательского вычислительного центра МГУ по созданию крупнейшего центра по высокопроизводительным вычислениям в системе вузов России. Многолетнее сотрудничество ИВМ РАН и НИВЦ МГУ в области параллельных вычислений позволило приобрести бесценный опыт как в решении больших задач, так и в правильной расстановке акцентов в процессах образования и подготовки высококвалифицированных кадров. Появление этой книги есть одно из следствий данного сотрудничества.

В процессе написания книги нам пришлось контактировать со многими коллегами. Некоторые из них предоставили свои материалы, помогающие лучше осветить отдельные разделы. С другими было просто полезно поговорить, чтобы сформировать нужную точку зрения. Всем им мы выражаем нашу признательность. Особенно отмечаем участие академика В. П. Дымникова, член-корреспондента А. В. Забродина, докторов физико-математических наук С. М. Абрамова, А. Н. Андрианова, А. Л. Ластовецкого, В. А. Крюкова, А. Н. Томилина, кандидатов физико-математических наук К. Н. Ефимкина, Н. А. Коновалова.

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

Мы благодарим представительство компании Hewlett-Packard в России за предоставленные материалы, возможность использования ее вычислительной техники, за внимание и постоянный интерес к нашей работе.

Мы исключительно благодарны А. И. Караваеву, прекрасно подготовившему все иллюстрации, использованные в данной книге. Наша искренняя благодарность сотрудникам лаборатории параллельных информационных технологий НИВЦ МГУ: кандидату физико-математических наук А. С. Антонову, А. Н. Андрееву и С. А. Жуматию за множество ценных замечаний по рукописи.

И, наконец, нашу особую признательность мы хотим выразить Т. С. Гамаюновой и С. Н. Воеводиной. Без их самоотверженной работы по набору текста, его проверке, подготовке оригинал-макета и коррекции материала книга могла бы не появиться в срок.

Параллельные вычисления — перспективная и динамично изменяющаяся область научной и прикладной деятельности. Мы надеемся, что выбрать правильный путь в ней поможет эта книга.


ЧАСТЬ I

ПАРАЛЛЕЛЬНЫЕ

ВЫЧИСЛИТЕЛЬНЫЕ СИСТЕМЫ

Глава 1

Что скрывают "обыкновенные" компьютеры

В своем развитии персональные компьютеры достигли высокого уровня совершенства. Они компактны, обладают большой скоростью выполнения заданий и, что особенно важно, достаточно просты в обращении. Все эти качества привели к их широкому использованию, в том числе среди лиц, не имеющих специальной компьютерной подготовки. По существу персональный компьютер становится таким же привычным устройством, как пылесос, кухонный комбайн и телевизор. Он остается удобным инструментом до тех пор, пока не приходится решать очень большие задачи. Конечно, в этом случае можно попытаться использовать самый быстрый персональный компьютер с максимально большой памятью. Можно также перейти к использованию рабочей станции. Однако увеличение возможностей на этом пути все же ограничено. И тогда приходится обращаться к суперкомпьютерам.

Согласно распространенному мнению, суперкомпьютер — это такой компьютер, у которого все самое-самое: супербольшая скорость, супербольшая память, супербольшая цена. Это действительно так. Но, переходя от персонального компьютера к суперкомпьютеру, пользователю приходится также сталкиваться с очень большими трудностями в их использовании. Главное, на суперкомпьютерах отсутствует характерная для персональных компьютеров пользовательская среда. Оказывается, что использовать суперкомпьютер гораздо сложнее, чем персональный компьютер, а некоторые суперкомпьютеры даже очень сложно. Кроме этого, выясняется, что разных типов суперкомпьютеров довольно много, они не совместимы друг с другом, и на разных суперкомпьютерах совсем разные пользовательские среды. Взвесив предстоящие трудности, пользователи нередко отказываются от использования суперкомпьютеров вообще или переходят к более простым суперкомпьютерам. Если же пользователь все же решается использовать суперкомпьютер, ему важно понимать причины появления новых трудностей и пути их преодоления.

Современные суперкомпьютеры возникли не вдруг. Они являются продуктом длительного развития "обыкновенных" компьютеров, к которым, кстати, относится и типовой персональный компьютер. Эти "обыкновенные" компьютеры имеют ряд принципиальных узких мест, которые не позволяют достичь сколь угодно большой скорости и иметь сколь угодно большую память. Стремление сделать компьютеры более мощными и развязать узкие места привело, в конце концов, к тем изменениям, которые превратили "обыкновенный" компьютер в суперкомпьютер. Узких мест в компьютерах много, много и способов их развязки. Это породило много типов суперкомпьютеров. К сожалению, за возросшие скорости и объемы памяти приходится платить. Для пользователей эта плата связана, в первую очередь, со значительным усложнением и ухудшением пользовательской среды. Многое из того невидимого, что делали "обыкновенные" компьютеры, на суперкомпьютерах пользователям надо делать самим. Просто потому, что проблемы эффективного обслуживания пользовательских задач стали настолько сложными, что пока их не научились хорошо решать в автоматическом режиме.

Чтобы лучше понять причины появления новых трудностей и, возможно, наметить в дальнейшем пути их преодоления, рассмотрим сначала, как устроен "обыкновенный" компьютер. Мы не будем заниматься детальным и, тем более, инженерным анализом. Лишь рассмотрим те узкие места, развязывание которых, с точки зрения пользователя, и превращает "обыкновенный" компьютер в суперкомпьютер с его достоинствами и недостатками.

§1.1. Немного об устройстве компьютера

За очень редким исключением во всех существующих компьютерах, как "обыкновенных", так и супер, реализована одна и та же конструктивная идея. Она состоит в том, что вся исходная и перерабатываемая информация хранится в компьютерах в форме некоторого множества двоичных разрядов или битов, а любое ее преобразование сводится, в конце концов, к преобразованию битов с помощью нескольких простых функций.

Сейчас нереально даже представить такую ситуацию, при которой пользователь записывает и читает свою информацию в двоичном виде, а также описывает ее преобразование как преобразование множества битов. В действительности он всегда общается с компьютером на каком-нибудь приемлемом для него языке. Часто пользователь даже не знает, какие процессы происходят в конкретном компьютере при решении его задач. Однако для нас очень важно помнить, что, тем не менее, все эти процессы в любом случае осуществляются на битовом уровне. Частично переход к битовому уровню и обратно выполняется автоматически с помощью аппаратных средств, частично программным путем. От того, насколько эффективно реализуются эти переходы, в немалой степени зависит успех в решении пользовательских задач.

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

Основным информационным элементом в компьютере является слово. Каждое слово представляет собой упорядоченный набор битов. Слово может делиться на байты. Байт означает упорядоченный набор из 8 битов. Число битов в слове называется его длиной. В любом конкретном компьютере все слова имеют одну и ту же длину. В разных компьютерах длина слов может быть разной. Например, в персональном компьютере слово состоит из одного байта, в компьютере Сгау-1 оно состоит из 64 битов. Если в слове записана какая-то информация, то это означает, что в каждом бите слова зафиксировано одно из двух возможных его состояний 0 или 1. Совокупность состояний всех битов слова определяет содержимое слова. Устройство, в котором хранится все множество слов, обобщенно называется памятью. Оно может быть простым или сложным, однородным по устройству или разнородным в зависимости от типа или назначения компьютера. Все слова поименованы. Имя слова называется адресом. Структура адреса в определенном смысле отражает структуру памяти. Разные слова имеют разные адреса. Каждый адрес связан с конкретным физическим местом в памяти.

Если память устроена сложно и, к тому же, разнородна по своему строению, времена обращения к отдельным словам могут варьироваться в очень широких пределах, отличаясь друг от друга не только в разы, но и в десятки, сотни и даже тысячи раз. Это исключительно важное обстоятельство и оно нередко решающим образом определяет время решения задач. К различным вопросам эффективной работы с памятью мы будем возвращаться в этой книге неоднократно.

Основная задача любого компьютера состоит в преобразовании хранящейся в памяти информации. Она всегда реализуется как выполнение последовательности простых однозначных функций над содержимым отдельных слов. Как правило, все функции имеют не более двух аргументов. Функции могут использовать и/или изменять как слова целиком, так и их части. Вообще говоря, разные компьютеры могут иметь разные наборы исполняемых функций. Однако очень часто эти наборы функционально совпадают во многом или полностью, различаясь лишь техникой реализации. Наиболее распространенными функциями являются простейшие арифметические операции над числами (сложение, вычитание, умножение и т. д.) и логические операции булевой алгебры над битами слов (конъюнкция, дизъюнкция и т. д.). Обычно в компьютерной терминологии все функции называются операциями, а значение аргумента, иногда сам аргумент и даже адрес слова, где содержится аргумент, — операндами.

В компьютере операция реализуется в виде некоторой электронной схемы. Для обозначения реализаций этих схем используется самая различная терминология. Они называются чипом, устройством, процессором, сопроцессором и т. п. в зависимости от их сложности, связи друг с другом и даже вкуса конструктора. Мы будем использовать термин "устройство", оставляя другие названия для иных целей. Совокупность устройств, реализующих арифметические и логические операции, называется арифметико-логическим устройством (АЛУ).

Кроме операций над содержанием памяти, компьютер должен осуществлять также и все действия, связанные с организацией процесса преобразования информации. Возможные действия компьютера описываются системой машинных команд. Как и любая другая информация, машинная команда записывается как содержимое слова. В описании команды задаются код операции и те операнды, над которыми операция будет проводить действия. Некоторые машинные команды выполняют действия над словами, расположенными в строго определенном месте, например, в фиксированных регистрах. Такие команды не требуют явного указания операндов. Система команд всегда устроена таким образом, что выполнение каждой команды однозначно определяет следующую команду. Любой процесс преобразования информации описывается конкретной совокупностью машинных команд из числа возможных для данного компьютера. Эта совокупность называется машинным кодом или программой во внутреннем коде. Тем самым подчеркивается, что процесс описан программой на языке машинных команд, а не как-либо иначе.

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

До того как машинный код начнет исполняться, все команды и необходимые данные должны быть помещены или, как говорят, загружены в память. Это осуществляется с помощью специальных команд через так называемые устройства ввода. К ним относятся устройства считывания информации с дискеты и лазерных дисков, сканеры, клавиатура и т. п. Результаты работы компьютера выводятся из памяти также с помощью специальных команд через устройства вывода. К ним относятся устройства записи информации на дискеты и лазерные диски, графопостроители, принтеры и т. п. Сейчас существует огромное разнообразие устройств ввода/вывода (УВВ). Но независимо от их конструктивных особенностей УВВ остаются самыми медленными устройствами компьютера. Это обстоятельство вызывает много трудных проблем, когда объем входной или выходной информации оказывается очень большим.

После загрузки в память машинного кода и данных компьютер может начинать свою работу. Руководство ею осуществляет устройство управления (УУ). Оно содержит необходимые регистры, счетчики и другие элементы, обеспечивающие управление перемещением информации между памятью, АЛУ, УВВ и другими частями компьютера. УУ должно решать две противоречивые задачи. С одной стороны, УУ должно работать достаточно быстро, чтобы не задерживать процесс решения задачи. С другой стороны, УУ должно управлять самыми различными устройствами, в том числе, удаленными друг от друга и работающими одновременно. Поэтому УУ всегда устроено по ие¬иерархическому и распределенному принципу. Самый быстрый уровень — это те электронные схемы, которые расшифровывают содержание очередной команды, выделяют код операции и адреса операторов, выбирают для анализа одну или несколько последующих команд. Другой уровень УУ — это, например, схемы, управляющие выполнением операций АЛУ. Совокупность устройства управления, арифметико - логического устройства и блока наиболее быстрой памяти называется центральным процессором.

Во всех современных компьютерах реализуются два способа управления: схемный и микропрограммный. Схемный используется тогда, когда возникает необходимость очень быстрого, но относительно простого управления. Микропрограммный — в случае сложного управления. В целом УУ занимает центральное место в управлении работой компьютера. Но оно обросло многими программными и микропрограммными системами, связанными с решением частных управленческих задач. Некоторые из них очень сложны. Например, система управления файлами по существу представляет собой специализированную вычислительную машину, которая имеет свою память и связана с памятью и магнитными дисками основного компьютера. Еще более сложной является система управления графической информацией и т.п. Совокупность программных систем, обеспечивающих управление работой компьютера, принято называть операционной системой. Для всех современных компьютеров операционная система неотделима от собственно компьютера и является его программным продолжением. Один и тот же компьютер может иметь несколько операционных систем. Например, для персональных компьютеров широко распространены операционные системы MS-DOS, Windows и Unix. Каждая из них имеет свои особенности и решает свои задачи.

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

Перейдем теперь к более детальному обсуждению отдельных элементов "обыкновенного" компьютера.

Рис. 1.1. Общая схема компьютера

§ 1.2. Языки программирования и программы

Мы уже говорили о том, что компьютер способен выполнять лишь программы, написанные в машинных командах. Однако программировать в машинных командах исключительно трудно. Прежде всего, из-за того, что структура команд чаще всего совсем не похожа на структуру тех действий, которыми пользователь предполагает описывать алгоритмы решения своих задач. Если составлять программы в машинных командах, пользователю неизбежно придется моделировать какими-то последовательностями команд каждое из своих действий. Но у этого способа программирования есть одно несомненное достоинство: он позволяет создавать самые эффективные программы. Объясняется это тем, что в данном случае имеется возможность тщательным образом учитывать совместно конкретные особенности как компьютера, так и задачи.

Рядовому пользователю не приходится программировать в машинных командах. У тех же специалистов, которым требуется создавать эффективные программы, такая потребность может появиться. Например, она часто возникает у разработчиков библиотек стандартных программ широкого назначения. Чтобы в какой-то мере облегчить труд таких специалистов, им предлагается программировать в некоторой системе символьного кодирования, называемой автокодом. По существу, это система тех же машинных команд, но с более удобной символикой. Кроме этого, в автокод могут быть введены дополнительные инструкции, моделирующие простейшие и наиболее часто встречающиеся комбинации машинных команд. Конечно, на компьютере имеется компилятор, который переводит программы, написанные на автокоде, в машинный код.

Автокод — это простейший язык программирования или, как его называют иначе, язык самого низкого уровня. Широко программировали на нем только на первых компьютерах. Массовое программирование на автокоде прекратилось по следующим причинам. Как отмечалось, программирование на нем очень трудоемко. Поэтому над автокодом стали создаваться различные языковые надстройки, называемые языками высокого уровня. Основная задача этих языков заключается в облегчении процесса программирования путем замены непонятных инструкций автокода другими инструкциями, более приближенными к пользовательским. Вершиной языков высокого уровня являются проблемно-ориентированные языки. Их инструкции позволяют пользователям писать программы просто в профессиональных терминах конкретных предметных областей. На каждом компьютере автокод, как правило, один. Языков высокого уровня, особенно проблемно-ориентированных, достаточно много. Компиляторы с них стали сложными иерархическими программными системами. Обратной стороной упрощения языков программирования стало усложнение алгоритмов преобразования программ в машинный код и, как следствие, потеря программистом возможности контролировать эффективность создаваемых им программ. Это исключительно важное обстоятельство, и мы будем возвращаться к нему неоднократно, принимая во внимание нашу нацеленность на решение больших задач.

С точки зрения пользователя программировать на автокоде не только трудно, но и нецелесообразно из-за его ориентации на конкретный компьютер или, как говорят по другому, компьютерной зависимости. На разных моделях компьютеров автокоды разные. Универсального транслятора, переводящего программу из одного автокода в другой, не существует. Поэтому, переходя от одного типа компьютеров к другому, пользователю приходится переписывать заново все программы, написанные на автокоде. Этот процесс не только сверхсложный, но и крайне дорогой. Следовательно, одной из важнейших задач, стоящих перед разработчиками языков программирования высокого уровня, было создание языков, не зависящих от особенностей конкретных компьютеров. Такие языки появились в большом количестве. К ним относятся, например, Algol, Fortran, С и др. Они так и называются — машинно-независимые, что вроде бы подчеркивает их независимость от компьютеров. Еще их называют универсальными, что указывает на возможность описывать очень широкий круг алгоритмов.

Создание машинно-независимых языков программирования привело к появлению на рубеже 50—60-х годов прошлого столетия замечательной по своей красоте идеи. Традиционные описания алгоритмов в книгах нельзя без предварительного исследования перекладывать на любой компьютерный язык. Как правило, они неточны, содержат много недомолвок, допускают неоднозначность толкования и т. п. В частности, из-за предполагаемых свойств ассоциативности, коммутативности и дистрибутивности операций над числами в формулах отсутствуют многие скобки, определяющие порядок выполнения операций. Поэтому в действительности книжные описания содержат целое множество алгоритмов, на котором разброс отдельных свойств может быть очень большим. В результате, как правило, трудоемких исследований из данного множества выбирается какой-то один алгоритм, обладающий вполне приемлемыми характеристиками, и именно он программируется.

В программе любой алгоритм всегда описывается абсолютно точно. В его разработку вкладывается большой исследовательский труд. Чтобы избавить других специалистов от необходимости его повторять, надо этот труд сохранять. Программы на машинно-независимых языках высокого уровня как раз удобны для выполнения функций хранения. Идея состояла в том, чтобы на таких языках накапливать багаж хорошо отработанных алгоритмов и программ, а на каждом компьютере иметь компиляторы, переводящие программы с этих языков в машинный код. При этом вроде бы удавалось решить сразу две важные проблемы. Во-первых, сокращалось дублирование в программировании. И, во-вторых, автоматически решался вопрос о пopтабельности программ, т.е. об их переносе с компьютера одного строения на компьютер другого строения. Вопрос, который был и остается весьма актуальным, т.к. компьютеры существенно меняют свое строение довольно часто. При реализации данной идеи функции по адаптации программ к особенностям конкретных компьютеров брали на себя компиляторы. Как следствие, пользователь освобождался от необходимости знать устройство и принципы функционирования как компьютеров, так и компиляторов.

В первые годы идея развивалась и реализовывалась очень бурно. Издавались многочисленные коллекции хорошо отработанных алгоритмов и программ из самых разных прикладных областей. Был налажен широкий обмен ими, в том числе, на международном уровне. Программы действительно легко переносились с одних компьютеров на другие. Постепенно и пользователи отходили от детального изучения компьютеров и компиляторов, ограничиваясь разработкой программ на машинно-независимых языках высокого уровня. Однако радужные надежды на длительный эффект от реализации обсуждаемой идеи довольно скоро стали меркнуть.

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

Целью производства новых компьютеров является предоставление пользователям возможности решать задачи более эффективно, в первую очередь, более быстро. Поэтому, разрабатывая программы на языках высокого уровня, пользователь вправе рассчитывать на то, что время их реализации будет уменьшаться примерно так же, как растет производительность компьютеров. Кроме этого, он, конечно, предполагает, что программы на машинно-независимых языках будут действительно не зависеть от особенностей техники. Однако весь опыт развития компьютеров и связанных с ними компиляторов показывает, что в полной мере на это надеяться нельзя. Скорость реализации программ как функция производительности компьютеров оказалась на практике не линейной, а значительно более слабой, причем, чем сложнее устроен компьютер, тем она слабее. Программы на машинно-независимых языках показали зависимость от различных особенностей компьютеров. Постоянное же появление все новых и новых языков программирования без обеспечения каких-либо гарантий качества компилируемых программ лишь увеличивает сложность решения многих проблем. На практике пользователь не может серьезно влиять на разработку языковой и системной среды компьютера. Но именно он ощущает на себе все ее огрехи. Ему и приходится с ней разбираться, хотя это совсем не его цель. Его цель — решать задачу.

Возникла странная ситуация. Пользователь самым прямым образом заинтересован в эффективности решения своих задач на компьютере. Для повышения эффективности он прилагает огромные усилия: меняет математические модели, разрабатывает новые численные методы, многократно переписывает программы и т.п. Но пользователь видит компьютер только через программное окружение, в первую очередь, через компилятор и операционную систему. Создавая и исполняя машинные коды, эти компоненты сильно влияют на эффективность реализации пользовательских программ. Однако с их помощью либо трудно, либо просто невозможно понять, где находятся узкие места созданного машинного кода и что необходимо изменить в конкретной программе на языке высокого уровня, чтобы повысить ее эффективность. Действительная информация, которую можно получить от компилятора и операционной системы после реализации программы, чаще всего оказывается настолько скудной и трудно воспринимаемой, что ею редко удается воспользоваться при выборе путей модернизации как самой программы, так и реализуемых ею алгоритмов.

Для пользователя вопрос взаимодействия с компьютером с целью поиска путей создания наиболее эффективных программ является очень актуальным. Но его решение почти полностью переложено на плечи самого пользователя. Штатное программное окружение компьютера не содержит никаких отладчиков, систем анализа структуры программ и т. п. Из описаний компилятора практически невозможно найти даже такую необходимую информацию, как эффективность работы в машинном коде отдельных, наиболее значимых конструкций языка высокого уровня. Есть много оснований упрекнуть создателей языков, компиляторов и операционных систем в недостаточном внимании к интересам разработчиков алгоритмов и программ. В таком упреке есть доля истины, т.к. интересы пользователей действительно затерялись среди многих других интересов системных программистов и перестали быть доминирующими. Однако надо также признать, что проблемы пользователей оказались совсем непростыми.

Одной из важнейших характеристик вычислительных процессов является точность получаемых результатов. Уже давно известно, что кроме общего описания процессов, на нее влияют форма представления чисел и способ выполнения операции округления. Эти факторы машинно-зависимые. Информация о них не воспринимается языками высокого уровня. Поэтому, строго говоря, такие языки даже по одной этой причине нельзя считать машинно-независимыми, т. к. на разных компьютерах могут допускаться разные представления чисел и разные способы выполнения округлений. В конечном счете, это может приводить, и на практике приводит, к достаточно большому разбросу результатов реализаций одной и той же программы. Но тогда возникают многочисленные вопросы: "Какой смысл надо вкладывать в понятие машинно-независимый язык? Как разрабатывать алгоритмы и писать программы, чтобы хотя бы с какими-то оговорками их можно было рассматривать как машинно-независимые? Как трактовать результаты реализации программы с точки зрения точности?" И т.п.

Были предприняты значительные усилия, чтобы получить ответы на все эти вопросы. Унифицированы формы представления чисел. Разработаны стандарты на выполнение операции округления. Для многих алгоритмов получены оценки влияния ошибок округления. В целом же успехи невелики. Возможно, что главным достижением предпринятых усилий является осознание того, что при разработке численного программного обеспечения вопросы влияния ошибок округления нельзя игнорировать. Какое-то время казалось, что проблема точности является единственной принципиальной трудностью, связанной с реализацией алгоритмов на компьютерах разных типов. И хотя на легкое решение этой проблемы нельзя было рассчитывать, тем не менее, обозначились определенные перспективы. Постепенно как будто стала формироваться уверенность, что все же удастся создать на алгоритмических языках эффективное машинно-независимое численное программное обеспечение и, следовательно, довести до практического решения проблему портабельности программ.

Действительность пошатнула и эту уверенность. Было выяснено, что на множестве программ, эквивалентных с точки зрения пользователя по точности, числу арифметических операций и другим интересным для него характеристикам, разброс реальных времен реализации различных вариантов на конкретном компьютере остается очень большим. Причем не только для сложных программ, но и для самых простых. Например, программы решения систем линейных алгебраических уравнений с невырожденной треугольной матрицей, написанные на языке высокого уровня, могут давать существенно различные времена реализации просто в зависимости от того, осуществляются ли в них внутренние суммирования по возрастанию индексов или по их убыванию. Это означает, что пользователь принципиально не может выбрать заранее тот вариант программы на языке высокого уровня, который будет одинаково эффективен на разных компьютерах. Принципиально не может хотя бы потому, что такой вариант, скорее всего, не существует. Но это означает также, что языки программирования высокого уровня можно и по этой причине считать машинно-независимыми лишь условно.

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

До тех пор пока такая возможность не будет реализована полностью, пользователям придется многократно переписывать свои программы в поисках оптимального варианта. Для уменьшения числа переписываний применяются различные приемы. Например, в программах выделяются вычислительные ядра, т. е. участки, на которые приходится основной объем вычислений. Эти ядра пишутся на автокоде. При переходе к новому компьютеру переписываются только они. Тем самым обеспечивается высокая эффективность программ. По такому принципу организованы такие популярные пакеты для решения задач линейной алгебры, как EISPACK, UNPACK, SCALAPACK и др. Вычислительные ядра в них организованы в специальную библиотеку программ BLAS, которая написана на автокоде и переписывается каждый раз при переходе к новому компьютеру. Как показал опыт, этот прием довольно дорогой и не всегда применим, особенно при создании больших программных комплексов. К тому же, как выяснилось, при переходе к компьютерам с принципиально иной архитектурой приходится переписывать не только вычислительные ядра, но и их оболочку.

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

Глава 2

Как повышают производительность компьютеров

Замечено, что эмоциональное состояние человека, впервые сталкивающегося с суперкомпьютером, проходит несколько стадий. Сначала он испытывает что-то вроде эйфории, начитавшись рекламных данных о компьютере и находясь в предвкушении быстрого разрешения всех своих вычислительных проблем. После первого запуска своей программы у него возникает недоумение и подозрение, что что-то он сделал не так, поскольку реально достигнутая производительность слишком сильно отличается от ожидаемой. Он запускает программу повторно, но результат, если и меняется в лучшую сторону, то очень и очень слабо. Он идет к местному компьютерному гуру, и тут-то его поджидает настоящий удар. Сначала ему говорят, что полученные им 5% от пиковой производительности компьютера являются не таким уж и плохим результатом. А затем добавляют, что если он хочет "выжать" из такой вычислительной системы максимум, то для него вся работа только начинается. Нужно обойти возможные конфликты в памяти и постараться сбалансировать вычислительную нагрузку между процессорами. Необходимо подумать об оптимальном распределении данных, помочь компилятору разобраться со структурой программы, заменить последовательные части алгоритма на параллельные. Надо сделать еще много чего, что, вообще-то говоря, раньше совершенно не было свойственно работе прикладного программиста. И все прежние проблемы, характерные для последовательных компьютеров и традиционного последовательного программирования, разумеется, остаются...

Эту ситуацию заметили давно и предлагали различные способы ее решения. Изменялась архитектура компьютеров, развивалась среда программирования, но оставалось постоянным одно — "головная боль" прикладных программистов, решивших серьезно встать на путь параллельных вычислений. Оговоримся сразу, мы далеки от мысли кого-либо обвинять в такой ситуации. Инженерами и программистами проделана колоссальная работа, без которой и предмет нашего обсуждения не существовал бы. Просто область сложна сама по себе, да и жизнь постоянно вносит свои коррективы. Создавая кэш-память, которая прекрасно работает в одном микропроцессоре, никто и не подозревал, какие проблемы она принесет в многопроцессорных системах. Только научились анализировать структуру исходного текста программ на Fortran, как появились языки С и С++, привнесшие значительные трудности в статический анализ параллельной структуры программ. Чуть ли не единственным достижением, постоянное развитие которого никак не задевает программиста, является увеличение тактовой частоты: программа работает быстрее, а он для этого ничего дополнительного не делает.

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

§ 2.1.Усложнение и наращивание аппаратных средств

Бесспорно, успехи микроэлектроники впечатляют. Согласно закону Мура, не имеющего строгого доказательства, но подтверждающегося уже не один десяток лет, производительность "обычных" компьютеров удваивается каждые полтора года. Однако попытаемся разобраться, только ли этими причинами определяются те рекордные показатели производительности, которыми обладают современные компьютеры. Обратимся к известным историческим фактам и проведем простое сравнение (рис. 2.1). На одном из первых компьютеров мира — EDSAC, появившемся в 1949 году и имевшем время такта 2 микросекунды, можно было выполнить 2n арифметических операций за 18n миллисекунд, т. е. в среднем 100 арифметических операций в секунду. Сравним эти данные, например, с характеристиками одного вычислительного узла современного суперкомпьютера Hewlett-Packard Superdome: время такта приблизительно 1,3 нc (процессор РА-8700, 750 МГц), а пиковая производительность около 192 миллиардов арифметических операций в секунду.

 

Рис. 2.1. Увеличение производительности ЭВМ – за счет чего?

Что же получается? За полвека производительность компьютеров выросла почти в два миллиарда раз. При этом выигрыш в быстродействии, связанный с уменьшением времени такта с 2 мкс до 1,3 нc, составляет лишь около 1500 раз. С этой цифрой естественно связать развитие микроэлектроники (что верно, конечно же, лишь в некотором приближении). Откуда же взялось остальное? Ответ достаточно очевиден — использование новых решений в архитектуре компьютеров, и среди них далеко не последнее место занимает принцип параллельной обработки данных, воплощающий идею одновременного выполнения нескольких действий.

Удивительно, но несмотря на все многообразие форм проявления параллелизма в архитектуре компьютеров, на обилие сопутствующих проблем, существует лишь два способа параллельной обработки данных: собственно параллелизм и конвейерность. Более того, оба способа интуитивно понятны, и нам необходимо сделать лишь небольшие пояснения.

Параллельная обработка

Предположим, что нам нужно найти сумму двух векторов, состоящих из 100 вещественных чисел каждый. В нашем распоряжении есть устройство, которое выполняет суммирование пары чисел за пять тактов работы компьютера. Устройство сделано так, что на все время выполнения данной операции оно блокируется, и никакой другой полезной работы выполнять не может. В тaких условиях вся операция будет выполнена за 500 тактов. Развитие процесса обработки во времени схематично изображено на рис. 2.2.

Теперь допустим, что у нас есть два точно таких же устройства, которые могут работать одновременно и независимо друг от друга. Для простоты будем рассматривать идеальную ситуацию, когда нет никаких дополнительных накладных расходов, связанных с получением устройствами входных данных и сохранением результатов. Постоянно загружая каждое устройство элементами входных массивов, можно получить искомую сумму уже за 250 тактов (рис. 2.3) — ускорение выполнения работы в два раза. В случае 10 подобных устройств время получения результата составит всего 50 тактов, а в общем случае система из N устройств затратит на суммирование время около 500/N.

Очень много примеров параллельной обработки можно найти и в нашей повседневной жизни: множество кассовых аппаратов в супермаркете, многополосное движение по оживленным автотрассам, бригада землекопов, несколько бензиновых колонок на автозаправочных станциях и т. п. Кстати, одним из пионеров в параллельной обработке был академик А. А. Самарский, выполнявший в начале 50-х годов прошлого столетия расчеты, необходимые для моделирования ядерных взрывов. Александр Андреевич решил эту задачу, посадив несколько десятков барышень с арифмометрами за столы. Барышни передавали данные друг другу просто на словах и откладывали необходимые цифры на арифмометрах. С помощью вот такой "параллельной вычислительной системы", в частности, была рассчитана эволюция взрывной волны.

Рис. 2.2. Суммирование векторов С = А + В с помощью последовательного устройства, выполняющего одну операцию за пять тактов

Рис. 2.3. Суммирование векторов С = А + В с помощью двух одинаковых последовательных устройств, выполняющих операцию за пять тактов каждое

Конвейерная обработка

В предыдущем примере для выполнения одной операции сложения устройство блокировалось на пять тактов и никакой другой работы не выполняло. Оправдано ли это и можно ли организовать процесс обработки всех элементов входных массивов более эффективно? Для ответа на этот вопрос нужно вспомнить материал из предыдущей главы — представление вещественных чисел в компьютере. Сложение каждой пары чисел выполняется в виде последовательности микроопераций, таких как сравнение порядков, выравнивание порядков, сложение мантисс, нормализация и т. п. И что примечательно: в процессе обработки каждой пары входных данных микрооперации задействуются только один раз и всегда в одном и том же порядке: одна за другой. Это, в частности, означает, что если первая микрооперация выполнила свою работу и передала результаты второй, то для обработки текущей пары она больше не понадобится, и значит, она вполне может начинать обработку следующей ждущей на входе устройства пары аргументов.

Исходя их этих рассуждений, сконструируем устройство следующим образом. Каждую микрооперацию выделим в отдельную часть устройства и расположим их в порядке выполнения. В первый момент времени входные данные поступают для обработки первой частью. После выполнения первой микрооперации первая часть передает результаты свой работы второй части, а сама берет новую пару. Когда входные аргументы пройдут через все этапы обработки, на выходе устройства появится результат выполнения операции.

Такой способ организации вычислений и носит название конвейерной обработки. Каждая часть устройства называется ступенью конвейера, а общее число ступеней — длиной конвейера. Предположим, что для выполнения операции сложения вещественных чисел спроектировано конвейерное устройство, состоящее из пяти ступеней, срабатывающих за один такт каждая. Время выполнения одной операции конвейерным устройством равно сумме времен срабатывания всех ступеней конвейера. Это значит, что одна операция сложения двух чисел выполнится за пять тактов, т. е. за столько же времени, за сколько такая же операция выполнялась и на последовательном устройстве в предыдущем случае.

Теперь рассмотрим процесс сложения двух массивов (рис. 2.4). Как и прежде, через пять тактов будет получен результат сложения первой пары. Но заметим, что одновременно с первой парой прошли частичную обработку и другие элементы. Каждый последующий такт (!) на выходе конвейерного устройства будет появляться сумма очередных элементов. На выполнение всей операции потребуется 104 такта, вместо 500 тактов при использовании последовательного устройства — выигрыш во времени почти в пять раз.

Приблизительно так же будет и в общем случае. Если конвейерное устройство содержит l ступеней, а каждая ступень срабатывает за одну единицу времени, то время обработки n независимых операций этим устройством составит l + n - 1 единиц. Если это же устройство использовать в монопольном режиме (как последовательное), то время обработки будет равно lхn. В результате для больших значений n получили ускорение почти в l раз за счет использования конвейерной обработки данных.

Рис.2.4. Суммирование векторов С=А+В с помощью конвейерного устройства. Каждая из пяти ступеней конвейера срабатывает за один такт

Заметим, что использование эпитетов "скалярный", "векторный" и "конвейерный" часто вызывает путаницу, поскольку многие из них применимы к близким по смыслу понятиям "обработка", "команда" и "устройство". Команда, у которой все аргументы должны быть только скалярными величинами, называется скалярной командой. Если хотя бы один аргумент команды может быть вектором, то такая команда называется векторной командой. Например, в системе команд компьютера Cray С90 есть скалярная команда Ascal сложения двух вещественных чисел S1 и S2 с занесением результата в S3. Ascal S1,    S2→ S3. Одновременно со скалярной командой предусмотрена и команда Avect для сложения двух векторов с занесением результата в третий: Avect V1, V2→ V3. В зависимости от кода поступившей команды (Ascal или Avect) процессор интерпретирует операнды либо как адреса скаляров, либо как адреса начала векторов.

Различие между скалярными и конвейерными устройствами мы уже обсудили чуть выше. Иногда в архитектуру процессора включают векторные устройства, ориентированные только на обработку векторов данных. В частности, в компьютере Cray С90 есть и конвейерное устройство UAscal int, выполняющее только скалярные команды АIsса1 сложения целых чисел, и векторное устройство UAvect int  (также конвейерное), предназначенное для выполнения только векторных команд целочисленного сложения AIvect. Кстати, в отличие от целочисленных команд АIsсаl и AIvect, обсуждавшиеся ранее команды сложения вещественных чисел Ascal и Avect в этом компьютере выполняются на одном и том же устройстве UAreal.

Как и прежде, будем считать, что конвейерное устройство состоит из l ступеней, срабатывающих за один такт. Два вектора из n элементов можно либо сложить одной векторной командой, либо выполнить подряд n скалярных команд сложения элементов этих векторов. Если n скалярных команд одна за другой исполняются на таком устройстве, то, согласно общему закону, они будут обработаны за l + n — 1 тактов. Вместе с тем, на практике выдержать ритм, определяемый этой формулой, довольно сложно: каждый такт нужно обеспечивать новые входные данные, сохранять результат, проверять необходимость повторной итерации, быть может увеличивать значения индексов и т. д. и т. п. В итоге, необходимость выполнения множества вспомогательных операций приводит к тому, что становится невозможным каждый такт подавать входные данные на вход конвейерного устройства. В конвейере появляются "пузыри", а значит, на выходе уже не каждый такт появляются результаты, и эффективность работы устройства снижается.

При использовании векторных команд в формуле добавляется еще одно слагаемое: σ + l + n — 1, где σ — это время, необходимое для инициализации векторной команды. Исполнение векторной команды не требует практически никаких вспомогательных действий, кроме момента ее инициализации или поддержки сегментации (см. §3.2). Однако присутствие σ определяет тот факт, что для небольших значений n соответствующие векторные команды выгоднее исполнять не в векторном, а в обычном скалярном режиме.

Поскольку ни σ, ни l не зависят от значения n, то с увеличением длины входных векторов эффективность конвейерной обработки возрастает. Если под эффективностью обработки понимать реальную производительность Е конвейерного устройства, равную отношению числа выполненных операций n к времени их выполнения t, то зависимость производительности от длины входных векторов определяется следующим соотношением:

где τ — это время такта работы компьютера.

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

Рис. 2.5. Зависимость производительности конвейерного устройства от длины входного набора данных

Сегодня параллелизмом в архитектуре компьютеров уже мало кого удивишь. Все современные микропроцессоры, будь то ALPHA 21264, Itanium, РА-8700 или Power 4, используют тот или иной вид параллельной обработки, реализованный в миниатюрных рамках одного кристалла. Вместе с тем, сами эти идеи появились очень давно. Изначально они внедрялись в самых передовых, а потому единичных, компьютерах своего времени. Затем после должной отработки технологии и удешевления производства они начинали использоваться в компьютерах среднего класса, и, наконец, сегодня все это в полном объеме воплощается в рабочих станциях и персональных компьютерах.

Для того чтобы убедиться, что все основные нововведения в архитектуре современных вычислительных систем используются еще со времен, когда ни микропроцессоров, ни понятия суперкомпьютеров еще не было, совершим маленький экскурс в историю, начав практически с момента рождения первых ЭВМ.

Первые компьютеры (EDSAC, EDVAC, UNIVAC, конец 40-х — начало 50-х годов XX столетия) для реализации принципа хранимой программы использовали ртутные линии задержки. При таком способе организации памяти разряды слова поступали для последующей обработки последовательно один за другим. Вполне естественно, что точно так же поразрядно выполнялись и арифметические операции, поэтому для сложения двух 32-разрядных чисел требовалось около 32 машинных тактов. Время разрядно-последовательной памяти и разрядно-последовательной арифметики в истории вычислительной техники.

С изобретением запоминающих устройств с произвольной выборкой данных стала реализуемой как разрядно-параллельная память, так и разрядно-параллельная арифметика. Все разряды слова одновременно считываются из памяти и участвуют в выполнении операции арифметико-логическим устройством. В 1953 году появилась машина IBM 701 — первая коммерческая ЭВМ, построенная на таком принципе. Однако наиболее удачной машиной этого класса стала выпущенная в 1955 году ЭВМ IBM 704, в которой была впервые применена память на ферритовых сердечниках и аппаратное АУ с плавающей точкой. Удивительный по тем временам коммерческий успех IBM 704 определялся продажей 150 (!) экземпляров этой машины.

Как в машине IBM 704, так и в других компьютерах того времени, все операции ввода/вывода осуществлялись через арифметико-логическое устройство. Внешних устройств было немного, но самое быстрое из них — ленто-протяжное устройство, работало со скоростью около 15 000 символов в секунду, что было во много раз меньше скорости обработки данных процессором. Подобная организация вычислительных машин вела к существенному снижению производительности во время ввода и вывода информации. Одним из первых решений этой проблемы стало введение специализированной ЭВМ, называемой каналом ввода/вывода, которая позволяла АЛУ работать параллельно с устройствами ввода/вывода. В 1958 году к машине IBM 704 добавили шесть каналов ввода/вывода, что явилось основой для построения ЭВМ IBM 709.

Очень скоро стало понятно, что значительное повышение производительности компьютеров следует ожидать от использования принципов параллельной обработки данных в архитектуре компьютеров. В этом смысле исключительно интересным было выступление академика С. А. Лебедева на сессии Академии наук СССР в 1957 году [33], в котором он высказал массу идей, актуальных и сейчас: "Выполнение арифметических действий в значительной мере может быть совмещено по времени с обращением к памяти. При этом можно отказаться от стандартного цикла выполнения операций, когда вызов следующей команды производится после отсылки результата в запоминающее устройство, и производить выборку команд перед отсылкой результатов в запоминающее устройство...

Возможное ускорение работы машины за счет совмещения вызова команд и чисел по двум независимым каналам также может дать сокращение времени...

Помимо быстродействия арифметического устройства, существенным фактором, определяющим скорость работы машин, является время обращения к запоминающему устройству. Одним из решений уменьшения времени обращения к запоминающему устройству является создание дополнительной «сверхбыстродействующей памяти» сравнительно небольшой емкости. Создание такой «памяти» позволит сократить время для выполнения стандартных вычислений...

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

Одним из возможных путей для решения таких задач может явиться параллельная работа нескольких машин, объединенных одним общим дополнительным устройством управления и с обеспечением возможности передачи кодов чисел с одной машины на другую. Однако может оказаться более целесообразным создание ряда параллельно работающих отдельных устройств машины. В такой машине должна иметься общая основная «память» для хранения чисел и команд, необходимых для решения задачи. Из этой «памяти» числа и команды, требующиеся для решения того или иного этапа задачи, поступают на ряд сверхбыстродействующих запоминающих устройств сравнительно небольшой емкости. Каждое такое сверхбыстродействующее запоминающее устройство связано со своим арифметическим устройством. Эти устройства имеют свое индивидуальное управление. Помимо этого, должно быть предусмотрено общее управление всей машиной в целом.

Для более полного использования арифметических устройств требуется, чтобы заполнение «сверхбыстродействующей памяти» из общей «памяти» машины осуществлялось одновременно с выполнением вычислений".

Знакомые идеи, не правда ли? Это удивительно, но факт — идеи, высказанные более 40 лет назад на заре развития вычислительной техники, находят свое активное воплощение в жизнь и сейчас.

Одной из первых машин, воплотивших идею повышения производительности за счет совмещения во времени различных этапов выполнения соседних команд, была система IBM STRETCH. Первый из семи построенных компьютеров этой серии был установлен в Лос-Аламосской национальной лаборатории США в 1961 году. Архитектура системы имела две принципиально важных особенности. Первая особенность — это опережающий просмотр для считывания, декодирования, вычисления адресов, а также предварительная выборка операндов нескольких команд.

Вторая особенность заключалась в разбиении памяти на два независимых банка, способных передавать данные в АЛУ независимо друг от друга (то есть опять-таки идеи параллелизма). Эта особенность, получившая название расслоение памяти, была позднее использована почти во всех больших вычислительных системах. Основная задача, решаемая в данном случае разработчиками компьютеров, состоит в согласовании скорости работы АЛУ и памяти. Это делается за счет разделения всей памяти на к независимых банков (иногда их называют секциями), что позволяет совместить во времени различные обращения к памяти. Одновременно вводится чередование адресов, при котором любые к подряд расположенных ячеек памяти с адресами A0, A0 + 1, A0 + (k — 1) попадают в разные банки. При такой организации работа с подряд расположенными данными проходит максимально эффективно. На практике этот режим отвечает последовательной обработке элементов векторов или работе со строками/столбцами многомерных массивов (выбор между строками и столбцами определяется способом хранения многомерных массивов в каждом конкретном языке программирования, в частности, для двумерных массивов для языка Fortran — это столбцы, а для языка С — строки). Чаще всего число банков равно степени двойки: k = 2m. В этом случае номер необходимого банка просто равен числу, записанному в m младших разрядах адреса.

Одновременно с проектом IBM STRETCH в 1956 году начался и другой известный проект, завершившийся запуском в 1962 году первого компьютера ATLAS. Наверняка, многие слышали о данном проекте, поскольку ATLAS по праву считается значительной вехой в истории развития вычислительной техники. Достаточно сказать, что в нем впервые была реализована мультипрограммная операционная система, основанная на виртуальной памяти и системе прерываний. Для нас же этот компьютер интересен, прежде всего, тем, что в нем впервые начали использовать конвейерный принцип обработки команд. Цикл обработки команды разбили на четыре ступени: выборка команды, вычисление адреса операнда, выборка операнда и выполнение операции. Это позволяло, в благоприятной ситуации, сократить среднее время выполнения команды с 6 до 1,6 мкс и увеличить производительность компьютера до 200 тысяч вещественных операций в секунду.

В 1964 году компания Control Data Corporation выпускает компьютер CDC-6600. Генеральным конструктором компьютера, а на то время и вице-президентом компании, был С. Крэй (Seymour Cray), создавший впоследствии множество уникальных суперкомпьютеров. Центральный процессор CDC-6600 содержал десять независимых функциональных устройств — параллелизм в явном виде. Все функциональные устройства могли работать одновременно друг с другом и являлись специализированными (устройства сложения с плавающей и фиксированной запятой (по одному), умножения (два устройства), деления, логических операций, сдвига и т. п.). Чтобы лучше почувствовать возможности суперкомпьютера того времени, приведем некоторые характеристики CDC-6600: время такта 100 нc, память разбита на 32 банка по 4096 60-разрядных слов, средняя производительность 2—3 млн. операций в секунду.

В 1969 году Control Data Corporation выпускает компьютер CDC-7600 — усовершенствованный вариант модели CDC-6600. Центральный процессор нового компьютера содержит восемь независимых конвейерных функциональных устройств — одновременное использование и параллелизма, и конвейерности.

В отличие от предшественника, в CDC-7600 реализована двухуровневая память: вычислительная секция в обычном режиме работает со "сверхоперативной" памятью (64К 60-разрядных слов), куда при необходимости подкачиваются данные из основной памяти (512К 60-разрядных слов). Время такта CDC-7600 равно 27,5 нc, средняя производительность 10—15 млн. операций в секунду.

Следующей важной вехой в развитии идей параллельной обработки данных, безусловно, явилось создание компьютера ILLIAC IV. Матрица синхронно работающих процессоров — ключевая идея данного проекта. Архитектура компьютера ILLIAC IV базировалась на концепции системы SOLOMON, описанной еще в 1962 году [61]. По начальному проекту основу ILLIAC IV составляла матрица из 256 процессорных элементов, сгруппированных в четыре квадранта по 64 элемента в каждом (рис. 2.6). Планировалось, что вся система будет работать под общим управлением, однако в каждом квадранте находилось собственное устройство управления, выдающее команды для синхронно работающих процессорных элементов своего квадранта. Была предусмотрена возможность объединять два квадранта в один из 128 процессорных элементов или же рассматривать все четыре квадранта как единую матрицу 16x16. Время такта компьютера по проекту равнялось 40 нc, а запланированная пиковая производительность 1 миллиард вещественных операций в секунду — фантастический по своим масштабам и сложности проект!

Рис.2.6. Проект матричной системы ILLIAC IV

 

Однако чудеса в жизни редко случаются... Проект компьютера ILLIAC IV слишком опередил свое время, что и предопределило постоянные задержки и корректировки планов. Работа над системой началась в 1967 году. В 1972 году изготовили один квадрант из 64 процессорных элементов, который был установлен в научно-исследовательском центре NASA Ames (США). Наладка системы длилась до 1974 года, после чего ее сдали в эксплуатацию, но работы по доводке продолжались до 1975 года. В реальном использовании система находилась до 1982 года, после чего этот единственный изготовленный экземпляр нашел свое последнее пристанище в музее. Рассмотрим немного подробнее устройство компьютера.

Центральная часть компьютера состоит из устройства управления и матрицы из 64-х независимых идентичных процессорных элементов. Роль устройства управления выполняет простая вычислительная система небольшой производительности. Устройство управления выдает поток команд, синхронно исполняемый процессорными элементами. Каждый процессорный элемент — это арифметико-логическое устройство с собственной памятью объемом 2048 64-разрядных слов. Все процессорные элементы имели доступ только к своей локальной памяти. Для обмена данными в ходе выполнения программы каждый процессорный элемент мог использовать непосредственную связь с четырьмя соседями по схеме двумерного тора со сдвигом на единицу по вертикали (рис. 2.7).

Рис.2.7. Процессорная матрица компьютера ILLIAС IV

Все процессорные элементы матрицы в каждый момент времени синхронно исполняют одну и ту же команду, выдаваемую устройством управления. Вместе с тем, с помощью битовой маски или специальных команд любой процессорный элемент можно перевести в пассивное состояние, запрещая выполнение поступающих команд.

Интересно, что помимо работы с 64-разрядными числами, процессорные элементы могут интерпретировать и обрабатывать данные уменьшенного формата, например, одно слово как два 32-разрядных числа или восемь однобайтовых. Этот дополнительный внутренний параллелизм позволяет обрабатывать 8-разрядные целочисленные данные со скоростью до 10 миллиардов байтовых операций в секунду.

Что же получилось в результате? Планировали матрицу из четырех квадрантов и 256 процессорных элементов, а сделали только один, проектное время такта по технологическим соображениям пришлось увеличить до 80 нc, стоимость изготовления четвертой части системы оказалась в четыре раза выше, чем предусматривалось сначала, а ее реальная производительность достигала лишь 50 млн. вещественных операций в секунду. Полное фиаско? Ни в коей мере. Данный проект оказал огромное влияние как на архитектуру последующих поколений компьютеров, так и на развитие многих компонентов программного обеспечения параллельных вычислительных систем. Отработанные в рамках проекта технологии были использованы при создании систем РЕРЕ, BSP, ICL DAP и многих других. Идеи, заложенные в распараллеливающие компиляторы с языка Fortran, в частности, в IVTRAN, послужили основой для создания целого семейства компиляторов и разного рода программных анализаторов для появившихся позже параллельных компьютеров и супер-ЭВМ.

Идея включения векторных операций в систему команд компьютеров давно привлекала исследователей. Во-первых, использование векторных операций позволяет намного проще записать многие вычислительные фрагменты в терминах машинных команд. Если нужно сложить два вектора С = А + В, то отпадает необходимость в таких вспомогательных командах, как увеличение индекса, проверка условия выхода из цикла, перехода на начало тела цикла и многих других — достаточно воспользоваться соответствующей векторной командой. Код становится компактней, а эффективность соответствующих фрагментов, как правило, намного выше традиционных вариантов. Во-вторых, и это не менее важно, многие алгоритмы можно выразить в терминах векторных операций. И, наконец, в-третьих, подобные операции позволяют добиться максимального эффекта от использования конвейерных устройств.

Примеров успешных проектов вычислительных систем с использованием векторных команд немало. Одним из первых примеров явилась отечественная разработка компьютера Стрела, имеющего в системе команд "групповые операции". Более поздние варианты, появившиеся в конце 60-х годов прошлого века, это вычислительные системы ASC производства компании Texas Instruments и STAR 100 компании Control Data Corporation. Однако "классикой жанра", несомненно, является линия векторно-конвейерных суперкомпьютеров Cray.

В 1972 г. С. Крэй, вице-президент и генеральный конструктор многих машин, покидает компанию Control Data Corporation и основывает новую компанию Cray Research, которая в 1976 г. выпускает свой первый векторно-конвейерный компьютер Сгау-1. Отличительными особенностями архитектуры данного компьютера являются векторные команды, независимые конвейерные функциональные устройства и развитая регистровая структура. Конвейерность и независимость функциональных устройств определили высокую теоретическую производительность компьютера (две операции за такт), векторные команды упростили путь к высокой производительности на практике (эффективная загрузка конвейеров), а работа функциональных устройств с регистрами сделала высокую производительность возможной даже при небольшом числе операций (исключительно малая латентность при запуске векторных команд).

Общие характеристики Сгау-1: время такта 12,5 нc, 12 конвейерных функциональных устройств, причем все функциональные устройства могут работать одновременно и независимо друг от друга, оперативная память до 1 Мслова, пиковая производительность компьютера 160 млн. операций в секунду. В главе 3 мы будем детально разбирать архитектуру и особенности программирования векторно-конвейерного компьютера Cray С90, имеющего с Сгау-1 много общего в архитектуре, но появившегося на пятнадцать лет позже.

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

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

Основной конструкцией в языках программирования, определяющей как локальность вычислений, так и локальность использования данных, являются циклы. В идеале, все тело цикла лучше поместить в более быструю память, поскольку на следующей итерации, скорее всего, нужно будет выполнить те же самые команды. Похожая ситуация и с данными: все то, что используется часто, лучше хранить на регистрах, у которых времена чтения/записи всегда согласованы со скоростью работы процессора. Однако удовольствие это очень дорогое и сколько-нибудь значительные объемы данных на регистрах держать невозможно. В такой ситуации будет использоваться следующий уровень в иерархии памяти, например, кэш-память. Если объема кэш-памяти не хватит, то можно задействовать следующий уровень и т. д. Аналогий этому факту очень много в повседневной жизни. Все самое необходимое мастер всегда держит под рукой на рабочем столе (регистры), часто используемые предметы хранятся здесь же в ящиках стола (кэш-память), основной набор инструментов лежит в шкафу недалеко от стола (основная память), за чем-то приходится иногда спускаться на склад (дисковая память), а что-то время от времени приходится заказывать даже из другой мастерской (архив на магнитной ленте).

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

Эффективность использования иерархии памяти подметили давно. Так, даже в описанном выше компьютере ILLIAC IV уже можно выделить, по крайней мере, четыре уровня. Каждый процессорный элемент имел по 6 программно адресуемых регистров и собственную локальную оперативную память на 2048 слов. Для хранения данных использовались два жестких диска на 1 Гбит каждый, а для долговременного хранения предназначалась лазерная память с однократной записью емкостью в 1012 бит (луч аргонового лазера выжигал отверстия в тонкой металлической пленке, укрепленной на барабане).

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

Глава 3

Архитектура параллельных

вычислительных систем

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

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

Параллельный компьютер стоит в конце всей цепочки, и поэтому его влияние прослеживается везде. Чем аккуратнее мы проходим каждый этап, чем больше структура программы соответствует особенностями архитектуры компьютера, тем выше его производительность и тем ближе она к его пиковым показателям. Все понимают, что достичь пиковой производительности невозможно. Этот показатель в сравнении с реальной производительностью скорее играет роль ориентира, показывая, насколько полно использованы возможности компьютера при выполнении той или иной реальной программы. Однако пик производительности вычисляется для случая, когда все работает с максимальной загрузкой, без конфликтов и ожиданий, т. е. в идеальных условиях. В реальности же все не так. Не так сложно построить компьютер с рекордными показателями пиковой производительности. Гораздо труднее предложить эффективный способ его использования, поскольку здесь уже нужно учитывать все предыдущие этапы в указанной выше цепочке.

Параллельные вычислительные системы развиваются очень быстро. С появлением вычислительных кластеров параллельные вычисления стали доступны многим. Если раньше параллельные компьютеры стояли в больших центрах, то сейчас кластер может собрать и поддерживать небольшая лаборатория. Стоимость кластерных решений значительно ниже стоимости традиционных суперкомпьютеров. Для их построения, как правило, используются массовые процессоры, стандартные сетевые технологии и свободно распространяемое программное обеспечение. Если есть желание, минимум средств и знаний, то принципиальных препятствий для построения собственной параллельной системы нет.

Интернет. Уникальное явление нашего времени. В рамках единой сети объединены миллионы компьютеров. А что, если их использовать для решения одной задачи? Это будет самый мощный параллельный компьютер в мире, намного превосходящий по пиковой производительности все компьютеры из списка Тор500, вместе взятые. Со временем Интернет дойдет до каждой квартиры, предоставляя всем выход в глобальную сеть. И в глобальную вычислительную сеть. Если вам нужно будет что-то посчитать, то вы подключаетесь к сети, даете задание и получаете результат. При этом совершенно не важно, где именно ваше задание было обработано. Отсюда и рождаются идеи построения метакомпьютера, включающего в себя многочисленные вычислительные ресурсы по всему миру.

Красивых идей при построении параллельных вычислительных систем очень много. В состав компьютеров входит все больше и больше всевозможных вычислительных узлов. Порой конструкторам приходится разрабатывать уникальные решения, чтобы все это множество устройств заставить согласованно работать вместе. Это правильно, на этом держится прогресс вычислительной техники. Не нужно только забывать главного. Погоня за внутренней согласованностью не должна становиться самоцелью. Любой параллельный компьютер является инструментом для решения реальных задач. В конечном счете, с этой точки зрения и нужно все оценивать. Если внутренняя согласованность в компьютере достигается во имя эффективного решения задач, то это оправдано. Если нет, то сразу возникает масса вопросов.

А что же мы имеем на практике? Об этом и рассказывает данная глава книги.

§ 3.1. Классификация параллельных

компьютеров и систем

Уже по первым параграфам данной книги становится ясно, насколько много существует различных способов организации параллельных вычислительных систем. Здесь можно назвать векторно-конвейерные компьютеры, массивно-параллельные и матричные системы, компьютеры с широким командным словом, спецпроцессоры, кластеры, компьютеры с многопоточной архитектурой и т. п. В этот же список входят и те архитектуры, которые мы еще не обсуждали, например, систолические массивы или dataflow-компьютеры. Если же к подобным названиям для полноты описания добавить и сведения о таких важных параметрах, как организация памяти, топология связи между процессорами, синхронность работы отдельных устройств или способ исполнения операций, то число различных архитектур станет и вовсе необозримым.

Почему параллельных архитектур так много? Как они взаимосвязаны между собой? Какие основные факторы характеризуют каждую архитектуру? Поиск ответа на такие вопросы так или иначе приводит к необходимости классификации архитектур вычислительных систем [23]. Активные попытки в этом направлении начались после опубликования М. Флинном в конце 60-х годов прошлого столетия первого варианта классификации, который, кстати, используется и в настоящее время.

Вообще говоря, при введении классификации можно преследовать самые разные цели. С точки зрения главного инженера организации, где устанавливается компьютер, деление компьютеров по мощности потребляемой электроэнергии, конечно же, будет классификацией. Планово-финансовый отдел больше интересует стоимость. Если окажется, что установка двадцати компьютеров в локальной сети обойдется во столько же, во сколько и восьмипроцессорный сервер с общей памятью, то для него это будут вычислительные системы одного класса. И правильно. Что заложили в основу классификации, такие следствия и получаем.

Ясно, что навести порядок в хаосе очень важно для лучшего понимания исследуемой предметной области. В самом деле, вспомним открытый в 1869 году Д. И. Менделеевым периодический закон. Выписав на карточках названия химических элементов и указав их важнейшие свойства, он сумел найти такое расположение, при котором четко прослеживалась закономерность в изменении свойств элементов, расположенных в каждом столбце и каждой строке. Теперь, зная положение элемента в таблице, он мог с большой степенью точности описать его свойства, не проводя с ним никаких непосредственных экспериментов. Другим, поистине фантастическим следствием, явилось то, что данный закон указал на несколько "белых пятен" в таблице и позволил предсказать не только существование, но и свойства пока неизвестных элементов. В 1875 году французский химик Поль Эмиль Лекок де Буабодран, изучая спектры минералов, открыл предсказанный Менделеевым галлий и впервые подробно описал его свойства. В свою очередь Менделеев, никогда прежде не видевший данного химического элемента, на основании введенной классификации смог и указать на ошибку в определении плотности галлия, и вычислить правильное значение.

Что-то похожее хотелось бы найти и для архитектур параллельных вычислительных систем. Главный вопрос — что заложить в основу классификации, может решаться по-разному. Однако с позиций наших исследований классификация должна давать ключ к пониманию того, как решать задачу эффективного отображения алгоритмов на архитектуру вычислительных систем. В некоторых случаях вводят описания классов компьютеров. На основе информации о принадлежности компьютера к конкретному классу пользователь сам принимает решение о способе записи алгоритма в терминах выбранной технологии параллельного программирования. Иногда в качестве классификации пытаются ввести формальное описание архитектуры, используя специальную нотацию. Такое направление интересно тем, что создается благоприятная основа для построения автоматизированных систем отображения. В самом деле, с одной стороны, есть формальное описание архитектуры целевого компьютера, с другой стороны, есть формальное описание алгоритма. Созданы условия для совместного исследования этих двух объектов и последующего синтеза оптимальной программы. Правда, результат очень сильно зависит как от качества введенных описаний, так и от методов их совместного исследования. О степени решенности даже упрощенного варианта данной проблемы читатель может судить по качеству компиляторов, работающих на существующих параллельных компьютерах.

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

Классификация М. Флинна (М. Flynn). По-видимому, самой ранней и наиболее известной является классификация архитектур вычислительных систем, предложенная в 1966 году М. Флинном. Классификация базируется на понятии потока, под которым понимается последовательность команд или данных, обрабатываемая процессором. На основе числа потоков команд и потоков данных Флинн выделяет четыре класса архитектур.

SISD (Single Instruction stream/Single Data stream) — одиночный поток команд и одиночный поток данных (рис. 3.1). На рисунках, иллюстрирующих классификацию М. Флинна, использованы следующие обозначения:

ПР — это один или несколько процессорных элементов, УУ — устройство управления, ПД — память данных. К классу SISD относятся, прежде всего, классические последовательные машины или, иначе, машины фон-неймановского типа, например, PDP-11 или VAX 11/780. В таких машинах есть только один поток команд, все команды обрабатываются последовательно друг за другом и каждая команда инициирует одну скалярную операцию. Не имеет значения тот факт, что для увеличения скорости обработки команд и скорости выполнения арифметических операций может применяться конвейерная обработка: как машина CDC 6600 со скалярными функциональными устройствами, так и CDC 7600 с конвейерными попадают в этот класс.

 

Рис. 3.1. Классы SISD и SIMD классификации М. Флинна

SIMD (Single Instruction stream/Multiple Data stream) — одиночный поток команд и множественный поток данных (см. рис. 3.1). В архитектурах подобного рода сохраняется один поток команд, включающий, в отличие от предыдущего класса, векторные команды. Это позволяет выполнять одну арифметическую операцию сразу над многими данными, например, над элементами вектора. Способ выполнения векторных операций не оговаривается, поэтому обработка элементов вектора может производиться либо процессорной матрицей, как в ILLIAC IV, либо с помощью конвейера, как, например, в машине Сгау-1.

MISD (Multiple Instruction stream/Single Data stream) — множественный поток команд и одиночный поток данных (рис. 3.2). Определение подразумевает наличие в архитектуре многих процессоров, обрабатывающих один и тот же поток данных. Однако ни Флинн, ни другие специалисты в области архитектуры компьютеров до сих пор не смогли представить убедительный пример реально существующей вычислительной системы, построенной на данном принципе. Ряд исследователей относят конвейерные машины к данному классу, однако это не нашло окончательного признания в научном сообществе. Будем считать, что пока данный класс пуст.

MIMD (Multiple Instruction stream/Multiple Data stream) — множественный поток команд и множественный поток данных (см. рис. 3.2). Этот класс предполагает, что в вычислительной системе есть несколько устройств обработки команд, объединенных в единый комплекс и работающих каждое со своим потоком команд и данных.

Рис. 3.2. Классы MISD и MIMD классификации М. Флинна

Итак, что же собой представляет каждый класс? В SISD, как уже говорилось, входят однопроцессорные последовательные компьютеры типа VAX 11/780. Однако многими критиками подмечено, что в этот класс можно включить и векторно-конвейерные машины, если рассматривать вектор как одно неделимое данное для соответствующей команды. В таком случае в этот класс попадут и такие системы, как Cray-1, CYBER 205, машины семейства FACOM VP и многие другие.

Бесспорными представителями класса SIMD считаются матрицы процессоров: ILLIAC IV, ICL DAP, Goodyear Aerospace MPP, Connection Machine 1 и т. п. В таких системах единое управляющее устройство контролирует множество процессорных элементов. Каждый процессорный элемент получает от устройства управления в каждый фиксированный момент времени одинаковую команду и выполняет ее над своими локальными данными. Для классических процессорных матриц никаких вопросов не возникает. Однако в этот же класс можно включить и векторно-конвейерные машины, например, Сгау-1. В этом случае каждый элемент вектора надо рассматривать как отдельный элемент потока данных.

Класс MIMD чрезвычайно широк, поскольку включает в себя всевозможные мультипроцессорные системы: Cm*, C.mmp, Cray Y-MP, Denelcor HEP, BBN Butterfly, Intel Paragon, Cray T3D и многие другие. Интересно то, что если конвейерную обработку рассматривать как выполнение последовательности различных команд (операций ступеней конвейера) не над одиночным векторным потоком данных, а над множественным скалярным потоком, то все рассмотренные выше векторно-конвейерные компьютеры можно расположить и в данном классе.

Предложенная схема классификации вплоть до настоящего времени является самой применяемой при начальной характеристике того или иного компьютера. Если говорится, что компьютер принадлежит классу SIMD или MIMD, то сразу становится понятным базовый принцип его работы, и в некоторых случаях этого бывает достаточно. Однако видны и явные недостатки. В частности, некоторые заслуживающие внимания архитектуры, например dataflow и векторно-конвейерные машины, четко не вписываются в данную классификацию. Другой недостаток — это чрезмерная заполненность класса MIMD. Необходимо средство, более избирательно систематизирующее архитектуры, которые по Флинну попадают в один класс, но совершенно различны по числу процессоров, природе и топологии связи между ними, по способу организации памяти и, конечно же, по технологии программирования.

Классификация Р. Хокни (R. Hockney). Р. Хокни разработал свой подход к классификации для более детальной систематизации компьютеров, попадающих в класс MIMD по систематике М. Флинна. Как отмечалось выше, класс MIMD чрезвычайно широк и объединяет целое множество различных типов архитектур. Пытаясь систематизировать архитектуры внутри этого класса, Р. Хокни получил иерархическую структуру, представленную на рис. 3.3.

Рис. 3.3. Дополнительная классификация Р. Хокни класса MIMD

Основная идея классификации состоит в следующем. Множественный поток команд может быть обработан двумя способами: либо одним конвейерным устройством обработки, работающим в режиме разделения времени для отдельных потоков, либо каждый поток обрабатывается своим собственным устройством. Первая возможность используется в MIMD-компьютерах, которые автор называет конвейерными. Сюда можно отнести, например, процессорные модули в Denelcor HEP или компьютеры семейства Тега МТА.

Архитектуры, использующие вторую возможность, в свою очередь, опять делятся на два класса. В первый класс попадают MIMD-компьютеры, в которых возможна прямая связь каждого процессора с каждым, реализуемая с помощью переключателя. Во втором классе находятся MIMD-компьютеры, в которых прямая связь каждого процессора возможна только с ближайшими соседями по сети, а взаимодействие удаленных процессоров поддерживается специальной системой маршрутизации.

Среди MIMD-машин с переключателем Хокни выделяет те, в которых вся память распределена среди процессоров как их локальная память (например, PASM, PRINGLE, IBM SP2 без SMP-узлов). В этом случае общение самих процессоров реализуется с помощью сложного переключателя, составляющего значительную часть компьютера. Такие машины носят название MIMD-машин с распределенной памятью. Если память это разделяемый ресурс, доступный всем процессорам через переключатель, то MIMD-машины являются системами с общей памятью (BBN Butterfly, Cray С90). В соответствии с типом переключателей можно проводить классификацию и далее: простой переключатель, многокаскадный переключатель, общая шина и т. п. Многие современные вычислительные системы имеют как общую разделяемую память, так и распределенную локальную. Такие системы автор рассматривает как гибридные MIMD с переключателем.

При рассмотрении MIMD-машин с сетевой структурой считается, что все они имеют распределенную память, а дальнейшая классификация проводится в соответствии с топологией сети: звездообразная сеть (1САР), регулярные решетки разной размерности (Intel Paragon, Cray T3D), гиперкубы (NCube, Intel iPSC), сети с иерархической структурой, такой как деревья, пирамиды, кластеры (Cm*, CEDAR) и, наконец, сети, изменяющие свою конфигурацию.

Заметим, что если архитектура компьютера спроектирована с использованием нескольких сетей с различной топологией, то, по всей видимости, по аналогии с гибридными MIMD-машинами с переключателями, их стоит назвать гибридными сетевыми MIMD-машинами, а использующие идеи разных классов — просто гибридными MIMD-машинами. Типичным представителем последней группы, в частности, является компьютер Connection Machine 2, имеющий на внешнем уровне топологию гиперкуба, каждый узел которого является кластером процессоров с полной связью.

Классификация Т. Фенга (Т. Feng). В 1972 году Т. Фенг предложил классифицировать вычислительные системы на основе двух простых характеристик. Первая — число n бит в машинном слове, обрабатываемых параллельно при выполнении машинных инструкций. Практически во всех современных компьютерах это число совпадает с длиной машинного слова. Вторая характеристика равна числу слов m, обрабатываемых одновременно данной вычислительной системой. Немного изменив терминологию, функционирование любого компьютера можно представить как параллельную обработку n битовых слоев, на каждом из которых независимо преобразуются m бит. Опираясь на такую интерпретацию, вторую характеристику называют шириной битового слоя.

Каждую вычислительную систему С можно описать парой чисел (n, m). Произведение Р = nxm определяет интегральную характеристику потенциала параллельности архитектуры, которую Фенг назвал максимальной степенью параллелизма вычислительной системы. По существу, данное значение есть не что иное, как пиковая производительность, выраженная в других единицах. В период появления данной классификации, а это начало 70-х годов прошлого столетия, еще казалось возможным перенести понятие пиковой производительности как универсального средства сравнения и описания потенциальных возможностей компьютеров с традиционных последовательных машин на параллельные. Понимание того факта, что пиковая производительность сама по себе не столь важна, пришло позднее, и данный подход отражает, естественно, степень осмысления специфики параллельных вычислений того времени.

Рассмотрим компьютер Advanced Scientific Computer фирмы Texas Instruments (TI ASC). В основном режиме он работает с 64-разрядным словом, причем все разряды обрабатываются параллельно. Арифметико-логическое устройство имеет четыре одновременно работающих конвейера, содержащих по восемь ступеней. При такой организации 4x8 = 32 слова могут обрабатываться одновременно (то есть 32 бита в каждом битовом слое), и значит компьютер TI ASC может быть представлен в виде (64, 32).

На основе введенных понятий все вычислительные системы можно разделить на четыре класса.

Разрядно-последовательные, пословно-последовательные (n = m = 1). В каждый момент времени такие компьютеры обрабатывают только один двоичный разряд. Представителем данного класса служит давняя система MINIMA с естественным описанием (1, 1).

Разрядно-параллельные, пословно-последовательные (n > 1, m = 1). Большинство классических последовательных компьютеров, так же как и многие вычислительные системы, используемые сейчас, принадлежат к данному классу: IBM 701 с описанием (36, 1), PDP-11 с описанием (16, 1), IBM 360/50 и VAX 11/780 - обе с описанием (32, 1).

Разрядно-последовательные, пословно-параллельные (n = 1, m > 1). Как правило вычислительные системы данного класса состоят из большого числа одноразрядных процессорных элементов, каждый из которых может независимо от остальных обрабатывать свои данные. Типичными примерами служат STARAN (1, 256) и МРР (1, 16384) фирмы Goodyear Aerospace, прототип известной системы ILLIAC IV компьютер SOLOMON (1, 1024) и ICL DAP (1, 4096).

Разрядно-параллельные, пословно-параллельные (n > 1, m > 1). Подавляющее большинство параллельных вычислительных систем, обрабатывая одновременно mхn двоичных разрядов, принадлежит именно к этому классу: ILLIAC IV (64, 64), TI ASC (64, 32), C.mmp (16, 16), CDC 6600 (60, 10), BBN Butterfly GP1000 (32, 256).

Недостатки предложенной классификации достаточно очевидны и связаны со способом вычисления ширины битового слоя m. По существу Фенг не делает никакого различия между процессорными матрицами, векторно-конвейерными и многопроцессорными системами. Не делается акцент на том, за счет чего компьютер может одновременно обрабатывать более одного слова: множественности функциональных устройств, их конвейерности или же какого-то числа независимых процессоров. Если в системе N независимых процессоров имеют каждый по F конвейерных функциональных устройств с длиной конвейера L, то для вычисления ширины битового слоя надо просто найти произведение N х F x L.

Конечно же, опираясь на данную классификацию, достаточно трудно, а иногда и просто невозможно, осознать специфику той или иной вычислительной системы. Достоинством же можно считать введение единой числовой метрики для всех типов компьютеров, позволяющей сравнить любые два компьютера между собой.

Классификация В. Хендлера (W. Handler). В основу классификации В. Хендлер закладывает явное описание возможностей параллельной и конвейерной обработки информации вычислительной системой. При этом он намеренно не рассматривает различные способы связи между процессорами и блоками памяти, а считает, что коммуникационная сеть может быть нужным образом сконфигурирована и будет способна выдержать предполагаемую нагрузку.

Предложенная классификация базируется на различии между тремя уровнями обработки данных в процессе выполнения программ:

□ уровень выполнения программы; опираясь на счетчик команд и некоторые другие регистры, устройство управления (УУ) производит выборку и дешифрацию команд программы;

□ уровень выполнения команд; арифметико-логическое устройство компьютера (АЛУ) исполняет команду, выданную ему устройством управления;

□ уровень битовой обработки; все элементарные логические схемы процессора (ЭЛС) разбиваются на группы, необходимые для выполнения операций над одним двоичным разрядом.

Подобная схема выделения уровней предполагает, что вычислительная система содержит какое-то число процессоров, каждый со своим устройством управления. Каждое устройство управления связано с несколькими арифметико-логическими устройствами, исполняющими одну и ту же операцию в каждый конкретный момент времени. Наконец, каждое АЛУ объединяет несколько групп элементарных логических схем, ассоциированных с обработкой одного двоичного разряда (число групп ЭЛС есть не что иное, как длина машинного слова). Если на какое-то время не рассматривать возможность конвейеризации, то число устройств управления k, число арифметико-логических устройств d в каждом устройстве управления и число групп ЭЛС w в каждом АЛУ составят тройку для описания данной вычислительной системы С: t(C) = (к, d, w).

В таких обозначениях описания некоторых хорошо известных вычислительных систем будут выглядеть следующим образом:

t(MINIMA) = (1,1,1);

t(IBM 701) = (1,1,36);

t(SOLOMON) = (1,1024,1);

t(ILLIAC IV) = (1,64,64);

t(STARAN) = (1,8192,1) — в полной конфигурации;

t(C.mmp) = (16,1,16) — основной режим работы;

t(PRIME) = (5,1,16);

t(BBN Butterfly GP1000) = (256,1,32).

Несмотря на то, что перечисленным системам присущ параллелизм разного рода, он без особого труда может быть отнесен к одному из трех выделенных уровней.

Рис. 3.4. Уровни параллелизма в классификации В. Хендлера

Теперь можно расширить возможности описания, допустив возможность конвейерной обработки на каждом из уровней (рис. 3.4). В самом деле, конвейерность на самом нижнем уровне, т. е. на уровне ЭЛС, это конвейерность функциональных устройств. Если функциональное устройство обрабатывает w-разрядные слова на каждой из w' ступеней конвейера, то для характеристики параллелизма данного уровня естественно рассмотреть произведение w х w'. Знак "х" будем использовать на каждом уровне, чтобы отделить число, представляющее степень параллелизма, от числа ступеней в конвейере. Компьютер TI ASC имеет четыре конвейерных устройства по восемь ступеней в каждом для обработки 64-разрядных слов, следовательно, он может быть описан так:

t(TI ASC) = (1, 4, 64 х 8).

Следующий уровень конвейерной обработки — это конвейеризация на уровне команд. Предполагается, что в вычислительной системе есть несколько функциональных устройств, которые могут работать одновременно в режиме конвейера (для обозначения данной возможности часто используют другой термин — зацепление функциональных устройств). Классическим примером этому служат векторно-конвейерные компьютеры фирмы Cray Research. Другим примером является машина CDC 6600, содержащая десять независимых последовательных функциональных устройств, способных подавать результат своей работы на вход другим функциональным устройствам: t(CDC 6600) = (1,1 х 10,60) (описан только центральный процессор без учета управляющих и периферийных подсистем).

Наконец, нам осталось рассмотреть конвейеризацию на самом верхнем уровне, известную как макроконвейер. Поток данных, проходя через один процессор, поступает на вход другому. Компьютер РЕРЕ, имея фактически три независимых системы из 288 устройств, описывается так:

T(РЕРЕ) = (1 x 3, 288, 32).

После расширения трехуровневой модели параллелизма средствами описания потенциальных возможностей конвейеризации каждая тройка

t(С) = (kх k', dxd', wxw')

интерпретируется так:

□ k — число процессоров (каждый со своим УУ), работающих параллельно;

k' — глубина макроконвейера из отдельных процессоров;

□ d — число АЛУ в каждом процессоре, работающих параллельно;

□ d' — глубина конвейера из функциональных устройств АЛУ;

□ w — число разрядов в слове, обрабатываемых в АЛУ параллельно;

□ w' — число ступеней в конвейере функциональных устройств АЛУ.

Очевидна связь между классификацией Фенга и классификацией Хендлера: для получения максимальной степени параллелизма в терминах Фенга надо найти произведение всех шести величин в описании Хендлера. Здесь же заметим, что, заложив в основу своей схемы явное указание на присутствующий параллелизм и возможную конвейеризацию, Хендлер сразу снимает некоторые вопросы, характерные для схем Флинна и Фенга, по крайней мере, в плане описания векторно-конвейерных машин.

В дополнение к изложенному способу описания архитектур Хендлер предлагает использовать три операции, которые, будучи примененными к тройкам, позволят описать, во-первых, сложные структуры с подсистемами ввода/вывода, хост-компьютером или какими-то другими особенностями, и, во-вторых, возможные режимы функционирования вычислительных систем, поддерживаемые для оптимального соответствия структуре программ.

Первая операция (х) в каком-то смысле отражает конвейерный принцип обработки и предполагает последовательное прохождение данных сначала через первый ее аргумент-подсистему, а затем через второй. В частности, описание компьютера CDC 6600 можно уточнить следующим образом:

t(CDC 6600) = (10,1,12) х (1,1 х 10,60),

где первый аргумент отражает существование десяти 12-разрядных периферийных процессоров и тот факт, что любая программа должна сначала быть обработана одним из них и лишь после этого передана центральному процессору для исполнения. Аналогично можно получить описание машины РЕРЕ, принимая во внимание, что в качестве хост-компьютера она использует CDC 7600:

t(РЕРЕ) = <CDC 7600) х (1 х 3, 288, 32) =

= (15, 1, 12) х (1, 1 х 9, 60) х (1 х 3, 288, 32).

Поток данных последовательно проходит через три подсистемы, что мы и отразили, соединив их знаком "х".

Заметим, что все подсистемы последнего примера достаточно сложны и по данному описанию могут представляться по-разному. Чтобы внести большую ясность, аналогично операции конвейерного исполнения, Хендлер вводит операцию параллельного исполнения (+), фиксирующую возможность незaвисимого использования процессоров разными задачами, например:

t(4, d, w) = [(1, d, w) + (1, d, w) + (1, d, w) + (1, d, w)].

В случае CDC 7600 уточненная запись вида:

(15, 1, 12) х (1, 1 х 9, 60) =

= [(1, 1, 12) + ... + (1, 1, 12)] {15раз} х (1, 1 х 9, 60)

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

И, наконец, третья операция — операция альтернативы (v), показывает возможные альтернативные режимы функционирования вычислительной системы. Например, компьютер C.mmp может быть запрограммирован для использования в трех принципиально разных режимах:

t(C.mmp) = (16, 1, 16) v (1 х 16, 1,16) v (1, 16, 16).

Классификация Л. Шнайдера (L. Snyder). В 1988 году Л. Шнайдер предложил выделить этапы выборки и непосредственно исполнения в потоках команд и данных. Именно разделение потоков на адреса и их содержимое позволило описать такие ранее "неудобные" для классификации архитектуры, как компьютеры с длинным командным словом, систолические массивы и целый ряд других.

Введем необходимые для дальнейшего изложения понятия и обозначения. Назовем потоком ссылок S некоторой вычислительной системы конечное множество бесконечных последовательностей пар:

S= {(a1 <t1>) (а2 <t2>), (b1 <u1>) (b2 <t2>),

1, <v1>) (с2 <v2>)},

где первый компонент каждой пары — это неотрицательное целое число, называемое адресом, второй компонент — это набор из n неотрицательных целых чисел, называемых значениями, причем п одинаково для всех наборов всех последовательностей. Например, пара (b2 <u2>) определяет адрес b2 и значение u2. Если значения рассматривать как команды, то из потока ссылок получим поток команд I; если же значения интерпретировать как данные, то соответствующий поток — это поток данных D.

Интерпретация введенных понятий очень проста. Элементы каждой последовательности это адрес и его содержимое, выбираемое из памяти (или записываемое в память). Последовательность пар адрес—значение можно рассматривать как историю выполнения команд либо перемещения данных между процессором и памятью компьютера во время выполнения программы. Число инструкций, которое данный компьютер может выполнять одновременно, определяет число последовательностей в потоке команд. Аналогично, число различных данных, которое компьютер может обработать одновременно, определяет число последовательностей в потоке данных.

Пусть S произвольный поток ссылок. Последовательность адресов потока S, обозначаемая Sa, это последовательность наборов, сформированная из адресов каждой последовательности из S:

Sa = <а1 b1 с1>, <а2 b2 с2>.

Последовательность значений потока S, обозначаемая Sv, это последовательность наборов, сформированная из значений каждой последовательности из S:

Sv = <t1 u1 v1>, <t2 u2 v2>.

Если Sx — последовательность элементов, где каждый элемент является набором из n чисел, то для обозначения "ширины" последовательности будем пользоваться обозначением: w(Sx) = n.

Из определений Sa, Sv и w следует, что если S это поток ссылок со значениями из n чисел, то w(Sa) = |S| и w(Sv) = n |S|, где |S| обозначает мощность множества S,

Каждую пару (I, D) с потоком команд I и потоком данных D будем называть вычислительным шаблоном, а все компьютеры будем разбивать на классы в зависимости от того, какой шаблон они могут исполнить. В самом деле, компьютер может исполнить шаблон (I, D), если он в состоянии:

□ выдать w(Ia) адресов команд для одновременной выборки из памяти;

□ декодировать и проинтерпретировать одновременно w(Iv) команд;

□ выдать одновременно w(Da) адресов операндов;

□ выполнить одновременно w(Dv) операций над различными данными.

Если все эти условия выполнены, то компьютер может быть описан как Iw(Ia)w(Iv)Dw(Da)w(Dv) Рассмотрим классическую последовательную машину. Согласно классификации Флинна, она попадает в класс SISD, следовательно |I| = |D| = 1 и w(Ia) = w(Da) = 1. Из-за того, что в подобного рода компьютерах команды декодируются последовательно, следует равенство w(Iv) = 1, а последовательное исполнение команд дает w(Dv) = 1. Поэтому описание однопроцессорной машины с фоннеймановской архитектурой будет выглядеть так: I1,1D1,1.

Теперь возьмем две машины из класса SIMD: Goodyear Aerospace МРР и ILLIAC IV, причем не будем принимать во внимание разницу в способах обработки данных отдельными процессорными элементами. Единственный поток команд означает |I| = 1 для обеих машин. Аналогично последовательной машине, для потока команд получаем равенство w(Ia) = w(Iv) = 1. Далее, вспомним, что для доступа к операндам устройство управления МРР рассылает один и тот же адрес всем процессорным элементам, поэтому в этой терминологии МРР имеет единственную последовательность в потоке данных, т. е. |D| = 1. Однако затем выборка данных из памяти и последующая обработка осуществляются в каждом процессорном элементе, поэтому w(Dv) = 16 384, а вся система МРР может быть описана I1,1D1,16 384

В ILLIAC IV устройство управления, так же, как и в МРР, рассылает один и тот же адрес всем процессорным элементам, однако каждый из них может получить свой уникальный адрес, добавляя содержимое локального индексного регистра. Это означает, что   |D| = 64 и в системе присутствуют 64 потока адресов данных, определяющих одиночные потоки операндов, т. е. w(Da) = w(Dv) = 64. Суммируя сказанное, приходим к описанию ILLIAC IV: I1,1D64,64.

Для более детальной классификации Шнайдер вводит три предопределенных значения, которые могут принимать величины w(Ia), w(Iv), w(Da) и w(Dv).

□ s — значение равно 1;

□ с — значение от 1 до некоторой (небольшой) константы;

m — значение от 1 до произвольно большого конечного числа.

В частности, в этих обозначениях фоннеймановская машина принадлежит к классу ISSDSS.

Несмотря на то, что и с и m в принципе не имеют определенной верхней границы, они отражают разные свойства архитектуры компьютера. Описатель с предполагает жесткие ограничения сверху со стороны аппаратуры, и соответствующий параметр не может быть значительно увеличен относительно простыми средствами. Примером может служить число инструкций, упакованных в командном слове VLIW-компьютера. С другой стороны, описатель m используется тогда, когда обозначаемая величина может быть легко изменена, т. е. другими словами, компьютер по данному параметру масштабируем. Например, относительная простота увеличения числа процессорных элементов в системе МРР является основанием для того, чтобы отнести ее к классу IssDsm.

Конечно же, различие между с и m в достаточной мере условное и, как правило, порождает массу вопросов. Например, как описать машину, в которой процессоры связаны через общую шину? С одной стороны, нет никаких принципиальных ограничений на число подключаемых процессоров. Однако каждый дополнительный процессор увеличивает загруженность шины, и при достижении некоторого порога подключение новых процессоров бессмысленно. С помощью какого символа описать такую систему: с или m? Мы оставляем данный вопрос открытым.

На основе этих обозначений можно выделить следующие классы компьютеров:

□ ISSDSS — классические машины фоннеймановского типа;

IssDsc — фоннеймановские машины, в которых заложена возможность выбирать данные, расположенные с разным смещением относительно одного и того же адреса и над которыми будет выполнена одна и та же операция. Примером могут служить компьютеры, имеющие команды типа одновременного выполнения двух операций сложения над данными в формате полуслова, расположенными по указанному адресу;

□ IssDsm -  SIMD-компьютеры без возможности получения уникального адреса для данных в каждом процессорном элементе. Сюда входят, например, МРР, Connection Machine 1 и систолические массивы;

□ IssDmm — это SIMD-компьютеры, имеющие возможность независимой модификации адресов операндов в каждом процессорном элементе, например, ILLIAC IV и Connection Machine 2;

□ ISCDCC — вычислительные системы, выбирающие и исполняющие одновременно несколько команд, для доступа к которым используется один адрес. Типичным примером являются VLIW-компьютеры;

□ ImmDmm — к этому классу относятся все компьютеры типа MIMD.

Достаточно ясно, что не нужно рассматривать все возможные комбинации описателей s, с и m, т. к. архитектура реальных компьютеров накладывает ряд вполне разумных ограничений, в частности w(Ia) ≤ w(Iv) и w(Da) ≤ w(Dv).

Подводя итог, можно отметить два положительных момента в классификации Шнайдера: более избирательная систематизация SIMD-компьютеров и возможность описания нетрадиционных архитектур типа систолических массивов или компьютеров с длинным командным словом. Вместе с тем, почти все вычислительные системы типа MIMD опять попали в один и тот же класс ImmDmm. Это означает, что критерий классификации, основанный лишь на потоках команд и данных без учета распределенности памяти и топологии межпроцессорной связи, слишком слаб для подобных систем.

Классификация Д. Скилликорна (D. Skillicorn). В 1989 году была сделана очередная попытка расширить классификацию Флинна и тем самым преодолеть ее недостатки. Д. Скилликорн разработал подход, пригодный для описания свойств многопроцессорных систем и некоторых нетрадиционных архитектур, в частности, dataflow.

Предлагается рассматривать архитектуру любого компьютера, как абстрактную структуру, состоящую из четырех компонентов:

процессор команд (IP — Instruction Processor) — функциональное устройство, работающее как интерпретатор команд; в системе, вообще говоря, может отсутствовать;

процессор данных (DP — Data Processor) — функциональное устройство, работающее как преобразователь данных в соответствии с арифметическими операциями;

иерархия памяти (IM — Instruction Memory, DM — Data Memoiy) — запоминающее устройство, в котором хранятся данные и команды, пересылаемые между процессорами;

переключатель — абстрактное устройство, обеспечивающее связь между процессорами и памятью.

Функции процессора команд во многом схожи с функциями устройств управления последовательных машин и, согласно Д. Скилликорну, сводятся к следующим. На основе своего состояния и полученной от DP информации IP выполняет такие действия: определяет адрес команды, которая будет выполняться следующей; осуществляет доступ к IM для выборки команды; получает и декодирует выбранную команду; сообщает DP команду, которую надо выполнить; определяет адреса операндов и посылает их в DP; получает от DP информацию о результате выполнения команды.

Функции процессора данных делают его во многом похожим на арифметическое устройство традиционных процессоров. DP получает от IP команду, которую надо выполнить; получает от IP адреса операндов; выбирает oпeранды из DM; выполняет команду; запоминает результат в DM; возвращает в IP информацию о состоянии после выполнения команды.

 

Рис. 3.5. Фоннеймановская архитектура в терминах классификации Д. Скилликорна

Структура традиционной фон-неймановской архитектуры в терминах таким образом определенных основных частей компьютера показана на рис. 3.5. Это один из самых простых видов архитектуры, не содержащих переключателей. Для описания сложных параллельных вычислительных систем Д. Скилликорн зафиксировал четыре типа переключателей без какой-либо явной связи с типом устройств, которые они соединяют:

□ 1 — 1 — переключатель такого типа связывает пару функциональных устройств;

nn— переключатель связывает каждое устройство из одного множества устройств с соответствующим ему устройством из другого множества, т. е. фиксирует попарную связь;

□ 1 - n — переключатель соединяет одно выделенное устройство со всеми функциональными устройствами из некоторого набора;

n х n — каждое функциональное устройство одного множества может быть связано с любым устройством другого множества, и наоборот.

Примеров подобных переключателей можно привести много. Так, все матричные процессоры имеют переключатель типа 1-n для связи единственного процессора команд со всеми процессорами данных. В компьютерах семейства Connection Machine каждый процессор данных имеет свою локальную память, следовательно, такая связь будет описываться как mn. В то же время, каждый процессор команд может связаться с любым другим процессором, что отвечает описанию nхn.

Классификация Д. Скилликорна строится на основе следующих восьми характеристик:

□ количество процессоров команд IP;

□ число запоминающих устройств (модулей памяти) команд IM;

□ тип переключателя между IP и IM;

□ количество процессоров данных DP;

□ число запоминающих устройств (модулей памяти) данных DM;

□ тип переключателя между DP и DM;

□ тип переключателя между IP и DP;

□ тип переключателя между DP и DP.

Рассмотрим компьютер Connection Machine 2. В терминах данных характеристик его можно описать следующим образом:

(1, 1, 1 — 1, n, n, nn, 1 — n, n х n).

Условное изображение его архитектуры приведено на рис. 3.6.

 

Рис. 3.6. Архитектура Connection Machine 2 в классификации Д. Скилликорна

Для сильно связанных мультипроцессоров типа BBN Butterfly ситуация иная. Такие системы состоят из множества процессоров, соединенных с модулями памяти с помощью переключателя. Задержка при доступе любого процессора к любому модулю памяти примерно одинакова. Связь и синхронизация между процессорами осуществляется через общие (разделяемые) переменные. Описание таких машин в рамках данной классификации выглядит так:

(n, n, nn, n, n, n х n, nn, нет).

Саму архитектуру можно изобразить так, как показано на рис. 3.7.

 

Рис. 3.7. Архитектура BBN Butterfly в классификации Д. Скилликорна

Используя введенные характеристики и предполагая, что рассмотрение количественных характеристик можно ограничить только тремя возможными вариантами значений: 0, 1 и n (то есть больше единицы), можно получить различные классы архитектур.

Интересно, что среди сформулированных Скилликорном целей, которым должна служить хорошо построенная классификация архитектур, есть и такая: "классификация должна показывать, за счет каких структурных особенностей достигается увеличение производительности различных вычислительных систем". Эта цель очень созвучна целям наших исследований. Когда пользователь приходит на новую вычислительную систему, то, как правило, ему известна лишь ее пиковая производительность. Однако этого явно недостаточно. Если ему действительно нужна высокая производительность, то, хочет он этого или нет, ему придется иметь дело с целым спектром смежных вопросов. Практически все они связаны с особенностями архитектуры компьютера. Вот тут-то и пригодилась бы хорошая классификация.

Попадание компьютера в тот или иной класс сразу давало бы пользователю информацию об особенностях его программирования, методах достижения высокой производительности, причинах низкой производительности. Косвенно такую информацию получить можно, но только в самых общих чертах. В частности, все компьютеры в первом приближении можно поделить на компьютеры с общей и распределенной памятью. Для компьютеров с общей памятью пользователю не нужно заботиться о распределении данных, а для программирования можно использовать простую технологию ОрепМР. На компьютерах с распределенной памятью ему, скорее всего, придется работать в терминах MPI и самому заботиться о распределении и пересылках данных. В общих чертах все верно, но, честно говоря, только в самых общих. В таком описании опущено слишком много важных деталей, без которых составление эффективных параллельных программ просто невозможно. Раз эти детали существенны, то они должны быть отражены в классификации. Компьютеров много, деталей еще больше, отсюда и множество классификаций, и интерес к данной проблеме в целом.

ЧАСТЬ II

ПАРАЛЛЕЛЬНОЕ ПРОГРАММИРОВАНИЕ

Глава 4

Большие задачи и параллельные вычисления

Если создают большие вычислительные системы, значит они для чего-то нужны. Это что-то — большие задачи, которые постоянно возникают в самых различных сферах деятельности. Практическая потребность или просто любознательность всегда ставили перед человеком трудные вопросы, на которые нужно было получать ответы. Строится высотное задание в опасной зоне. Выдержит ли оно сильные ветровые нагрузки и колебания почвы? Проектируется новый тип самолета. Как он будет вести себя при различных режимах полета? Уже сейчас зафиксировано потепление климата на нашей планете и отмечены негативные последствия этого явления. А каким будет климат через сто и более лет?

Подобного рода вопросы сотнями и тысячами возникают в каждой области. Уже давно разработаны общие принципы поиска ответов. Первое, что пытаются сделать, — это построить математическую модель, адекватно отражающую изучаемое явление или объект. Как правило, математическая модель представляет собой некоторую совокупность дифференциальных, интегральных, алгебраических или каких-то других соотношений, определенных в области, так или иначе связанной с предметом исследований. Решения этих соотношений и должны давать ответы на поставленные вопросы.

Как следует из предыдущих глав, существующие компьютеры сами по себе не могут решить ни одной содержательной задачи. Они способны выполнять лишь небольшое число очень простых действий. Вся их интеллектуальная сила определяется программами, составленными человеком. Программы также реализуют последовательности простых действий. Но эти действия целенаправленные. Поэтому искусство решать задачи на компьютере есть искусство превращения процесса поиска решения в процесс выполнения последовательности простых действий. Называется такое искусство разработкой алгоритмов.

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

Во все времена были задачи, решение которых находилось на грани возможностей существовавших средств. Вплоть до середины двадцатого столетия единственным вычислительным средством был человек, вооруженный в лучшем случае арифмометром или электрической счетной машиной. Решение наиболее крупных задач требовало привлечения до сотни и более расчетчиков. Так как вычисления они проводили одновременно, то по существу такой коллектив своими действиями моделировал работу многопроцессорной вычислительной системы. Роль отдельного процессора в этой системе выполнял отдельный человек. При подобной организации вычислений никак не могло появиться большое число крупных задач. Их просто некому было считать. Поэтому еще 50—60 лет назад весьма распространенным являлось мнение, что несколько мощных компьютеров смогут решить все практически необходимые задачи.

История опровергла эти прогнозы. Компьютеры оказались настолько эффективным инструментом, что новые и очень крупные задачи стали возникать не только в традиционных для вычислений областях, но даже в таких, где раньше большие вычислительные работы не проводились. Например, в военном деле, управлении, биологии и т. п. К тому же, использование компьютеров освободило человека от нудного и скрупулезного труда, связанного с выполнением операций. Это позволило ему направить свой интеллект на постановку новых задач, построение математических моделей, разработку алгоритмов и при этом не бояться больших объемов вычислений. Подобные обстоятельства и привели к массовой загрузке компьютеров решением самых разных проблем, в том числе, очень крупных. Случилось то, что и должно было случиться: за исключением начального периода развития компьютеров спрос на самые большие вычислительные мощности всегда опережал и опережает предложение таких мощностей. Другое дело, что реализовать как спрос, так и предложение оказалось трудно.

Большие задачи и компьютеры представляют две взаимосвязанные сферы деятельности, два конца одной веревки. Если был один конец — большие задачи, значит должен был появиться и другой — компьютеры. Потребность в решении больших задач заставляет создавать более совершенные компьютеры. В свою очередь, более совершенные компьютеры позволяют улучшать математические модели и ставить еще большие задачи. В конце концов, обыкновенные компьютеры превратились в параллельные. Задачи от этого параллельными не стали, но начали развиваться алгоритмы с параллельной структурой вычислений. В результате опять появилась возможность увеличить размеры решаемых задач. Теперь на очереди стоят оптические и квантовые компьютеры. Конца этому процессу не видно.

§ 4.1. Большие задачи и большие компьютеры

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

В современном понимании климатическая система включает в себя атмосферу, океан, сушу, криосферу и биоту [26]. Климатом называется ансамбль состояний, который система проходит за достаточно большой промежуток времени. Климатическая модель — это математическая модель, описывающая климатическую систему. В основе климатической модели лежат уравнения динамики сплошной среды и уравнения равновесной термодинамики. Кроме этого, в модели описываются все энергозначимые физические процессы: перенос излучения в атмосфере, фазовые переходы воды, облака и конвенция, перенос малых газовых примесей и их трансформация, мелкомасштабная турбулентная диффузия тепла и диссипация кинетической энергии и многое другое. В целом модель представляет систему трехмерных нелинейных уравнений с частными производными. Решения этой системы должны воспроизводить все важные характеристики ансамбля состояний реальной климатической системы.

Даже без дальнейших уточнений понятно, что климатическая модель исключительно сложна. Работая с ней, приходится принимать во внимание ряд серьезных обстоятельств. В отличие от многих естественных наук, в климате нельзя поставить глобальный натурный целенаправленный эксперимент. Следовательно, единственный путь изучения климата — это проводить численные эксперименты с математической моделью и сравнивать модельные результаты с результатами наблюдений. Однако и здесь не все так просто. Математические модели для разных составляющих климатической системы развиты не одинаково. Исторически первой стала создаваться модель атмосферы. Она и в настоящее время является наиболее развитой. К тому же, за сотни лет наблюдений за ее состоянием накопилось довольно много эмпирических данных. Так что в атмосфере есть с чем сравнивать модельные результаты. Для других составляющих климатической системы результатов наблюдений существенно меньше. Слабее развиты и соответствующие математические модели. По существу только начинает создаваться модель биоты.

Общая модель климата пока еще далека от своего завершения. Не во всем даже ясно, как могла бы выглядеть совместная идеальная модель. Чтобы приблизить климатическую модель к реальности, приходится проводить очень много численных экспериментов и на основе анализа результатов вносить в нее коррективы. Как правило, пока эксперименты проводятся с моделями для отдельных составляющих климата или для некоторых их комбинаций. Наиболее часто рассматривается совместная модель атмосферы и океана. Недостающие данные от других составляющих берутся либо из ре¬зультатов наблюдений, либо из каких-то других соображений.

Важнейшей проблемой современности является проблема изменения климата под влиянием изменения концентрации малых газовых составляющих, таких как углекислый газ, озон и др. Как уже отмечалось, климатический прогноз может быть осуществлен только с помощью численных экспериментов над моделью. Поэтому ясно, что для того чтобы научиться предсказывать изменение климата в будущем, уже сегодня надо иметь возможность проводить большой объем вычислений. Попробуем хотя бы как-то его оценить.

Рассмотрим модель атмосферы как важнейшей составляющей климата и предположим, что мы интересуемся развитием атмосферных процессов на протяжении, например, 100 лет. При построении алгоритмов нахождения численных решений используется упоминавшийся ранее принцип дискретизации. Общее число элементов, на которые разбивается атмосфера в современных моделях, определяется сеткой с шагом в 1° по широте и долготе на всей поверхности земного шара и 40 слоями по высоте. Это дает около 2,6х106 элементов. Каждый элемент описывается примерно 10 компонентами. Следовательно, в любой фиксированный момент времени состояние атмосферы на земном шаре характеризуется ансамблем из 2,6х107 чисел. Условия обработки численных результатов требуют нахождения всех ансамблей через каждые 10 минут, т. е. за период 100 лет необходимо определить около 5,3х104 ансамблей. Итого, только за один численный эксперимент приходится вычислять 1,4x1014 значимых результатов промежуточных вычислений. Если теперь принять во внимание, что для получения и дальнейшей обработки каждого промежуточного результата нужно выполнить 102— 103 арифметических операций, то это означает, что для проведения одного численного эксперимента с глобальной моделью атмосферы необходимо выполнить порядка 1016—1017 арифметических операций с плавающей запятой.

Таким образом, вычислительная система с производительностью 1012 операций в секунду будет осуществлять такой эксперимент при полной своей загрузке и эффективном программировании в течение нескольких часов. Использование полной климатической модели увеличивает это время, как минимум, на порядок. Еще на порядок может увеличиться время за счет не лучшего программирования и накладных расходов при компиляции программ и т. п. А сколько нужно проводить подобных экспериментов! Поэтому вычислительная система с триллионной скоростью совсем не кажется излишне быстрой с точки зрения потребностей изучения климатических проблем.

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

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

Приведенные доводы, скорее всего, убедили читателя, что для исследования климата действительно нужна очень мощная вычислительная система. Тем более, что климат нельзя изучать, выполняя над ним целенаправленные эксперименты. Однако остается вопрос, насколько много необходимо иметь таких систем. Ведь основная деятельность человека связана с созданием материальных объектов, с чем или над чем можно проводить натурные эксперименты. Например, летательные аппараты можно испытывать в аэродинамических трубах, материалы — на стендах, сооружения — на макетах и т. п. Конечно, здесь также нужно проводить какие-то расчеты. Но стоит ли для этих целей использовать вычислительные системы, стоящие не один миллион долларов? Возможно, для подобных расчетов достаточно ограничиться хорошим персональным компьютером или рабочей станцией?

Ответ зависит от конкретной ситуации. Возьмем для примера такую проблему, как разработка ядерного оружия. Пока не был установлен мораторий на ядерные испытания, натурные эксперименты давали много информации о путях совершенствования оружия. И хотя при этом приходилось проводить очень большой объем вычислений, все же удавалось обходиться вычислительной техникой не самого высокого уровня. После вступления моратория в силу остался единственный путь совершенствования оружия — это проведение численных экспериментов с математической моделью. По своей сложности соответствующая модель сопоставима с климатической и для работы с ней уже нужна самая мощная вычислительная техника. В аналогичном положении находится ядерная энергетика. А такая проблема, как расшифровка генома человека. Здесь также невозможны никакие глобальные эксперименты и опять нужна мощная техника. Вообще, оказывается, что проблем, где невозможно или трудно проводить натурные эксперименты, не так уж мало. Это — экономика, экология, астрофизика, медицина и т. д. При этом часто возникают очень большие задачи.

Интересно отметить, что даже там, где натурные эксперименты являются привычным инструментом исследования, большие вычислительные системы начинают активно использоваться. Рассмотрим, например, проблему выбора компоновки летательного аппарата, обладающего минимальным лобовым сопротивлением, максимально возможными значениями аэродинамического качества и допустимого коэффициента подъемной силы при благоприятных характеристиках устойчивости и управляемости в эксплуатационных режимах. Для ее решения традиционно использовались продувки отдельных деталей аппарата или его модели в аэродинамических трубах. Но вот несколько цифр [37]. При создании в начале века самолета братьев Райт эксперименты в аэродинамических трубах обошлись в несколько десятков тысяч долларов, бомбардировщик 40-х гг. прошлого столетия потребовал миллион, а корабль многоразового использования "Шага" — 100 млн. долларов. Столь же сильно возрастает время продувки в расчете на одну трубу — почти 10 лет для современного аэробуса. Однако несмотря на огромные денежные и временные затраты, продувки в аэродинамических трубах не дают полной картины обтекания хотя бы просто потому, что обдуваемый образец нельзя окружить датчиками во всех точках. Для преодоления этих трудностей также пришлось обратиться к численным экспериментам с математической моделью [28].

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

В практике работы конструкторских организаций используются инженерные методы расчета, основанные на упрощенных математических моделях. Эти методы пригодны на самых ранних этапах проектирования. Они не могут учесть деталей течения, необходимых на углубленных этапах проектирования, и не могут обеспечить требуемую точность расчетов. В большой области изменения физических параметров упрощенные модели вообще не применимы. Для углубленной стадии проектирования летательных аппаратов перспективными являются математические модели, основанные на нестационарных пространственных уравнениях динамики невязкого, нетеплопроводного газа, в том числе, учитывающие уравнения состояния и уравнения вязкого пограничного слоя между поверхностью аппарата и обтекаемой средой. Модели принципиально различаются для случаев сверхзвукового и до¬звукового набегающего потока. Вообще говоря, случай дозвукового обтекания сложнее, т. к. около летательного аппарата возможно образование местных сверхзвуковых зон. Все части аппарата здесь взаимно влияют друг на друга, и задача должна решаться глобально, т. е. во всей области, окружающей летательный аппарат. Именно для расчета дозвуковых течений необходимо использовать вычислительные системы высокой производительности с большим объемом памяти.

Приведем некоторые данные конкретного расчета, взятые из той же работы [28]. Рассчитывались различные варианты дозвукового обтекания летательного аппарата сложной конструкции. Математическая модель требует задания граничных условий на бесконечности. Реально, область исследования берется конечной. Однако из-за обратного влияния границы ее удаление от объекта должно быть значительным по всем направлениям. На практике это составляет десятки длин размера аппарата. Таким образом, область исследования оказывается трехмерной и весьма большой. При построении алгоритмов нахождения численных решений опять используется принцип дискретизации. Из-за сложной конфигурации летательного аппарата разбиение выбирается очень неоднородным. Общее число элементов, на которые разбивается область, определяется сеткой с числом шагов порядка 102 по каждому измерению, т. е. всего будет порядка 106 элементов. В каждой точке надо знать 5 величин. Следовательно, на одном временном слое число неизвестных будет равно 5х106. Для изучения нестационарного режима приходится искать решения в 102—104 слоях по времени. Поэтому одних только значимых результатов промежуточных вычислений необходимо найти около 109—1011. Для получения каждого из них и дальнейшей его обработки нужно выполнить 102—103 арифметических операций. И это только для одного варианта компоновки и режима обтекания. А всего требуется провести расчеты для десятков вариантов. Приближенные оценки показывают, что общее число операций для решения задачи обтекания летательного аппарата в рамках современной модели составляет величину 1015—1016. Для достижения реального времени выполнения таких расчетов быстродействие вычисли¬тельной системы должно быть не менее 109—1010 арифметических операций с плавающей запятой в секунду при оперативной памяти не менее 109 слов.

Успехи в численном решении задач обтекания позволили создать комбинированную технологию разработки летательных аппаратов. Теперь основные эксперименты, особенно на начальной стадии проектирования, проводятся с математической моделью. Они позволяют достаточно достоверно определить оптимальную компоновку, проанализировать все стадии процесса обтекания, выявить потенциально опасные режимы полета и многое другое. Все это дает возможность снизить до минимума дорогостоящие натурные эксперименты в аэродинамических трубах и сделать их более целенаправленными. Конечно, численные эксперименты на высокопроизводительных вычислительных системах тоже обходятся недешево. Но все же они значительно дешевле, чем натурные эксперименты. Кроме этого, их стоимость постоянно снижается. Например, по данным США она уменьшается в 10 раз каждые 10 лет. Объединение численных и натурных экспериментов в единый технологический процесс привело к принципиально новому уровню аэродинамического проектирования. В результате значительно возросло качество, уменьшились стоимость, сроки проектирования и время испытаний летательных аппаратов. Совершенствование математических моделей сделает этот процесс еще более эффективным. Как и в примере с климатом, более совершенные модели потребуют применения более мощных вычислительных систем. В свою очередь, появление новых систем опять даст толчок совершенствованию моделей и т. д. Снова убеждаемся в том, что большие задачи и большие вычислительные системы с точки зрения их развития оказывают влияние друг на друга.

В рассмотренной проблеме выбора компоновки летательного аппарата легко увидеть нечто большее, имеющее отношение к самым различным областям деятельности человека. В самом деле, при создании тех или иных изделий, механизмов и сооружений, так же как и при проведении многих научных экспериментов весь процесс от возникновения идеи до ее реализации можно грубо разбить на следующие этапы. Сначала каким-то способом разрабатывается общий проект и готовится технологическая документация. Затем строится опытный образец или его макет. И, наконец, проводится испытание. По его результатам в опытный образец вносятся изменения и снова проводится испытание. Цикл образец—испытание—образец повторяется до тех пор, пока опытный образец не станет действующим, удовлетворяя всем заложенным в проект требованиям. Проведение каждого испытания и внесение очередных изменений в опытный образец почти всегда требует много денег и много времени. Поэтому одна из общих задач заключается в том, чтобы на пути превращения опытного образца в действующий сократить до минимума как число испытаний, так и их стоимость и время проведения. По существу это можно сделать единственным способом — заменить часть натурных экспериментов или большинство из них, а в идеале даже все, экспериментами с математическими моделями. Значимость численных экспериментов в общем процессе зависит от качества модели. Если она хорошо отражает создаваемый или изучаемый объект, натурные эксперименты оказываются необходимыми достаточно редко, что, в свою очередь, приводит к большим материальным и временным выгодам. В этой ситуации весь процесс во многом превращается в своего рода компьютерную игру, в которой можно посмотреть различные варианты решений, обнаружить и исследовать узкие места, выбрать оптимальный вариант, проанализировать последствия такого выбора и т. д. И лишь изредка отдельные решения придется прове¬рять на натурных экспериментах. Это обстоятельство, безусловно, стимулирует создание самых совершенных математических моделей в различных областях.

Очевидно, что использование математических моделей невозможно без применения вычислительной техники. Но оказывается, что для очень многих случаев нужна не просто какая-нибудь техника, а именно высокопроизводительная. В самом деле, изучаем ли мы процесс добычи нефти, или прочность кузова автомобиля, или процессы преобразования электрической энергии в больших трансформаторах и т. п., — исследуемые объекты являются трехмерными. Чтобы получить приемлемую точность численного решения, объект нужно покрыть сеткой не менее чем 100x100x100 узлов. В каждой точке сетки нужно определить 5—20 функций. Если изучается нестационарное поведение объекта, то состояние всего ансамбля значений функций нужно определить в 102—104 моментах времени. Поэтому только значимых результатов промежуточных вычислений для подобных объектов нужно получить порядка 109—1011. Теперь надо принять во внимание, что на вычисление и обработку каждого из промежуточных результатов, как показывает практика, требуется в среднем выполнить 102—103 арифметических операций. И вот мы уже видим, что для проведения только одного варианта численного эксперимента число операций порядка 1011—1014 является вполне рядовым. А теперь учтем необходимое число вариантов, накладные расходы на время решения задачи, появляющиеся за счет качества программирования, компиляции и работы операционной системы. И сразу становится ясно, что скорость вычислительной техники должна измеряться миллиардами операций в секунду. Такая техника стоит недешево. Тем не менее, как говорится, игра стоит свеч.

Мы неоднократно подчеркивали влияние больших задач на развитие вычислительной техники и наоборот. Постепенно в эту сферу втягивается много чего другого. Развитие математического моделирования приводит к более сложным описаниям моделей. Для их осмысления и разработки принципов исследования приходится привлекать новейшие достижения из самых разных областей математики. Дискретизация задач приводит к системам уравнений с огромным числом неизвестных. Прежние методы их решения не всегда оказываются пригодными по соображениям точности, скорости, требуемой памяти, структуре алгоритмов и т. п. Возникают и реализуются новые идеи в области вычислительной математики. В конечном счете, для более совершенных математических моделей создаются новые методы реализации численных экспериментов. Как правило, они требуют больших вычислительных затрат и снова не хватает вычислительных мощностей. А далее опять все идет по кругу, о чем уже не один раз говорилось выше.

Решаясь на регулярное использование численных экспериментов, приходится заботиться о качестве их проведения. Оно определяется многими фактора¬ми. Этапы, которые проходит каждый эксперимент, укрупненно отражены на рис. 4.1 Данным рисунком мы хотим подчеркнуть простую мысль: если хотя бы один из этапов на рис. 4.1 окажется неэффективным, то неэффективным будет и весь численный эксперимент.

Рис. 4.1. Этапы численного эксперимента

Следовательно, внимательному изучению должны подвергаться все этапы численного эксперимента. Это важно понять, запомнить и постоянно реализовывать на практике. Не правда ли, очень похоже на закон Амдала, о котором упоминалось в связи с производительностью вычислительных систем?

Глава 5

Технологии параллельного программирования

Итак, вы приступаете к созданию параллельной программы. Желание есть, задача ясна, метод выбран, целевой компьютер, скорее всего, тоже определен. Осталось только все мысли выразить в той или иной форме, понятной для этого компьютера. Чем руководствоваться, если собственного опыта пока мало, а априорной информации о доступных технологиях параллельного программирования явно недостаточно? Наводящих соображений может быть много, но в результате вы все равно будете вынуждены пойти на компромисс, делая выбор между временем разработки программы, ее эффективностью и переносимостью, интенсивностью последующего использования программы, необходимостью ее дальнейшего развития. Не вдаваясь в детали выбора, попробуйте для начала оценить, насколько важны для вас следующие три характеристики.

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

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

Вычислительная техника меняется очень быстро. Предположим, что была найдена технология, позволяющая быстро создавать эффективные параддельные программы. Что произойдет через пару лет, когда появится новое поколение компьютеров? Возможных вариантов развития событий два. Первый вариант — разработанные прежде программы были "одноразовыми" и сейчас ими уже никто не интересуется. Бывает и так. Однако, как правило, в параллельные программы вкладывается слишком много средств (времени, усилий, финансовых затрат), чтобы просто так об этом забыть и начать разработку заново. Хочется перенести накопленный багаж на новую компьютерную платформу. Скорее всего, на новом компьютере старая программа рано или поздно работать будет, и даже будет давать правильный результат. Но дает ли выбранная технология гарантии сохранения эффективности параллельной программы при ее переносе с одного компьютера на другой? Скорее всего, нет. Программу для новой платформы нужно оптимизировать заново. А тут еще разработчики новой платформы предлагают вам очередную новую технологию программирования, которая опять позволит создать выдающуюся программу для данного компьютера. Программы переписываются, и так по кругу в течении многих лет.

Выбор технологии параллельного программирования — это и в самом деле вопрос не простой. Если попытаться сделать обзор средств, которые могут помочь в решении задач на параллельном компьютере, то даже поверхностный анализ приведет к списку из более 100 наименований: НОРМА, Т-система, ARCH, А++/Р++, ABCL, Ad!. Ada, ATLAS, Aztec, BIP, BLACS, BSPlib, BlockSolve95, BERT 77, CVM, Counterpoint, CC++, Charm/Charm++, Cilk, CFX, Cray MPP Fortran, Concurrent Clean, Converse, CODE, DOUG, DEEP, DVM, Erlang, EDPEPPS, FIDAP, FFTW, FLUENT, FM, F—, Fortran 90/95, Fortran D95, Fortran M, Fx, FORGE, GA, GALOPPS, GAMESS, Guassian, GRADE, Haskell, HPVM, HPF, HPC, HPC++, HeNCE, ICC, JIAJIA, JOSTLE, KELP, КАР, LAPACK, LPARX, Linda, Maisie, Mentat, mpC, MPC++, MPI, MPL, Modula-3, NAG, Nastran, NESL, NAMD, OOMPI, OpenMP, Occam, Orca, Opus, P4, Para++, ParJava, Parsec, Parallaxis, Phantom, Phosphorus, Pict, pC++, P-Sparslib, PIM, ParMETIS, PARPACK, PBLAS, PETSc, PGAPack, PLAPACK, PIPS, Pthreads, PVM, Quarks, Reactor, ShMem, SVMlib, Sisal, SR, sC++, ScaLAPACK, SPRNG, TOOPS, TreadMan, Treadmarks, TRAPPER, uC++, Vienna Fortran, VAST, ZPL.

В некоторых случаях выбор определяется просто. Например, вполне жизненной является ситуация, когда воспользоваться можно только тем, что установлено на доступном вам компьютере. Другой аргумент звучит так: "... все используют MPI, поэтому и я тоже буду...". Если есть возможность и желание сделать осознанный выбор, это обязательно нужно делать. Посоветуйтесь со специалистами. Проблемы в дальнейшем возникнут в любом случае, вопрос только насколько быстро и в каком объеме. Если выбор будет правильным, проблем будет меньше. Если неправильным, то тоже не отчаивайтесь, будет возможность подумать о выборе еще раз. Сделав выбор несколько раз, вы станете специалистом в данной области, забудете о своих прежних интересах, скажем, о квантовой химии или вьиислительной гидродинамике. Не исключено, что в итоге вы сможете предложить свою технологию и найти ответ на центральный вопрос параллельных вычислений: "Как создавать эффективные программы для параллельных компьютеров?"

В данной главе мы рассмотрим различные подходы к программированию параллельных компьютеров. Одни широко используются на практике, другие интересны своей идеей, третьи лаконичны и выразительны. Хотелось показать широкий спектр существующих средств, но и не сводить описание каждой технологии до одного абзаца текста. Противоречивая задача. Однако надеемся, что после изучения каждого раздела вы сможете не только проводить качественное сравнение технологий, но и самостоятельно писать содержательные программы.

Знакомясь с различными системами параллельного программирования, обязательно обратите внимание на следующее обстоятельство. Если вы решаете учебные задачи или производственные задачи небольшого размера, вам почти наверняка не придется задумываться об эффективности использования параллельной вычислительной техники. В этом случае выбор системы программирования практически не имеет значения. Используйте то, что вам больше нравится. Но как только вы начнете решать большие задачи и, особенно, предельно большие многовариантные задачи, вопрос эффективности может оказаться ключевым.

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

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

Глава 6

Тонкая информационная структура программ

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

Как свидетельствует история, развитие и использование вычислительной техники постоянно сопровождается одним малоприятным явлением, держащим в напряжении пользователей компьютеров, в особенности наиболее активную их часть. Меняются языки программирования, совершенствуются пользовательские среды. Но каждый раз, как только появляются компьютеры нового типа, приходится модернизировать прикладное программное обеспечение. Иногда изменения незначительны, но чаще всего они оказываются радикальными. Несмотря на оптимистические заверения разработчиков новых языков программирования, в настоящее время нельзя быть уверенным, что программы, написанные на любом из них, будут широко востребованы хотя бы в течение ближайших 3—5 лет. Поэтому необходимо признать тот факт, что еще долгое время пользователи будут вынуждены видоизменять свои программы, подстраивая их под особенности компьютеров. Это обстоятельство заставляет думать о том, как облегчить такой труд. Но прежде всего нужно понять, в каком же направлении следует думать.

Начиная с 60-х годов прошлого столетия увеличение быстродействия компьютеров определяется не столько уменьшением тактового периода элементной базы, сколько принятием новых решений в архитектуре вычислительных систем. При этом ускорение вычислений достигается за счет отображения характерных особенностей программ и алгоритмов в аппаратуре. Уже на раннем этапе были подмечены локальность счета и частое использование лишь небольшого числа данных, выделены основные элементы программ — циклы, ветвления, процедуры и т. п. Это сразу нашло отражение в буферах команд и регистрах, кэш-памяти, аппаратурной организации стека и во многом другом. Одновременно решалась и задача выравнивания скоростей работы различных узлов вычислительных систем (вспомните 1-й закон Амдала как одно из следствий утверждения 2.4. Одни аппаратурные решения практически не требовали программной поддержки (кэш-память), другим необходима динамическая поддержка (виртуальная память), а третьим было достаточно предварительного распределения работы на этапе компиляции после проведения статического анализа программ (прямо адресуемые регистры). Во всем этом проявлялась вполне определенная тенденция: характерные особенности вычислений рано или поздно находили свое отражение в архитектурных особенностях компьютеров, а дополнительные аппаратурные возможности стимулировали развитие новых алгоритмов. В конечном счете задачи решались более эффективно.

Совсем не просто выделить характерные особенности вычислений и доказать, что они требуют аппаратурной поддержки. Не всегда легко оценить и аппаратурные новшества. В связи с этим приведем два примера. В § 4.4 было рассмотрено решение систем линейных алгебраических уравнений с левой треугольной матрицей методом обратной подстановки с порядком суммирования по возрастанию и убыванию индексов. Напомним, что оба алгоритма имели принципиальные различия в свойствах параллельности вычислений. Однако будет совсем не правильно считать характерным свойством проявления параллелизма именно суммирование в порядке возрастания индексов. Ведь если рассмотреть аналогичную задачу с правой тре¬угольной матрицей, то все будет наоборот. Другой пример. В 1953 г. была введена в эксплуатацию отечественная вычислительная машина "Стрела", созданная под руководством известных конструкторов Ю. Я. Базилевского и Б. И. Рамеева. Наряду с обычными машинными командами она имела и так называемые групповые команды. Они позволяли достаточно просто записывать группы операций над содержимым ячеек памяти, номера которых представляли арифметические прогрессии. Исполнялись групповые команды в среднем несколько быстрее, чем те же группы команд, оформленные программно. Однако это ускорение достигалось не за счет использования конвейерности вычислений, а за счет аппаратурной поддержки организации соответствующих циклов. Если бы в то время математики смогли разглядеть в групповых операциях то, что теперь называется векторными операциями, и доказать, что они отражают характерные особенности вычислений, вполне возможно, что первые векторные компьютеры появились бы значительно раньше. Не говоря уже о том, что значительно раньше началось бы внедрение идей параллелизма и конвейерности в разработку новых численных методов. Но групповые операции не получили тогда должного развития. Время было упущено.

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

В течение нескольких десятилетий концепция однопроцессорных компьютеров обращала внимание разработчиков алгоритмов и программ только на две характеристики, связанные с вычислительной техникой, — это общее число операций и объем требуемой памяти. Даже такой важный фактор, как влияние ошибок округления, чаще всего в конкретных разработках выпадал из сферы внимания. Что же касается структурных свойств алгоритмов, например, таких как модульность, то их изучение так и не вышло из зачаточного состояния. Все это в конечном счете привело к тому, что к моменту широкого внедрения параллельных вычислительных систем в практику решения больших задач вычислительная математика оказалась без нужного багажа знаний. Без нужного багажа знаний оказались и смежные науки, в частности, связанные с разработкой алгоритмических языков, компиляторов и архитектуры вычислительных систем.

Можно возражать против таких выводов. Но, подбирая аргументы, давайте перечислять не только достижения. Давайте задавать вопросы, на которые не можем найти ответы. Попробуем докопаться до причин, мешающих их получить. И тогда станет ясно, как мало мы знаем в области параллельных вычислений.

О том, что в этой области действительно имеются серьезные проблемы, говорят и такие факты. Количество работ, посвященных распараллеливанию, на текущий момент исчисляется тысячами. Однако до сих пор не так уже много ясности в том, что же реально сделано, как это можно использовать, где узкие места и что надо делать дальше. Конечно, создано программное обеспечение для конкретных параллельных систем. Однако появление новых систем снова приводит к необходимости пересматривать методы и программы. Созданы компиляторы для новой техники. Но по общему при¬знанию работают они не очень эффективно и полученные с их помощью программы не позволяют полностью использовать возможности параллельных систем.

Некоторую завесу над причиной многочисленных трудностей приоткрывает работа [67]. В ней на большом фактическом материале авторы проанализировали методы выявления параллелизма, заложенные в компиляторы для параллельных вычислительных систем начала 90-х годов прошлого столетия. Оказалось, что сфера применения каждого из методов очень узка. В целом же при анализе индексных выражений компиляторы "спотыкаются" примерно в 85% случаев. Это говорит о том, что при несомненных достижениях в вопросах конструирования высокопроизводительных параллельных систем того времени технология организации на них самих вычислительных процессов была на относительно низком уровне.

С тех пор прошло более 10 лет. За это время появилось много новых идей как в распараллеливании вычислений, так и в организации параллельных процессов. Но ситуация в общем изменяется мало. Для пользователя она скорее даже ухудшается. Языки программирования становятся зависящими от особенностей архитектур вычислительных систем и начинают приобретать черты языков низкого уровня. Например, такие языки, как PVM и MPI по существу уже являются коммуникационными автокодами, хотя и на макроуровне. На пользователя все в большей степени перекладывается забота об эффективности организации вычислительных процессов, включая обнаружение в программах и алгоритмах необходимых свойств параллельности и коммуникационных свойств.

Постоянная нехватка должной поддержки со стороны языков программирования, компиляторов и операционных систем в обеспечении эффективности процессов решения задач привела к созданию специализированных программных комплексов по анализу пользовательских программ и их преобразованию под требования конкретных параллельных языков программирования и собственно паралельных вычислительных систем. Эти комплексы реализуются на автономных компьютерах и не связаны с компиляторами целевых вычислительных систем. Поэтому на них могут быть реализованы самые передовые методы исследования и преобразования программ. Представляя собою автономные программные системы, указанные комплексы оказались удобным инструментом для выполнения различных работ, когда программы одного вида нужно перевести в эквивалентные программы другого вида. Среди зарубежных автономных систем наиболее известна система Parafrase и созданная на ее основе серия пакетов КАР [47, 52, 58], а также система Forge [62]. Среди отечественных — система V-Ray [65].

Работа с автономными системами по исследованию и преобразованию пользовательских программ выявила ряд интересных обстоятельств. Во-первых, с помощью таких систем можно значительно уменьшить время реализации программ на параллельных вычислительных системах. По сравнению с тем временем, которое показывают программы, пропущенные через штатные компиляторы без предварительной оптимизации, почти всегда удается получать ускорение в несколько раз. Ускорение удается получать даже в тех случаях, когда программы предварительно оптимизируются вручную. Как правило, оно тем больше, чем больше и сложнее исходные пользовательские программы. Во-вторых, для достижения предельно возможного ускорения приходится применять существенно более сложные методы исследования и преобразования программ, чем те, которые традиционно включаются в компиляторы. Сейчас они настолько сложны, что об их ручном применении не может быть и речи. Однако для компьютерного и, тем более, автономного использования эти методы вполне приемлемы. И, наконец, работа с автономны¬ми системами отчетливо высветила тот факт, что для успешного освоения вычислительных систем параллельной архитектуры пользователям необходимо иметь возможность получать самые подробные сведения о самых различных деталях структуры своих алгоритмов и программ.

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

Развивая наши исследования, мы будем уделять особое внимание анализу записей алгоритмов с помощью математических соотношений и в виде программ на последовательных языках. Объясняется это тем, что именно в этих формах записана большая часть мирового багажа алгоритмических знаний. К данному багажу приходится обращаться очень часто и не только в связи с освоением вычислительной техники параллельной архитектуры. Поэтому всегда полезно знать о нем как можно больше. Наш основной интерес будет связан, конечно, с анализом этого багажа с точки зрения выявления возможностей лучшей организации параллельных вычислительных процессов. Проводя анализ, мы будем формально изучать только тексты программ и описывающие алгоритмы математические соотношения и без особых оговорок не будем использовать какие-либо дополнительные сведения.

§ 6.2. Выбор класса программ

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

В качестве средства описания алгоритмов выберем подмножество языка Fortran. Этот выбор объясняется следующими соображениями. Мы будем изучать тонкую структуру алгоритмов на уровне связей между отдельными операциями. Тонкая структура весьма чувствительна к мельчайшим изменениям алгоритма. Например, уже отмечалось, что изменение порядка выполнения операций в пределах действия законов коммутативности, ассоциативности и дистрибутивности при точных вычислениях может очень сильно изменить результат, если реально операции приходится выполнять в условиях влияния ошибок округления. Поэтому порядок выполнения операций алгоритма должен быть описан максимально точно. Обязательность описания порядка присутствует в языках программирования. Этому условию удовлетворяет не один язык Fortran, но и такие популярные в настоящее время языки как С\С++ и ряд других. Дополнительным аргументом в пользу выбора языка Fortran является то, что именно на нем записана большая часть алгоритмического багажа в мире. Несмотря на многочисленные попытки разработчиков новых языков программирования "похоронить" язык Fortran, он продолжает активно использоваться до сих пор, особенно в сфере решения научно-технических задач. К тому же, этот язык близок по своей форме к математическим соотношениям, к которым мы планируем обратиться позднее. И, наконец, забегая несколько вперед, скажем, что будем использовать такое подмножество языка Fortran, которое с точностью до обозначений присутствует во всех языках программирования. В этих условиях выбор языка почти безразличен.

Однако совсем не безразличен выбор класса программ. Интуитивно ясно, что он должен существенно отличаться от тесно вложенных гнезд циклов. Но совсем не ясно, в какую сторону и насколько. Чтобы ответить на многочисленные вопросы, были собраны данные по реально используемым программам с помощью специальной системы статистического анализа [17]. В качестве объекта исследований был взят набор программ на Fortran, написанных для решения задач минимизации, линейной алгебры и математической физики. Суммарный объем выборки составил более 12 ООО инструкций языка. В работе над исследуемыми программами, т. е. в их написании и отладке, принимало участие достаточно много людей из разных коллективов. Поэтому случайные отклонения, вызванные индивидуальными стилями программирования, не могли сильно повлиять на итоговую статистику. Статистика собиралась так, чтобы получить информацию о наиболее типичных конструкциях и частоте их появления. Кроме этого, на типичных конструкциях отрабатывалась и совершенствовалась методология анализа структуры программ. Вот некоторые из результатов.

Структура вхождений DO-циклов. Фиксировались все формы вложенности операторов DO (DO-циклов). Сложные конструкции дополнительно разбивались на составные части по их вложенности, которые также включались в общую статистику. Выяснилось, что тесно вложенных гнезд циклов всего около 7%, причем такие гнезда с вложенностью 3 и более не встречались ни разу. Учитывая популярность тесно вложенных гнезд в исследовательских работах, была дополнительно определена доля программ, в которых хотя бы просто содержались подобные гнезда. Результат оказался еще хуже. Это говорит о том, что методы, ориентированные только на тесно вложенные циклы, не будут иметь большой перспективы. Интересным оказалось то, что около 40% всех конструкций представляют собой циклы, в тело которых линейно входит большое число других циклических конструкций. В среднем около 5, а максимальная последовательность состояла из 19 конструкций. Примерно в 20% случаев отдельные срабатывания тел одиночных циклов оказались независимыми друг от друга только за счет несовпадения идентификаторов входов и выходов операторов.

Мощность и внешняя вложенность DO-циклов. Рассматривались все операторы цикла DO и для каждого определялись две характеристики, позволяющие хотя бы приблизительно оценить вклад фрагмента в общее время счета. Первая — внешняя вложенность. Она определяется глубиной погружения в другие циклы и равна числу циклов, охватывающих данный оператор. Вторая — мощность. Она равна максимальной глубине вложенности входящих в цикл операторов относительно рассматриваемого оператора DO. Мощность любого цикла не меньше единицы, в то время как внешняя вложенность может быть равной нулю. Проведенное исследование говорит о том, что реальные циклические конструкции не являются даже правильными гнездами и содержат по несколько других операторов цикла на каждом уровне. Например, в анализируемом мате¬риале имелось 119 циклов внешней вложенности 0 и мощности 2, но 280 циклов внешней вложенности 1 и мощности 1. Это значит, что для проведения эффективного анализа необходимо разрабатывать и использовать методы, умеющие исследовать совместное функционирование линейно расположенных циклических конструкций.

Количество максимально вложенных циклов. Была сделана попытка определить число наиболее критичных по времени счета мест в программе. Для этого сначала определялась мощность программы как наибольшая мощность ее циклических конструкций. Затем по каждой мощности определялась доля программ, имеющих 1, 2, 3 и более максимально вложенных циклов. Обнаружен довольно интересный факт — доля программ, содержащих более одного критического фрагмента, достаточно велика. В частности, среди программ мощности 3 свыше 20% имеют 6 и более циклических конструкций максимальной вложенности.

Структура тел внутренних циклов. Исследовалось, какие типы операторов входят в самые внутренние циклы, т. е. циклы мощности 1. Статистика собиралась раздельно по циклам с различной внешней вложенностью, чтобы выявить структуру наиболее значимых по времени счета фрагментов. Обнаружено, что с ростом глубины вложенности заметно растет доля циклов, тела которых содержат только операторы присваивания. Например, для циклов глубины вложенности 1 эта доля составляет 73%, для циклов глубины вложенности 3 — 93%. Следовательно, циклическим конструкциям с телами циклов, состоящими только из операторов присваивания, необходимо уделять особое внимание.

Структура вхождения альтернативных операторов. Альтернативные операторы осуществляют выбор дальнейшего действия в зависимости от выполнения некоторого условия. В статистике учитывались условные операторы, вычисляемый переход и переход по предписанию. Проверялось, задают ли альтернативные операторы ветвления в рамках тела данного цикла или же возможен побочный выход из цикла и соответственно прекращение его выполнения. Одновременно определялось, насколько часто в программах встречались безусловные фрагменты. Важным выводом является то, что относительно немного циклов имеют побочный выход. Это дает уверенность в их хорошей исследуемости.

Выбирая класс анализируемых программ, приходится решать две противоречивые задачи. С одной стороны, хотелось бы его взять как можно более широким, с тем чтобы он покрывал значительную часть, а в идеале даже все практически встречающиеся программы или их наиболее значимые фрагменты. С другой стороны, чем шире класс программ, тем меньше надежды на то, что для любой его программы удастся провести одинаково глубокий анализ. Умение, граничащее с искусством и удачей, состоит в нахождении "золотой середины". Проведение только что описанного статистического анализа как раз и было направлено на ее поиск. После некоторых как удачных, так и неудачных попыток было решено класс анализируемых программ сделать двухуровневым. Первый или базовый уровень образует строго описанный так называемый линейный класс. Для любой его программы проводится самый тщательный анализ информационной структуры. Второй уровень открытый. В него входят все программы, которые каким-либо способом сводятся к программам базового уровня.

Всюду в дальнейшем, если не сделано специальных оговорок, будем считать, что алгоритм записан с помощью следующих средств языка:

□ в программе может использоваться любое число простых переменных и переменных с индексами;

□ единственным типом исполнительного оператора может быть оператор присваивания, правая часть которого есть арифметическое выражение; допускается любое число таких операторов;

□ все повторяющиеся операции описываются только с помощью циклов DO; структура вложенности циклов может быть произвольной; шаги изменения параметров циклов всегда равны +1; если у цикла нижняя гра¬ница больше верхней, то цикл не выполняется;

□ допускается использование любого числа условных и безусловных операторов перехода, передающих управление "вниз" по тексту; не допускается использование побочных выходов из циклов;

□ все индексные выражения переменных, границы изменения параметров циклов и условия передачи управления задаются, в общем случае, неоднородными формами, линейными как по параметрам циклов, так и по внешним переменным программы; все коэффициенты линейных форм являются целыми числами;

□ внешние переменные программы всегда целочисленные, и вектора их значений принадлежат некоторым целочисленным многогранникам; конкретные значения внешних переменных известны только перед началом работы программы и неизвестны в момент ее исследования.

Программы, удовлетворяющие описанным условиям, будем называть линейными или принадлежащими линейному классу. Они и будут предметом всех наших исследований. Особая специфика записи операторов не нужна. Если требуется приблизить форму записи алгоритмов к математической, то будем писать индексы переменных так же, как в математических соотношениях, т. е. справа от переменной снизу и/или сверху. Если же нужно анализировать фрагменты конкретных реальных программ, то будем брать их такими, какие они есть. При этом, возможно, придется использовать прямые заглавные буквы, писать индексы рядом в скобках и т. д.

Здесь уместно сделать одно замечание относительно терминологии. Обычно под переменной с индексами понимается весь массив простых переменных, объединенных общим идентификатором. При изучении тонкой структуры программы такая "групповая" переменная очень неудобна. Гораздо удобнее рассматривать массив как группу простых переменных, идентификаторы которых составлены из идентификатора массива и индексов. Всюду в дальнейшем мы будем понимать под переменной с индексами отдельный элемент массива, а не весь массив.

Как показывает статистика, многие значимые фрагменты практически используемых программ непосредственно принадлежат линейному классу. По своему выбору линейный класс не претендует на особую широту, хотя даже он намного перекрывает все типы программ, которые изучаются в рамках аналогичных подходов. Далее будет показано, что линейный класс может быть исследован полностью. Кроме этого, в главе 8 мы установим, что существуют многочисленные приемы, позволяющие сводить к линейным фрагменты программ, формально не принадлежащие к линейному классу. Согласно статистике, учитывая все такие приемы, удается привести к линейному классу более 90—95% текста практически используемых программ. В целом среди программ на последовательных языках линейный класс играет примерно такую же роль, как линейная алгебра в численных методах, линейное программирование в экстремальных задачах, линейные задачи математической физики в нелинейных процессах и т. п.

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

Глава 7

Эквивалентные преобразования программ

В предыдущей главе мы познакомились с фундаментальными основами изучения тонкой информационной структуры алгоритмов и программ. Они были связаны с введением и построением минимальных графов зависимостей. Даже первые исследования показали, что эти графы несут много полезных сведений. Одной из целей обращения к тонкой структуре является поиск новых способов описания алгоритмов, более приспособленных к использованию на различных вычислительных системах, чем традиционные записи на последовательных, расширенных или параллельных языках программирования. Собственно говоря, данный поиск идет постоянно на протяжении всей истории развития программирования. Просто сейчас становится ясно, что каким-то образом в нем должна более полно учитываться информация о структуре алгоритмов. В конце концов, не так важно, в какую конкретную форму будут облечены новые способы. Важно лишь, чтобы они были приемлемы для пользователей и не требовали от него предоставления сведений о компьютерно-зависимых свойствах алгоритмов. Вся необходимая информация должна автоматически получаться только из описания алгоритмов в процессе либо компиляции, либо предварительной их обработки с помощью автономных систем.

О некоторых возможностях получения такой информации пойдет речь в настоящей главе. Более детально будут рассмотрены две идеи. Одна из них связана с представлением минимальных графов зависимостей в виде векторных полей в линейном пространстве итераций. Такие поля в математическом анализе часто исследуются с помощью параметризованных семейств гладких многообразий, покрывающих в совокупности все пространство. Основной момент исследований состоит в изучении пересечения отдельных векторов с отдельными многообразиями при изменении параметра. В качестве семейства многообразий мы будем брать поверхности уровней скалярных функций. Другая идея связана с преобразованиями программ, которые приходится выполнять после получения необходимых сведений. Мы будем разбираться, какие преобразования можно делать, какие нельзя и почему.

§ 7.4. Наиболее распространенные преобразования программ

Рассмотрим кратко некоторые преобразования, получившие наиболее широкое применение на практике. Проведенные выше исследования позволяют значительно упростить изучение возможности их использования. Если для преобразуемой программы известны нужные графы зависимостей, то в большинстве случаев удается точно ответить на вопрос, можно или нельзя выполнять то или иное преобразование. Здесь мы коснемся лишь математических особенностей преобразований и не будем обсуждать особенности, связанные с учетом деталей архитектуры параллельного компьютера.

Прежде чем переходить к рассмотрению конкретных преобразований, сделаем одно уточнение. Общие исследования, проведенные в § 7.3, не связывали преобразование пространства итераций и установление в новом пространстве лексикографического порядка перебора точек. Это определялось тем, что в общих исследованиях не фиксировалась форма записи преобразованной программы. При рассмотрении конкретных преобразований ситуация иная. Теперь форма записи преобразованной программы фиксируется.

Она определяет лексикографический порядок в новом пространстве итераций. Поэтому при обсуждении эквивалентности преобразований мы будем принимать во внимание только одно соответствие между пространствами итераций преобразуемой и преобразованной программ. Именно то, которое определяется конкретным рассматриваемым преобразованием. На преобразованном пространстве итераций мы будем считать заданным вполне определенный лексикографический порядок. Именно тот, который диктуется формой записи преобразованной программы.

Перестановка циклов

Преобразование состоит в перестановке местами каких-либо двух циклов в тесно вложенном гнезде циклов. Не ограничивая существенно общность, можно считать, что первый (самый внешний) цикл переставляется с k-ым. Для установления эквивалентности преобразования по графу алгоритма можно воспользоваться критериями, сформулированными в утверждениях 7.6, 7.9. Чтобы применить эти критерии, нужно быть уверенным в том, что перестановка 1-ой и k-ой координат точек пространства итераций переводит лексикографически правильную дугу в лексикографически правильную. Легко проверить, что для выполнения данного условия достаточно, чтобы к-ая координата конечной вершины дуги была больше k-ой координаты начальной вершины. Если графы зависимостей для гнезда циклов представлены линейными функциями на линейных многогранниках, то соотношение между координатами устанавливается весьма просто.

В частности, всегда можно переставлять рядом стоящие циклы, имеющие по всем зависимостям тип ParDO. После перестановки свойство ParDO сохраняется у обоих циклов. Если возможна перестановка 1-го цикла с k-ым и 1-ый цикл имеет тип ParDO, то после перестановки тип ParDO будет иметь k-ый цикл. Пусть самый внешний цикл имеет тип ParDO по всем зависимостям. Его всегда можно переставить со вторым циклом. Новый второй цикл будет также иметь тип ParDO по всем зависимостям. Поэтому его можно переставить с третьим циклом и т. д. Это означает, что любой цикл ParDO всегда можно поставить в тесно вложенном гнезде на любое более глубокое место. При этом свойство ParDO сохраняется. В противоположность этому, в общем случае переставлять внутренний цикл ParDO "наружу" нельзя.

Область изменения параметров циклов в гнезде описывается треугольными соотношениями. В случае перестановки 1-го и k-го циклов новая область, вообще говоря, будет иметь более сложное описание. Единственным исключением является ситуация, когда границы изменения k-го параметра не зависят от других параметров. Тогда новая область также описывается треугольными соотношениями.

Слияние циклов

Рассмотрим две подряд идущие циклические конструкции с одинаковыми (с точностью до обозначения параметров) самыми внешними циклами. Преобразование заключается в слиянии этих конструкций в одну. Она представляет прежний внешний цикл, тело которого образовано из подряд идущих тел внешних циклов исходных конструкций. Для эквивалентности преобразования снова потребуем, чтобы лексикографически правильная дуга графа зависимостей преобразовывалась в лексикографически правильную. Очевидно, что нужно рассмотреть только те дуги, которые идут из точек пространства итераций первой циклической конструкции в точки пространства итераций второй циклической конструкции. Для всех остальных дуг это требование выполняется при преобразовании автоматически. Для того чтобы оно выполнялось и для рассматриваемых дуг, достаточно, чтобы первые координаты начальных вершин не превосходили первые координаты конечных вершин. Имея явные формулы для дуг, это проверить несложно.

Допустим, что внешние циклы сливаемых конструкций имеют тип ParDO. Если для дуг, которые идут из точек пространства итераций первой циклической конструкции в точки пространства итераций второй циклической конструкции, первые координаты начальных и конечных вершин совпадают, то внешний цикл преобразованной конструкции будет иметь тип ParDO.

Переупорядочивание операторов

Преобразование состоит в выполнении последовательности перестановок местами пар операторов или циклов в пределах ближайшего объемлющего их цикла. Допустим, что построен граф зависимостей для тела объемлющего цикла. Зафиксируем любую пару переставляемых объектов и рассмотрим все дуги, у которых хотя бы один из концов принадлежит опорным пространствам (или опорному пространству, если в объекте имеется только один оператор) одного из объектов. Для того чтобы перестановка объектов была преобразованием, эквивалентным по графу алгоритма, достаточно, чтобы при ее выполнении не менялось соотношение между номерами опорных пространств, содержащих концевые вершины дуг. Другими словами, если дуга шла, например, из пространства с большим номером в пространство с меньшим номером, это соотношение должно сохраняться и после перестановки, и т. п. Данное преобразование сохраняет циклы ParDO.

Распределение цикла

Это преобразование является обратным по отношению к преобразованию слияния циклов. Пусть задан некоторый цикл. Построим для него граф зависимостей. Допустим, что после переупорядочивания в теле цикла его можно представить в виде двух подряд идущих фрагментов, и нет ни одной дуги, идущей из опорных пространств второго фрагмента в опорные пространства первого фрагмента. Тогда цикл можно представить в виде двух подряд идущих циклических конструкций. Самые внешние циклы у них совпадают. Телом первого цикла является первый фрагмент, телом второго — второй фрагмент. Если преобразуемый цикл имел тип ParDO, то тип

ParDO будут иметь оба внешних цикла преобразованной программы. Оба внешних цикла или один из них могут иметь тип ParDO и в том случае, когда таковым не является преобразуемый цикл.

 Скашивание цикла

Это преобразование направлено на выявление и использование параллелизма, отличного от задаваемого циклами типа ParDO. Как правило, оно связывается с параллельными множествами, расположенными в линейных многообразиях пространства итераций. В специальной литературе можно найти много различных предложений по реализации таких преобразований. Однако все они ориентированы на какие-то частные случаи.

Расщепление пространства итераций

Преобразование заключается в представлении цикла в виде двух подряд идущих циклов. Тела обоих циклов совпадают с телом преобразуемого цикла. Нижняя (верхняя) граница изменения параметра первого (второго) цикла также совпадает с соответствующей границей исходного цикла. Поэтому нужно найти лишь верхнюю (нижнюю) границу первого (второго) цикла. Эти границы должны удовлетворять следующим условиям: нижняя граница второго цикла должна быть строго больше верхней границы первого цикла и обе границы должны находиться между границами преобразуемого цикла. Во всем остальном выбор границ произволен. Очевидно, что достаточно найти только верхнюю границу первого цикла. Если исходный цикл имел тип Pa г DO, то при любом способе нахождения границы оба получаемых цикла будут иметь тип ParDO. Оба получаемых цикла или один из них могут иметь тип Pa г DO и в том случае, когда таковым не является преобразуемый цикл.

Выполнение итераций цикла в обратном порядке

Формально преобразование заключается в перемене местами верхних и нижних границ изменения параметра какого-нибудь цикла программы и замене шага изменения параметра этого цикла с +1 на —1. Снова воспользуемся критериями утверждений 7.6, 7.9. Допустим, что существует хотя бы одна дуга истинных зависимостей, антизависимостей или зависимостей по выходу, связывающая две итерации преобразуемого цикла исходной программы. При рассматриваемом преобразовании образы этих дуг не будут лексикографически правильными. Поэтому все такие дуги должны отсутствовать. Это означает, что преобразуемый цикл должен иметь тип ParDO по объединению графов алгоритма, антизависимостей и зависимостей по выходу. Согласно исследованиям, проведенным в §6.7, итерации такого цикла вообще можно выполнять в любом порядке, а не только в обратном.

Выделение стандартных операций

Преобразование состоит в поиске в тексте программы одинаковых фрагментов и подстановки на их места обращений к оптимизированной процедуре. Основная трудность связана с установлением факта эквивалентности фрагментов. Для решения этого вопроса можно воспользоваться критериями утверждений 7.6, 7.9.

Среди преобразований программ, связанных с изменением координат точек пространства итераций, наиболее простыми являются те, которые не нарушают лексикографического отношения. Основой построения таких преобразований служит утверждение 6.5.

Треугольные преобразования

Будем считать, что каждое опорное пространство преобразуется само в себя. Пусть в i-ом пространстве преобразование имеет вид

z=BiX+bi.           (7.10)

Здесь Вi есть левая треугольная целочисленная матрица с единичными диагональными элементами. Она не зависит от внешних переменных программы. Координаты вектора bi могут быть линейными неоднородными функциями от внешних переменных, имеющими целочисленные коэффициенты. Вектор х задает координаты точки в старой системе координат, вектор z — в новой. Согласно утверждению 6.5, преобразование (7.10) сохраняет лексикографическое отношение между точками пространства. Дополнительные условия целочисленности гарантируют, что образы и прообразы целочисленных точек для преобразования (7.10) будут целочисленными.

Если i-ое и j-oe опорные пространства не имеют общих параметров циклов, то матрицы и свободные члены в преобразованиях этих пространств могут быть не связаны между собой. Если же общие параметры имеются, то после преобразования программы одинаковые значения общих параметров должны перейти в одинаковые, разные — в разные. Пусть i-ое и j-oe опорные пространства имеют r общих параметров. Будем считать, что первые r строк матриц Bi и Bj попарно совпадают, так же как и первые r координат векторов bi и bj.

Построим для всех опорных пространств преобразования вида (7.10) с указанными особенностями матриц Bi и векторов bi. Назовем такие преобразования треугольными. Выразим из соотношений (7.10) старые параметры хк через переменные zj и подставим всюду в текст программы вместо старых параметров соответствующие выражения. Приведем границы изменения новых параметров цикла к стандартной форме. Очевидно, что новый текст представляет описание программы из линейного класса. Соответствие между пространствами итераций исходной и преобразованной программ сохраняет по построению лексикографическое отношение. Выполненное преобразование программы удовлетворяет всем условиям описанного выше специального преобразования. Поэтому новая программа будет эквивалентна исходной по графу алгоритма и, следовательно, будет сохранять результаты реализации программы при одних и тех же входных данных.

Формальная запись новой программы получается из старой с помощью замены всех вхождений параметров циклов их выражениями, полученными из соотношений (7.10). Однако лишь этого факта было бы недостаточно для обеспечения эквивалентности преобразования программы. Чтобы формальная замена параметров циклов привела к эквивалентной программе, нужно на преобразования (7.10) наложить какие-то ограничения. Они могут быть такими, какие имеют треугольные преобразования, но могут быть и другими.

Любое треугольное преобразование переводит независимые точки пространства итераций в независимые, зависимые — в зависимые того же типа. Отсюда, в частности, следует

Утверждение 7.10

Любое треугольное преобразование переводит цикл ParDO в цикл ParDO и сохраняет его тип. Никаких новых циклов ParDO при треугольном преобразовании появиться не может.

Само по себе треугольное преобразование не несет большой самостоятельной смысловой нагрузки. Однако оно имеет важное значение как предварительное преобразование перед выполнением каких-то других преобразований. С помощью треугольных преобразований можно сделать более явными некоторые структурные свойства программы. Например, в программе не виден параллелизм, задаваемый с помощью разверток. Не видно даже, какие точки пространства итераций относятся к одной поверхности уровня развертки, а какие к разным. Выполняя специальным образом подобранное треугольное преобразование, можно сделать подобную информацию более явной.

Множество используемых на практике преобразований постоянно расширяется. Этому процессу в немалой степени способствует появление компьютеров новой архитектуры. Многие преобразования не требуют для своей реализации серьезного математического обоснования. К ним относятся, например, следующие: вынесение за пределы цикла нескольких первых или последних итераций, объединение нескольких циклов тесно вложенного гнезда в один, дублирование тела цикла несколько раз с одновременным уменьшением во столько же раз числа повторений цикла, полная раскрутка цикла по всем итерациям, преобразование одномерного цикла в двумерную циклическую конструкцию, генерация нескольких вариантов для какого-то фрагмента с выбором конкретного варианта во время исполнения программы и многие другие.

С некоторыми другими преобразованиями программ, в особенности с теми, которые требуют математического обоснования, можно познакомиться в книге [6].

ЧАСТЬ III

СМЕЖНЫЕ ПРОБЛЕМЫ И ПРИМЕНЕНИЕ

Глава 8

Вычислительные системы и алгоритмы

Бурное развитие микроэлектроники позволило достичь к концу 70-х годов прошлого столетия невиданного ранее скачка в развитии вычислительной техники. Стали функционировать вычислительные системы с производительностью в несколько сотен миллионов операций в секунду, мощность проектируемых систем определялась миллиардами операций. Появились многочисленные устройства, позволяющие очень быстро решать различные простые задачи, такие как матричные и векторные преобразования, быстрое преобразование Фурье, обработка сигналов, распознавание простейших изображений и т. п. Основной целью создания этих устройств было ускорение и упрощение процесса решения конкретных задач. Каждое из них имело свою собственную архитектуру, и не было почти ничего общего между различными устройствами. Тем не менее, эти очень скромные по современным понятиям успехи уже тогда привели к появлению весьма дерзкой мысли о возможности в будущем построения заказных специализированных вычислительных систем, ориентированных на эффективное решение конкретных задач.

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

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

Основные трудности развития нового направления связаны с отсутствием строгих математических постановок нужных задач. Обсуждения, проведенные в главах 2, 3 этой книги, говорят об огромном числе различных факторов, влияющих на выбор структуры компьютеров. В свою очередь, данное обстоятельство приводит к большому разнообразию самих компьютеров. Только число названий классов вычислительной техники измеряется десятками: векторные, конвейерные, многопроцессорные, систолические, программируемые и т. п. В каждом классе имеется немало существенно различных представителей. Поэтому нельзя надеяться на разработку в ближайшее время математической модели, сколько-нибудь адекватно отражающей процессы функционирования хотя бы основного множества компьютеров. Тем не менее, во всех представителях из всех классов можно увидеть применение нескольких идей, решающим образом влияющих на производительность. Это, в первую очередь, — параллелизм и конвейерность вычислений, иерархическая структура памяти, использование коммутаторов и коммуникационных сетей для связи функциональных устройств между собой. Ясно, что как минимум, эти идеи должны находить свое отражение в структуре численных методов.

Вычислительная техника и алгоритмы — это две опоры, на которых строится проблема отображения. Но как бы не велики были достижения в области развития вычислительной техники, она является всего лишь инструментом для решения прикладных задач. Инструментом, который создается и совершенствуется по своим законам, определяемым успехами микроэлектроники, авторскими идеями, чьими-то амбициями и много чем другим, не всегда даже полезным при проведении практических расчетов. Инструментом, который почти всегда претендует на универсальность своего использования и поэтому почти всегда используется с трудом при решении конкретных задач. Как уже отмечалось, создание общей математической модели процессов функционирования компьютеров кажется делом маловероятным. Поэтому представляется вполне естественным, что продвижение в проблеме отображения должно начинаться с разработки фундаментального математического аппарата, позволяющего описывать и исследовать детальную структуру алгоритмов. Структуру, показывающую, как в процессе реализации алгоритма отдельные его операции связаны между собой и с памятью компьютера.

Об этом аппарате мы уже говорили в главах 6 и 7. Однако изучение проблемы отображения начиналось не с него. По мере ее осмысления большое беспокойство вызывало отсутствие базового математического формализма, помогающего оценивать качество работы многих функциональных устройств и соответственно этому предлагать те или иные схемы реализации алгоритмов. Дело в том, что одновременное использование многих функциональных устройств является одной из центральных идей, позволяющих получить дополнительное ускорение процесса решения задач. Для оценки их работы были введены различные характеристики, такие как пиковая производи¬тельность, реальная производительность, ускорение, эффективность, загруженность и т. п. Работа [43] и подобные ей говорят о том, что в понимании этих характеристик существует большой произвол, а это, в свою очередь, делает невозможным проведение строгих исследований. Поэтому всем та¬ким характеристикам необходимо было придать четкий математический смысл. Точные определения и аккуратные выводы в базовом формализме даны в § 2.3. Они позволили заложить математическую основу в изучение процессов функционирования сложных вычислительных систем. Точное определение основ делает возможным получение точных выводов. Мы пока¬зали это в § 2.3 на примере сравнения оценок Амдала и Густавсона— Барсиса для ускорения.

Была и другая веская причина для аккуратного рассмотрения процесса функционирования многих функциональных устройств. На рубеже 70—80-х годов прошлого столетия в США, а под их влиянием и в Европе, начались активные исследования в области так называемых систолических массивов. Систолические массивы представляют простейшие вычислительные системы с многими функциональными устройствами. Они не имеют памяти и коммуникационной сети, реализуются на одном кристалле и, как утверждалось, исключительно дешевы в изготовлении. Более детально с истинными причинами проявления особого интереса к этим устройствам можно познакомиться в работе [54]. Систолические массивы заинтересовали нас как возможный элемент проблемы отображения. К этому времени уже стала вырисовываться следующая схема ее решения: раскладываем задачу на простейшие, простейшие реализуем с помощью спецпроцессоров, а вычислительная система в целом получалась как объединение этих спецпроцессоров с помощью подходящей коммуникационной сети. Казалось, что на роль спецпроцессоров вполне могут подойти систолические массивы. Однако определенные сомнения оставались. Каждый отдельный систолический массив мог реализовывать только один алгоритм, причем относительно простой. Набор алгоритмов, подлежащих реализации, был совершенно не ясен. Его мы надеялись установить, анализируя программы пользователей с помощью системы V-Ray, которая к тому времени уже начинала создаваться. Но отсутствовала конструктивная методология построения систолических массивов, соответствующих заданному алгоритму. По существу, ее еще предстояло создать. Для решения всех этих вопросов также необходимо было изучать работу большого числа устройств.

Таким образом, ключевым моментом в решении проблемы отображения оказался анализ структуры алгоритмов. Ответ на вопрос, какие алгоритмы необходимо изучать в первую очередь, дан в §§4.3, 4.4. Это алгоритмы, записанные на языках программирования. Аппарат исследования программ, описанный в главах 6, 7 и система V-Ray, реализующая данный аппарат, являются основным инструментом выделения в прикладных профаммах тех структур, которые должны будут реализовываться специальным образом. Остается только решить, какие именно структуры надо выделять.

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

При разработке методологии построения математических моделей систолических массивов [14] было установлено, что на подобных вычислительных системах успешно реализуются алгоритмы, фафы которых устроены регулярно. С другой стороны, анализ информационной структуры большого числа алгоритмов с помощью системы V-Ray показал, что в очень многих случаях их фафы сводятся именно к регулярным. При этом важно отметить, что часто разные алгоритмы имеют либо одни и те же, либо очень похожие фафы. Это наблюдение позволило нам выдвинуть гипотезу, что в реально используемых профаммах основные вычислительные ядра имеют информационные связи, принадлежащие небольшому по численности набору типовых структур. Пока эта гипотеза не опровергнута. Более того, она постоянно находит новые подтверждения, особенно при анализе сходных задач. Любые свойства типовых информационных структур, в том числе параллельные, возможно исследовать заранее. Поэтому, зная состав типовых информационных структур в конкретных профаммах и их связь между собой, можно заранее сказать, какова наиболее подходящая архитектура вычислительной системы в данном случае и насколько эффективно данные профаммы будут реализованы на конкретном компьютере. Перспектива стоит того, чтобы подобными исследованиями заниматься серьезно.

Помимо достижения очевидной цели, направленной на повышение эффективности использования вычислительной техники, исследование информационной структуры алгоритмов постепенно стало формировать и другую цель, значительно более фундаментальную. Хотелось понять, какое место занимают параллельные вычисления среди тех наук, которые так или иначе определяют процессы функционирования сложных компьютерных систем. Конечно, в первую очередь мы интересовались математическими науками. Выяснилось любопытное обстоятельство [10]. Оказалось, что некоторые задачи, связанные с алгоритмами, но внешне не имеющие никакого отношения к параллельным вычислениям, могут быть, тем не менее, точно описаны таким образом, что информационная структура алгоритмов становится определяющим элементом описания. Например, задачи восстановления линейного функционала, вычисления значений градиента, оценивания величины ошибок округления результатов промежуточных вычислений и многие другие могут быть сформулированы в терминах нахождения решения системы линейных алгебраических уравнений. По структуре ненулевых элементов матрицы этих систем очень похожи на матрицу смежностей графа алгоритма. Так как граф алгоритма не имеет петель, то перестановкой строк и столбцов матрицы систем можно привести к треугольному виду. Исследовать такие системы очень просто. Но из них получаются и нетривиальные выводы. В случае задачи вычисления градиента решение системы "очевидным" способом приводит к методу, сложность которого линейно зависит от размерности пространства. Если ту же систему решать другим способом, то появляется метод быстрого вычисления градиента, сложность которого не зависит от размерности пространства. Многие задачи изучения процессов работы функциональных устройств, в том числе оптимальных процессов, описываются системой линейных неравенств, матрицы которых совпадают с матрицей инциденций графа алгоритма. Это также открывает путь к новым исследованиям.

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

Мы надеемся, что проводимое исследование информационной структуры алгоритмов и проблемы отображения убедят читателя в том, что он имеет дело с весьма сложным междисциплинарным предметом, обладающим разветвленными связями с самыми различными областями знаний. А параллельные вычисления являются всего лишь одним из акцентов в изучении этого предмета.

Глава 9

Пользователь

в среде параллелизма

Если ничто не помогает, прочтите,

наконец, инструкцию.

Из законов Мерфи

Параллельные вычисления универсальны. Они могут использоваться в любой области науки, где традиционного последовательного способа обработки данных недостаточно и необходимо существенно ускорить процесс вычислений. Астрофизика, аэро- и гидродинамика, вычислительная механика, квантовая химия, геофизика и экология, криптография и статистика — эти, как и многие другие области науки нуждаются в высокопроизводительных параллельных компьютерах. Однако практически все ученые, работающие в той или иной среде параллельных вычислений, сталкиваются с общей проблемой: как эффективно использовать параллельные компьютеры? Это и неудивительно. Параллельная вычислительная среда обладает своими особенностями, для работы в ней во многих случаях нужно знать технологии параллельного программирования, параллельные методы решения задач, архитектуру параллельных компьютеров, методы анализа структуры программ и алгоритмов и другие смежные дисциплины, нехарактерные для предметной области ученого: химика, биолога, физика, медика. Понятно, что в такой ситуации успешно "прорваться" через круг возникающих сопутствующих проблем удается далеко не всегда — отсутствие помощи, дополнительных сведений, доступа к ресурсам, полигонов для тестовых испытаний и других сервисных служб среды параллелизма значительно усложняет работу прикладных специалистов.

Эффективное использование параллельных вычислительных систем — это главная проблема параллельных вычислений. Сейчас нет технологических трудностей построить компьютер из тысячи процессоров, но по-настоящему серьезная проблема — сделать его эффективно используемым многими исследователями.

Параллельные вычисления начались с потребностей пользователей в решении больших задач. Развиваясь, они дали жизнь многим направлениям, которые сейчас пытаются быть самостоятельными и независимыми друг от друга. Архитектура параллельных компьютеров, технологии параллельного программирования, параллельные методы решения задач — все это примеры подобных направлений. Конечно, по каждому их них нужно проводить свои собственные исследования. Нельзя только забывать, для чего все это делается. Создали оригинальный язык программирования, а им никто не пользуется. Почему? Разработали новый метод, а для решения практических задач он непригоден. Почему? Установили уникальный компьютер, а на нем никто не считает. Почему? Чаще всего ответы на подобные вопросы следует искать у пользователей.

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

Для анализа структуры исследуемых фрагментов мы будем часто пользоваться возможностями, предоставляемыми системой V-Ray. Эта система разработана на основе теории, изложенной в данной книге (главы 6 и 7), и прошла апробацию в ходе выполнения большого числа реальных проектов и экспериментов с использованием параллельных вычислительных систем.


Заключение

Параллельные вычисления:

интеграция от А до Я

Итак, книга закончена. Мы назвали ее "Параллельные вычисления", безусловно поставив акцент на первом слове. Так чем же все-таки параллельные вычисления принципиально отличаются от просто вычислений? И в чем же, собственно говоря, состоит новизна книги? Ведь в наше время любые вычисления всегда имеют дело с компьютерами, программным обеспечением, численными методами, различными способами нечисловой обработки данных и т. п.

Ответ очень простой. Параллельные вычисления ничего не отрицают из того, что было, есть и будет использоваться в традиционных последовательных вычислениях.

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

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

Параллельные вычисления долгое время не были на острие внимания научной и, в том числе, вычислительной общественности. Мощности индивидуальных однопроцессорных компьютеров росли достаточно быстро, обеспечивая основные потребности большинства областей в решении текущих задач и поспевая в какой-то мере за ростом их сложности. Интерес к параллельным вычислениям сохранялся там, где большие задачи возникли давно. Но, в конце концов, случилось то, что должно было случиться — начался резкий подъем интереса к большим задачам едва ли не всюду. И тут стали обнаруживаться настораживающие обстоятельства: специалистов в области параллельных вычислений катастрофически не хватает; в основной своей массе вузы не готовят кадры, необходимые для постановки и решения больших задач; в области параллельных вычислений нет учебников, учебных пособий и т. д.

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

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

Отмеченная особенность параллельных вычислений связана с их интегрирующей ролью среди самих наук. Но у них проявляется и другая особенность — параллельные вычисления начинают стимулировать интеграцию научного сообщества.

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

Большие параллельные системы устанавливаются пока только в крупных организациях. Обычно здесь уже имеется достаточное количество техники меньшей мощности, накоплен опыт ее эксплуатации и подготовлен ряд больших задач. Как правило, вся техника связана локальной сетью, из которой возможен выход как на большую систему, так и в глобальную сеть. Эксплуатация систем параллельной архитектуры является делом исключительно сложным. Поэтому всегда создается группа сопровождения, состоящая из квалифицированных специалистов разного профиля, объединенных общей идеей — научиться и научить эффективно эксплуатировать новейшую технику, решать на ней большие задачи.

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

Конечно, мы нарисовали несколько идеализированную картину. Для организации подобных групп сопровождения нужны не просто квалифицированные, но и очень активные кадры. Найти или воспитать их не легко. Но усилия на формирование инициативных групп сопровождения затратить стоит. Отдача не заставит себя ждать.

Мы уверены, что параллельные вычисления и все, что их окружает, еще не раз порадуют научное сообщество своими достижениями. Дерзайте, дорогу осилит идущий!

ЧАСТЬ 4

ОРГАНИЗАЦИЯ ПАРАЛЛЕЛЬНЫХ

ЭВМ И СУПЕРСКАЛЯРНЫХ

ПРОЦЕССОРОВ

 ВВЕДЕНИЕ

Одним из основных условий успешного развития современно-

го общества является высокий уровень оснащенности средствами

вычислительной техники. Причем от этих средств требуется быстродействие в сотни миллионов операций в секунду. Такое быстродействие может быть достигнуто за счет элементной базы и параллельной организации ЭВМ. Из-за принципиальных ограничений все труднее становится получать быстродействие первым путем,

поэтому широко распространено создание параллельных ЭВМ различных типов и назначений.

             Под параллельной ЭВМ будем понимать ЭВМ, состоящую из

множества связанных определенным образом вычислительных

блоков, которые способны функционировать совместно и одно-

временно выполнять множество арифметико-логических опера-

ций, принадлежащих одной задаче (программе).

             Понятие "организация параллельных ЭВМ и процессоров"

включает совокупность свойств, определяющих состав и связи

оборудования (структуру ЭВМ), средства программирования (язы-

ки, трансляторы, операционные системы), типы используемых

вычислительных алгоритмов (алгоритмику).

          Существуют различные схемы классификации параллельных

ЭВМ.В некоторых схемах отдельные типы ЭВМ выпадают из числа

параллельных. В частности, по структуре конвейерные ЭВМ могут

быть отнесены к машинам последовательного действия, но они

имеют большую вычислительную мощность и используют параллельную алгоритмику и программирование, поэтому конвейерные

ЭВМ также рассматриваются в данном учебном пособии.

Кроме конвейерных ЭВМ в пособии уделяется внимание организации всех широко распространенных типов ЭВМ: процессорным матрицам, многопроцессорным ЭВМ и машинам с управлением от потока данных.

           Особое внимание уделено процессорам с параллельной организацией: транспьютерам и суперскалярным микропроцессорам ввиду их широкого использования в ПЭВМ и рабочих станциях. Изучение параллельных ЭВМ проводится по всем составляющим понятия "организация": структуре, языковому обеспечению, алгоритмике.

           Конспект лекций  предназначен в первую очередь для магистерской подготовки по направлению « Информатика и ВТ»,  и  для студентов старших курсов, специализирующихся в области вычислительной техники, а также может быть полезно  студентам-математикам, аспирантам, инженерам.  Часть

примеров демонстрирует возможность и особенности применения

параллелизма в широком круге предметных областей. Примеры

математизированы, что позволяет представить их в компактной

форме. Другая часть примеров носит детализирующий характер и

предназначена для всестороннего рассмотрения некоторой структуры или алгоритма.

                       Для усвоения изложенных сведений требуется определенная

подготовка по структурам последовательных ЭВМ, методам вычислительной математики и языкам программирования.

ГЛАВА 11

ПРИНЦИПЫ ПАРАЛЛЕЛЬНОЙ ОБРАБОТКИ

§ 1.1. Формы параллелизма в алгоритмах и программах

                       Известны два основных метода повышения быстродействия

ЭВМ: использование все более совершенной элементной базы и

параллельное выполнение вычислительных операций.

Максимальная вычислительная мощность интегральной схемы определяется выражением [2]

V max = f N/a,

где f — частота переключения вентилей в микросхеме; N — количество вентилей; a — число переключений, необходимых для выполнения одной арифметико-логической операции.

Известно, что энергия переключения полупроводникового

вентиля

E = τ ⋅ p,

где τ и p — время и мощность переключения вентиля соответственно.

Так как N = D/p, где D — допустимая тепловая мощность, рассеиваемая микросхемой, то произведение f N можно выразить

через энергию переключения

f N = D/E.

Данные свидетельствуют о том, что могут быть получены

достаточно большие значения быстродействия. Однако функциональная схема СБИС и БИС обычно реализует принцип действия

последовательных ЭВМ, когда в единицу времени исполняется

только одна команда. При этом в работе участвует лишь малая

часть вентилей микросхемы, и в результате быстродействие такой

последовательной микросхемы Vnc<<Vmax. Поскольку требования к

вычислительной мощности неуклонно растут и превосходят не

только Vnc, но и Vmax, то необходимо научиться использовать всю

потенциальную вычислительную мощность Vmax микросхемы. Более того, по ряду фундаментальных физических и технологических

8

причин не приходится ожидать резкого уменьшения E (роста Vmax).

Следовательно, для увеличения вычислительной мощности ЭВМ

необходимо научиться использовать суммарную мощность множества СБИС и БИС, т. е. применять параллелизм.

Параллелизм — это возможность одновременного выполнения

нескольких арифметико-логических или служебных операций.

В процессе развития вычислительной техники роль параллельной обработки информации менялась. Если ранее применение

параллельных ЭВМ диктовалось необходимостью увеличения надежности оборудования управляющих систем, то современные

параллельные ЭВМ используются для ускорения счета в различных прикладных областях.

Особое значение приобретает параллельная обработка для

ЭВМ пятого поколения, предназначенных для выполнения алгоритмов искусственного интеллекта. Такие алгоритмы часто носят

комбинаторный характер и требуют большой вычислительной

мощности.

На стадии постановки задачи параллелизм не определен, он

появляется только после выбора метода вычислений. В зависимо-

сти от характера этого метода и профессиональной подготовки

пользователя параллелизм алгоритма (то есть количество одно-

временно выполняемых операций) может меняться в довольно

больших пределах.

Параллелизм используемой ЭВМ также меняется в широких

пределах и зависит в первую очередь от числа процессоров, способа размещения данных, методов коммутации и способов синхронизации процессов.

Язык программирования является средством переноса параллелизма алгоритма на параллелизм ЭВМ, и тип языка может в

сильной степени влиять на результат переноса.

Для сравнения параллельных алгоритмов необходимо уметь

оценивать степень параллелизма. Одновременное выполнение

операций возможно, если они логически независимы. Таким образом, описание зависимостей операций по данным полностью определяет параллелизм некоторого метода вычислений.

Программные объекты A и B (команды, операторы, программы) являются независимыми и могут выполняться параллельно,

если выполняется следующее условие:

(InB OutA) (InA OutB) (OutA OutB) = , (1.1)

где In(A) — набор входных, а Out(A) — набор выходных переменных объекта A. Если условие (1.1) не выполняется, то между A и B

существует зависимость и они не могут выполняться параллельно.

Если условие (1.1) нарушается в первом терме, то такая зависимость называется прямой. Приведем пример:

A: R = R1 + R2

B: Z = R + C

Здесь операторы A и B не могут выполняться одновременно,

так как результат A является операндом B.

Если условие нарушено во втором терме, то такая зависимость

называется обратной:

A: R = R1 + R2

B: R1 = C1 + C2

Здесь операторы A и B не могут выполняться одновременно,

так как выполнение B вызывает изменение операнда в A.

Наконец, если условие не выполняется в третьем терме, то такая зависимость называется конкуренционной:

A: R = R1 + R2

B: R = C1 + C2

Здесь одновременное выполнение операторов дает неопределенный результат.

Увеличение параллелизма любой программы заключается в поиске и устранении указанных зависимостей.

Наиболее общей формой представления этих зависимостей

является информационный граф задачи (ИГ). Пример ИГ, описывающего логику конкретной задачи, точнее порядок выполнения

операций в задаче, приведен на рис. 1.1. В своей первоначальной

форме ИГ, тем не менее, не используется ни математиком, ни программистом, ни ЭВМ. На этапе разработки метода вычислений ИГ

представляется в виде формул и блок-схем алгоритма, на этапе

программирования — в виде последовательности операторов на

языке высокого уровня (ЯВУ) или  машинном языке, на этапе счета — в виде порядка выборки команд устройством управления (УУ)

процессора. На каждом этапе логика задачи (ИГ) отображается в

форме, наиболее пригодной для восприятия человеком или машиной.

Однако поскольку на всех уровнях представления задачи логика ее

исполнения неизменна, то ИГ, восстановленные из различных форм

представления конкретной задачи, должны совпадать. Некоторое

отличие копий ИГ возможно за счет введения промежуточных переменных, используемых для удобства записи, работы с памятью и

регистрами. Таким образом, ИГ является внутренней характеристикой любой формы представления задачи.

            Более определенной формой представления параллелизма является ярусно-параллельная форма (ЯПФ) [3]: алгоритм вычислений представляется в виде ярусов, причем в нулевой ярус входят

операторы (ветви), не зависящие друг от друга, в первый ярус —

операторы, зависящие только от нулевого яруса, во второй — от

первого яруса и т. д.

Для ЯПФ характерны параметры, в той или иной мере отражающие степень параллелизма метода вычислений: bi — ширина i-

го яруса; B — ширина графа ЯПФ (максимальная ширина яруса, т.

е. максимум из bi, i = 1, 2, ...); li — длина яруса (время операций) и

L длина графа; ε — коэффициент заполнения ярусов; θ — коэффициент разброса указанных параметров и т. д.

Главной задачей настоящего издания является изучение связи

между классами задач и классами параллельных ЭВМ. Но представление параллелизма в виде большого набора количественных

характеристик ЯПФ сильно затрудняет данную задачу. Поэтому

желательно упростить представление ЯПФ, разделив их на типичные виды, группы, которые в дальнейшем будем называть форма-

ми параллелизма. Форма параллелизма обычно достаточно просто

характеризует некоторый класс прикладных задач и предъявляет

определенные требования к структуре, необходимой для решения

этого класса задач параллельной ЭВМ.

Изучение ряда алгоритмов и программ показало, что можно

выделить следующие основные формы параллелизма: естественный или векторный параллелизм; параллелизм независимых ветвей; параллелизм смежных операций или скалярный параллелизм.

др.

§ 1.3. Основные этапы развития параллельной обработки

Идея параллельной обработки возникла одновременно с появлением первых вычислительных машин. В начале 50-х гг. американский математик Дж. фон Нейман предложил архитектуру последовательной ЭВМ, которая приобрела классические формы и применяется практически во всех современных ЭВМ. Однако фон Нейман разработал также принцип построения процессорной матрицы, в которой каждый элемент был соединен с четырьмя сосед-

ними и имел 29 состояний. Он теоретически показал, что такая

матрица может выполнять все операции, поскольку она моделирует поведение машины Тьюринга.

Практическая реализация основных идей параллельной обработки началась только в 60-х гг. нашего столетия. Это связано с

появлением транзистора, который благодаря малым размерам и

высокой надежности по сравнению с электронными лампами позволил строить машины, состоящие из большого количества логических элементов, что принципиально необходимо для реализации

любой формы параллелизма.

Появление параллельных ЭВМ с различной организацией

(конвейерные ЭВМ, процессорные матрицы, многопроцессорные

ЭВМ) вызвано различными причинами. Совершенствование этих

ЭВМ происходило по внутренним законам развития данного типа

машин.

Рассмотрим основные этапы совершенствования параллельных ЭВМ для каждого типа структур.

Конвейерные ЭВМ. Основополагающим моментом для раз-

вития конвейерных ЭВМ явилось обоснование академиком

С.А.Лебедевым в 1956 г. метода, названного “принципом водопровода” (позже он стал называться конвейером). Прежде всего был

реализован конвейер команд, на основании которого практически

одновременно были построены советская ЭВМ БЭСМ-6 (1957-

1966 гг., разработка Института точной механики и вычислитель-

ной техники АН СССР) и английская машина ATLAS (1957-

1963 гг.) [5,6]. Конвейер команд предполагал наличие многоблочной памяти и секционированного процессора, в котором на разных

этапах обработки находилось несколько команд.

Конвейер команд позволил получить в ЭВМ БЭСМ-6 быстро-

действие в 1 млн оп/с. В дальнейшем конвейеры команд совершенствовались и стали необходимым элементом всех быстродействующих ЭВМ, в частности, использовались в известных семействах ЭВМ IBM/360 и ЕС ЭВМ.

Следующим заметным шагом в развитии конвейерной обработки, реализованном в ЭВМ CDC-6600 (1964 г.), было введение в

состав процессора нескольких функциональных устройств, позволяющих одновременно выполнять несколько арифметико- логических операций: сложение, умножение, логические операции

[5].

В конце 60-х гг. был введен в использование арифметический

конвейер, который нашел наиболее полное воплощение в ЭВМ

CRAY-1 (1972-1976 гг.) [2]. Арифметический конвейер предполагает разбиение цикла выполнения арифметико-логической операции на ряд этапов, для каждого из которых отводится собственное

оборудование. Таким образом, на разных этапах обработки находится несколько чисел, что позволяет производить эффективную

обработку вектора чисел. Сочетание многофункциональности, арифметического конвейера для каждого функционального блока и малой длительности такта синхронизации позволяет получить быстродействие в десятки и сотни миллионов операций в секунду. Такие ЭВМ называются суперЭВМ.

Процессорные матрицы. Идея получения сверхвысокого быстродействия в первую очередь связывалась с процессорными

матрицами (ПМ). Предполагалось, что, увеличивая в нужной степени число процессорных элементов в матрице, можно получить

любое заранее заданное быстродействие. Именно этим объясняется большой объем теоретических разработок по организации процессорных матриц.

В 60-х гг. в Институте математики Сибирского отделения АН

СССР под руководством доктора технических наук Э.В.Евреинова

сформировалось комплексное научное направление “Однородные

системы, структуры и среды”, которое получило развитие не толь-

ко в СССР, но и за рубежом. Книга “Однородные универсальные

вычислительные системы высокой производительности”, изданная

в 1966 г., была одной из первых в мире монографий, посвященных

этой теме. В работах по однородным средам и системам исследовались матрицы с различными связями между элементами и кон-

фигурацией, а также с элементами разной сложности и составом функций.

Поскольку в 60-е гг. логические схемы с большим уровнем

интеграции отсутствовали, то напрямую реализовать принципы

функционирования процессорной матрицы, содержащей множество элементарных процессоров, не представлялось возможным.

Поэтому для проверки основных идей строились однородные системы из нескольких больших машин. Так, в 1966 г. была построена

система Минск-222, спроектированная совместно с Институтом

математики Сибирского отделения АН СССР и минским заводом

ЭВМ им. Г.К.Орджоникидзе [5]. Система содержала до 16 соединенных в кольцо ЭВМ Минск-2. Для нее было разработано специальное математическое обеспечение.

Другое направление в развитии однородных сред, основанное

на построении процессорных матриц, состоящих из крупных процессорных элементов с достаточно большой локальной памятью,

возникло в США и связано с именами Унгера, Холланда, Слотника. Была создана ЭВМ ILLIAC-IV (1966-1975 гг.), которая надолго

определила пути развития процессорных матриц [2]. В машине

использовались матрицы 8×8 процессоров, каждый с быстродействием около 4 млн оп/с и памятью 16 кбайт. Для ILLIAC-IV были разработаны кроме Ассемблера еще несколько параллельных языков высокого уровня. ЭВМ ILLIAC-IV позволила отработать вопросы коммутации, связи с базовой ЭВМ, управления вычислительным процессом. Особенно ценным является опыт разработки параллельных алгоритмов вычислений, определивший области

эффективного использования подобных машин.

                         Примерно в то же время в СССР была разработана близкая по

принципам построения ЭВМ М-10. Затем процессорные матрицы

стали разрабатываться и выпускаться в ряде стран в большом количестве. Широко известной советской ЭВМ этого класса являлась

машина ПС-2000, разработанная Институтом проблем управления

АН СССР и запущенная в 1982 г. в производство [7].

Одной из наиболее сложных частей процессорных матриц является система коммутации. Самые простые ее варианты — кольцо и регулярная матрица соединений, где каждый узел связан только с двумя или четырьмя соседними, сильно ограничивают класс эффективно решаемых задач. Поэтому на протяжении всего времени существования параллельной обработки разрабатывались коммутаторы с более широкими возможностями: многомерные кубы, универсальные коммутаторы, коммутационные среды [2]. В СССР работы, связанные с коммутаторами для ПМ, наибольшее

развитие получили в Таганрогском радиотехническом институте

[8].

Многопроцессорные ЭВМ. Одной из первых полномасштабных многопроцессорных систем явилась система D825 фирмы

“BURROUGHS” [5]. Начиная с 1962 г. было выпущено большое

число экземпляров и модификаций D825.

Выпуск первых многопроцессорных систем, в частности

D825, диктовался необходимостью получения не высокого быстродействия, а высокой живучести ЭВМ, встраиваемых в военные командные системы и системы управления. С этой точки зрения параллельные ЭВМ считались наиболее перспективными. Система D825 содержала до четырех ПЭ и 16 модулей памяти, соединенных матричным коммутатором, который допускал одно- временное соединение любого процессора с любым блоком памяти.

Существует мнение, что система D825 получила широкое

распространение потому, что для нее впервые была разработана

полноценная операционная система ASOR, обеспечившая синхронизацию процессов и распределение ресурсов.

В дальнейшем в СССР и на Западе были разработаны много-

процессорные системы [5], в которых все большее внимание уделялось операционным системам, языкам программирования, параллельной вычислительной математике.

Совершенствование микроэлектронной элементной базы, появление в 80-х годах БИС и СБИС позволили перейти к реализации структур с очень большим количеством ПЭ. Появились разработки по систолическим массивам, реализации многопроцессорных систем с программируемой архитектурой [7], ЭВМ с управлением от потока данных.

Большая плотность упаковки транзисторов на кристалле позволила разместить в одной микросхеме несколько АЛУ. Это позволило реализовать принцип суперскалярной обработки.

Если в последовательной ЭВМ пользователь в процессе программирования задачи в основном следит за логикой метода вычислений, то в параллельной ЭВМ ему приходится дополнительно

заниматься размещением данных и синхронизацией вычислительных процессов. Это означает, что процесс программирования существенно усложняется, особенно если программирование ведется

на уровне Ассемблера, чтобы повысить эффективность использования дорогостоящих параллельных ЭВМ. Такое программирование доступно только профессионально подготовленным программистам.

По мере удешевления и более широкого распространения параллельных ЭВМ доступ к ним получили пользователи, которые

не являются профессиональными программистами, поэтому вопрос о системах программирования значительно обострился. Для

облегчения программирования для каждой ЭВМ стали создаваться

параллельные ЯВУ. Так, для ILLIAC-IV было создано несколько

языков: TRANQUIL, IVTRAN, GLYPNIR; для ЭВМ Эльбрус —

язык ЭЛЬ-76 и адаптированы языки Алгол-68, Фортран, Паскаль и

PL-1. Применение ЯВУ освобождает пользователя от знания многих деталей структуры конкретной ЭВМ. Однако полностью освободиться от влияния структуры ЭВМ на язык не удается, поэтому

возникла проблема мобильности программного обеспечения, под

которой понимают возможность переноса программ с одной параллельной ЭВМ на другую с минимум переделок или вообще без них.

Очевидным средством обеспечения мобильности является разработка и использование (в качестве стандартных) проблемно-

ориентированных языков, включающих средства описания параллельных вычислений. К ним относятся языки Алгол-68, ADA, Фортран-8X.

Большое внимание уделяется разработке автоматических распараллеливателей последовательных программ для исполнения на параллельных машинах различных типов [9, 10].

Наиболее радикальный путь автоматизации программирова-

ния вообще и параллельного в частности состоит в использовании

методов искусственного интеллекта. В СССР это направление по-

лучило широкое развитие, разработаны системы программирова-

ния ДИЛОС, СПОРА, ПРИЗ [11].

ГЛАВА 12

СТРУКТУРЫ ЭВМ С МНОЖЕСТВЕННЫМ

ПОТОКОМ КОМАНД

           В соответствии с классификацией Флинна (см. § 1.2) к много-

процессорным ЭВМ относятся ЭВМ с множественным потоком

команд и множественным потоком данных (МКМД-ЭВМ). Основы

управления вычислительных процессом в таких ЭВМ изложены в

элементы теории управления.

            В основе МКМД-ЭВМ лежит традиционная последовательная

организация программы, расширенная добавлением специальных

средств для указания независимых, параллельно исполняемых

фрагментов. Такими средствами могут быть операторы FORK и

JOIN, скобки parbegin ... parend, оператор DO FOR ALL и др. Па-

раллельно-последовательная программа достаточно привычна

пользователю и позволяет относительно просто собирать параллельную программу из обычных последовательных программ.

МКМД-ЭВМ имеет две разновидности: ЭВМ с общей и индивидуальной памятью.   Главное различие между МКМД-ЭВМ с общей и индивидуальной (локальной, распределенной) памятью состоит в характере

адресной системы. В машинах с общей памятью адресное пространство всех процессоров является единым, следовательно, если

в программах нескольких процессоров встречается одна и та же

переменная X, то эти процессоры будут обращаться в одну и ту же

физическую ячейку общей памяти. Это вызывает как положительные, так и отрицательные последствия:

               1. Наличие общей памяти не требует физического перемещения данных между взаимодействующими программами, которые

параллельно выполняются в разных процессорах. Это упрощает

программирование и исключает затраты времени на межпроцессорный обмен.

               2. Несколько процессоров могут одновременно обращаться к

общим данным и это может привести к получению неверных результатов. Чтобы исключить такие ситуации, необходимо ввести

систему синхронизации параллельных процессов, что усложняет

механизмы операционной системы.

              3. Поскольку при выполнении каждой команды каждым процессором необходимо обращаться в общую память, то требования

к пропускной способности коммутатора этой памяти чрезвычайно

высоки, что и ограничивает число процессоров в системах с общей

памятью величиной 10...20.

В системах с индивидуальной памятью каждый процессор

имеет независимое адресное пространство и наличие одной и той

же переменной X в программах разных процессоров приводит к

обращению в физически разные ячейки индивидуальной памяти

этих процессоров. Это приводит к необходимости физического

перемещения данных между взаимодействующими программами в

разных процессорах, однако, поскольку основная часть обращений

производится каждым процессором в собственную память, то требования к коммутатору ослабляются и число процессоров в системах с распределенной памятью и коммутатором типа гиперкуб

может достигать нескольких десятков и даже сотен.

В настоящем параграфе будет рассмотрена система управления вычислительным процессом в МКМД-ЭВМ с общей памятью,

а в § 3.2 — управление вычислениями в МКМД-ЭВМ с индивидуальной памятью в каждом процессоре.

Типы процессов. Для описания параллелизма независимых

ветвей в программах для МКМД-ЭВМ, написанных на ЯВУ,

обычно используют операторы FORK, JOIN или аналогичные им

по функциям.

Пример программы, использующей эти операторы, представ-

лен в § 1.1.

Введем понятия процесса, ресурса и синхронизации, которые

понадобятся далее. А.Шоу [12] определяет процесс следующим

образом: “процесс есть работа, производимая последовательным

процессором при выполнении программы с ее данными”. Это означает, что процесс является результатом взаимодействия элементов пары <процессор, программа>. Одна программа может порождать несколько процессов, каждый _из которых работает над своим

набором данных. Процесс потребляет ресурсы и поэтому является

единицей планирования в многопроцессорной системе.

Ресурс является средством, необходимым для развертывания

процесса. Ресурсом может быть как аппаратура (процессоры, оперативная память, каналы ввода-вывода, периферийные устройства), так и общие программы и переменные. В мультипрограммных

и мультипроцессорных ЭВМ наиболее употребительными общими

переменными являются системные таблицы, описывающие со-

стояние системы и процессов, например, таблицы очередей к процессорам, каналам, ВнУ; таблицы распределения памяти, состояния семафоров и др.

Синхронизация есть средство обеспечения временной упорядоченности исполнения взаимодействующих процессов.

Существует два основных вида зависимости процессов: зависимость по данным и зависимость по ресурсам.

В общем случае зависимость по данным имеет место между

множеством процессов. Пусть два множества процессов связаны

таким образом, что каждый процесс из множества {L} получает

данные от всех процессов множества {M}. Пример информационного графа такой зависимости представлен на рис. 3.2. Тогда условие запуска множества процессов для этого примера можно записать так:

if(JOIN1  JOIN2  JOIN3) then FORK L1, L2

то есть запуск процессов осуществляется по логической схеме “И”

после выполнения всех операторов JOIN.

Будем называть такие процессы

синхронными. Отличительной особенностью синхронных процессов является наличие связного ИГ и вызванный

этим обстоятельством запуск по схеме “И”. Иногда такие процессы именуют сильносвязанными.

Другой разновидностью процессов являются асинхроннные. Такие процессы не имеют связного ИГ, поэтому иногда называются слабосвязанными (через ресурс). Взаимодействие между ними осуществляется в ситуации, когда несколько таких процессов на основе

конкуренции пытаются в одно и то же время захватить единственный ресурс. Это могут быть задачи независимых пользователей,

которые одновременно обращаются к каналам ВнУ, требуют объемов физической памяти. Асинхронными являются все системные

процессы, работающие с общими таблицами очередей к ресурсам,

состояний процессов.

Синхронные процессы, например, M1, M2, M3 на рис. 3.2 мо-

гут выполняться двояко: либо им во время запуска отводятся собственные ресурсы (место в памяти, процессор и т. д.) и тогда они

независимо выполняются на своих “площадях”; либо эти процессы

запускаются как асинхронные на одном и том же наборе ресурсов,

конкурируя за их захват.

Поскольку асинхронные процессы пытаются одновременно

захватить единственный ресурс, то задача синхронизации в этом

случае состоит в том, чтобы обеспечить последовательное во времени использование ресурса процессами, то есть выполнить задачу

взаимоисключения процессов. Это соответствует запуску процессов по логической схеме “Исключающее ИЛИ”.

Рассмотрим некоторые методы и средства синхронизации в

МКМД-ЭВМ. Сначала коснемся вопроса о средствах, реализующих методы синхронизации. Все процессы между точками синхронизации выполняют обычные команды однопроцессорной

ЭВМ. Следовательно, средством выполнения процессов между

точками синхронизации является аппаратура процессора. Опера

ции же синхронизации (FORK, JOIN, взаимное исключение) из-за

большого объема выполняемой ими работы не могут быть реализованы только в виде аппаратных команд и выполняются также

как подпрограммы операционной системы, в совокупности составляющие раздел ОС “Управление процессами и ресурсами”.

§ 3.2. Многопроцессорные ЭВМ с индивидуальной памятью

МКМД-ЭВМ с индивидуальной памятью получили большое

распространение ввиду относительной простоты их архитектуры.

В таких ЭВМ межпроцессорный обмен осуществляется с помощью передачи сообщений в отличие от описанных в предыдущем

параграфе ЭВМ с общей памятью, где такой обмен отсутствует.

Наиболее последовательно идея ЭВМ с индивидуальной памятью

отражена в транспьютерах и параллельных системах, построенных

на их основе .

Транспьютер (transputer = transfer (передатчик) + computer

(вычислитель)) является элементом построения многопроцессорных систем, выполненном на одном кристалле СБИС (рис. 3.7, а).

Он включает средства для выполнения вычислений (центральный

процессор, АЛУ для операций с плавающей запятой, внутрикристальную память объемом 2...4 кбайта) и 4 канала для связи с другими транспьютерами и внешними устройствами. Встроенный

интерфейс позволяет подключать внешнюю память объемом до

4 Гбайт.

Для образования транспьютерных систем требуемого размера

каналы различных транспьютеров могут соединяться непосредственно  или через коммутаторы типа координатный

переключатель на 32 входа и выхода, который обеспечивает одно-

временно 16 пар связей . Такие переключатели могут

настраиваться программно или вручную и входят в комплект транспьютерных СБИС.

Размер транспьютерных систем не ограничен, а структура

системы может быть сетевой, иерархической или смешанной. Для

описания организации и функционирования транспьютера и многопроцессорных систем на его основе необходимо сначала рас-

смотреть элементы языка Оккам.

       Операционная система должна носить распределенный характер, то есть в процессорах должны находиться копии ОС или ее частей.

В наибольшей степени этим условиям удовлетворяют параллельные ЭВМ типа МКМД с децентрализованным управлением.

Для обеспечения рестарта в процессе вычислений необходимо

создавать контрольные точки, то есть запоминать результаты вычислений. Рестарт осуществляется с ближайшей контрольной точки. Чем чаще устанавливаются контрольные точки, тем меньше

времени будет потрачено на повторение вычислений в процессе

рестарта, однако создание контрольных точек также требует дополнительного времени.

Глава 12

СТРУКТУРЫ ПРОЦЕССОРОВ НА ОСНОВЕ СКАЛЯРНОГО

ПАРАЛЛЕЛИЗМА И ДРУГИЕ ТИПЫ ПАРАЛЛЕЛЬНЫХ

ПРОЦЕССОРОВ

§ 12.1. Структура и функционирование конвейера

Параллелизм ассемблерного уровня реализуется двумя способами:

1. В виде конвейера (конвейера команд, арифметического

конвейера или конвейера смешанного типа). Конвейер команд

использует технический параллелизм, возникающий вследствие

необходимости выполнять команду с помощью блоков различного

функционального назначения (управление, память, АЛУ и др.).

Одновременная работа этих блоков позволяет параллельно

обрабатывать сразу несколько смежных команд.

Арифметический конвейер использует разбиение арифметической операции на логически законченные микрооперации.

Например, команда сложения с плавающей запятой может быть

разделена на следующие микрооперации: вычитание порядков,

выравнивание мантисс, сложение, нормализация. Арифметический

конвейер также позволяет параллельно обрабатывать несколько

команд.

2. В виде многопроцессорной системы, где совокупность процессоров обрабатывает в каждом такте один ярус ЯПФ некоторого

выражения. Обычно в каждом процессоре используется и конвейерная обработка. Поэтому в суперскалярном процессоре одновременно обрабатывается m  n команд, где m — число этапов в конвейере, а n — число конвейеров; в каждом такте вырабатывается n

результатов.

Таким образом, увеличение быстродействия суперскалярного

процессора достигается как за счет увеличения числа конвейеров,

так и за счет удлинения конвейера. При этом по возможности сна-

чала нужно увеличивать число ступеней конвейера, так как для

этого требуется меньше оборудования, чем для увеличения числа

процессоров при достижении того же прироста быстродействия.

Следовательно, конвейер является основой суперскалярного

процессора. В настоящем параграфе будут рассмотрены структура,

функционирование, недостатки и способы получения максимального быстродействия одиночных конвейеров [19, 20].

Конвейеры можно разделить на две большие группы:

1. Векторные конвейеры (см. § 2.2), которые выполняют одну

операцию над группами данных, называемых векторами. Такие

конвейеры, как правило, являются арифметическими, то есть их

ступени выполняют части арифметико-логических операций.

2. Скалярные конвейеры, в которых на разных ступенях обработки одновременно находятся команды с разными кодами опера-

ций. Скалярные конвейеры могут содержать только конвейер команд, но в процессорах с плавающей запятой часто скалярный конвейер включает и арифметические ступени. Для выполнения векторных операций в скалярном конвейере необходимо на вход последнего в каждом такте подавать один и тот же код операции.

           С точки зрения скалярного параллелизма интерес представляют преимущественно скалярные конвейеры. В качестве примера

такого конвейера рассмотрим наиболее распространенный конвейер микропроцессора типа CISC (за прототип взят конвейер МП

Пентиум” из семейства МП 80 × 86).

Рис. 4.1. Целочисленный и плавающий конвейер CISC-процессора

Целочисленный конвейер содержит следующие ступени

(рис. 4.1):

ступень предвыборки PF (Prefetch), которая осуществляет

предварительную упреждающую выборку группы команд в

соответствующий буфер;

131

ступень декодирования полей команды D1 (Decoder 1);

ступень декодирования D2 (Decoder 2), на которой производится вычисление абсолютного адреса операнда, если

операнд расположен в памяти;

на ступени исполнения EX (Execution) производится вы-

борка операндов из РОН или памяти и выполнение опера-

ции в АЛУ;

наконец, на ступени записи результата WR (Write Back)

производится передача полученного результата в блок

РОН.

Плавающий конвейер имеет общие с целочисленным конвейером ступени PF, D1, D2, но кроме того, имеет еще 5 дополнительных

ступеней (переход показан пунктирной стрелкой):

на ступени EX производится чтение из памяти или регистров или запись в память;

на ступени X1 выполняется часть плавающей операции

(фаза 1) или запись в плавающий РОН. Возможен обход

(bypass) на ступени EX;

на ступени X2 выполняется продолжение обработки (фаза

2);

на ступени WF производится округление и обратная запись

результата в блок РОН;

на ступени ER (Error Reporting) выводится сообщение о наличии ошибок.

Наибольшая производительность конвейера достигается, когда каждый такт на вход поступает новая команда, а на выходе

получается очередной результат.

Однако получению максимального быстродействия в CISC-

конвейере препятствуют следующие обстоятельства:

1. Простои конвейера из-за наличия команд, которые требуют

многотактного исполнения в АЛУ или на других ступенях конвейера.

2. Простои конвейера из-за зависимости по данным между соседними командами.

3. Простои конвейера из-за очистки и повторной загрузки

конвейера в случае ошибки при предварительном выборе направления условного перехода.

4. Ограничения пропускной способности аппаратных средств:

РОН, памяти различных видов, шин связи.

Рассмотрим влияние этих факторов на уменьшение быстро-

действия конвейера и некоторые способы нейтрализации этого

влияния. программе скалярного параллелизма.

В динамике управление переходами осуществляется следующими способами:

1. Самый простой способ состоит в том, чтобы остановить

прием команд на вход конвейера до тех пор, пока команда перехода не достигнет ступени EX и не будет вычислено реальное на-

правление перехода. Однако этот метод, упрощая управление, не

решает проблемы простоев.

2. Наиболее сложный способ заключается в том, чтобы при

появлении на входе команды перехода выбирать и условно выполнять обе ветви возможных переходов. Условное выполнение обозначает, что до момента определения адреса перехода запрещается

запись в регистры или память.

3. Наконец, третьим способом динамической обработки ветвлений является предсказание. Самым простым способом предсказания является выбор для выполнения той ветви, которая следует

непосредственно за командой перехода (короткий переход). Но в

50% случаев этот выбор будет ошибочным.

Более эффективной является система предсказаний на основе

истории процесса вычислений.

На рис. 4.1 присутствует устройство прогнозирования ветвлений. Оно содержит таблицу достаточно большого размера, напри-

мер, на 256 строк. В каждой строке таблицы записан для выполнения части программы:

1. Адрес команды перехода.

2. Адрес дальнего перехода.

3. Бит “истории”, который указывает, по какому направлению

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

хода.

Буфер упреждающей выборки обычно содержит от нескольких до нескольких десятков предварительно выбранных команд,

чтобы сгладить задержки, связанные с обращениями в память.

Одновременно с подачей команд на вход конвейера устройство

управления производит в буфере предварительной выборки про-

смотр вперед выбранных команд. Если при просмотре обнаружена

команда перехода, то по таблице “истории” определяется направление перехода.

Устройство управления функционирует на основе предположения, что при повторном выполнении одной и той же команды

перехода переход будет осуществлен по одному и тому же адресу.

В соответствии с этим в буфер упреждающей выборки выбирается

ветвь, предписанная битом “истории”, если этой ветви в буфере

упреждающей выборки еще нет.

Буфер упреждающей выборки содержит две зоны: для теку-

щей и альтернативной ветви и переключение с зоны на зону не

вызывает простоев.

Описанный механизм ветвления позволяет выбирать правильные пути ветвления с вероятностью более 80%.

КЭШ. Фактором, также ограничивающим быстродействие

конвейера, является недостаточное быстродействие ресурсов, в

частности, памяти. Рассмотрим некоторые требования к памяти.

Чем меньше такт конвейера, тем более быстрой должна быть

память, обслуживающая этот конвейер. Если учесть, что цикл

внешней памяти обычно больше, чем длительность такта конвейера, то становится очевидным, что между конвейером и внешней

памятью должны быть расположены вспомогательные средства

памяти различного быстродействия и назначения и усовершенствованная система шин.

Регистры общего назначения являются наиболее быстрым ви-

дом памяти, их число колеблется от 8 до 32. РОН используется для

хранения информации, как правило, локальной для тела цикла или

базового блока. Чтобы избежать конфликтов при обращении к

РОН, их делают многопортовыми (многовходовыми). Число портов обычно равняется трем: два для выдачи операндов и один —

для приема результата.

                          Следующий шаг для уменьшения задержки при обращении к

памяти состоит в разделении памяти на два независимых блока:

память для программ и память данных. Такое разделение носит

название гарвардской архитектуры. Для нее характерно использование буфера упреждающей выборки , в который за один такт принимается сразу несколько команд из памяти с большой разрядностью ячейки. Этот же буфер позволяет выбирать заранее альтернативные ветви в случае команд условных переходов. Все это сглаживает скорость поставки команд в конвейер.

Наиболее эффективным средством ускорения обращения к

памяти является локальная (для АЛУ) память небольшого размера,

называемая КЭШ.

           Известно, что 90% обращений в память производится в ограниченную область адресов. Эта область называется рабочим множеством, которое медленно перемещается в памяти по мере выполнения программы. Для рабочего множества можно сделать

промежуточную память небольшого размера, а значит, в несколько

раз более быструю, чем основная память.

             Для однокристальных микропроцессоров особенно важно то,

что память такого размера можно разместить внутри кристалла,

благодаря чему исчезают потери времени на вывод данных из кристалла, вызываемые малым числом выводов, задержками сигнала

на контактах и из-за больших расстояний на плате.

Введем понятие строки и отображения [19]. Строка есть базовая единица информации, которая перемещается между основной

и КЭШ-памятью. Следовательно, основная память состоит из

большого числа строк с последовательными адресами, а в КЭШ-

памяти понятие “последовательные адреса” отсутствует. В КЭШ-

памяти каждое слово сопровождается адресным тэгом, указывающим, какую строку основной памяти представляет данная строка

КЭШ-памяти.

Отображением называется способ размещения и выборки

строк основной памяти из КЭШ-памяти.

Можно выделить четыре основных типа отображения:

         1. Полностью ассоциативная КЭШ-память. Любая строка основной памяти может находиться в любой строке КЭШ-памяти.

Каждая строка КЭШ-памяти содержит свой компаратор (устройство сравнения). Если процессору нужна строка с определенным

адресом, он должен искать ее путем сравнения адреса с тэгом всех

строк КЭШ-памяти. Если такое сравнение делать последовательно,

то КЭШ-память теряет смысл из-за низкого быстродействия; если

сравнение делать одновременно со всеми тэгами, то такая память

из-за ее сложности не может иметь большой объем.

КЭШ-память ассоциативного типа обычно имеет небольшой

объем и используется для вспомогательных целей.

        2. Противоположной структурой является память с прямым

отображением. Одна из возможных реализаций использует раз-

рядное отображение. Например, если в адресе строки памяти со-

держится N разрядов, то младшие n из них выбирают, в какую

строку КЭШ-памяти она может копироваться. Следовательно, все

строки с одинаковыми младшими адресами попадают в одну и ту

же строку КЭШ-памяти. Оставшиеся N-n разрядов используются

как адресный тэг для сравнения с адресом, выставленным процессором, чтобы убедиться, имеется ли данная строка в КЭШ или

отсутствует.

Основное достоинство состоит в том, что накопитель такой

памяти имеет структуру обычной прямоадресуемой памяти и ну-

жен всего один компаратор, следовательно, такая КЭШ-память

может иметь большую емкость.

Основной недостаток состоит в том, что в КЭШ-памяти может

находиться ограниченное число комбинаций строк. Например, в

КЭШ-памяти не могут одновременно находиться строки с одинаковыми младшими адресами. Это заметно увеличивает число про-

махов.

          3. Промежуточным между полностью ассоциативным и прямым отображением является секторное отображение, вариант которого описан в § 2.1. В этом случае в КЭШ-памяти располагаются

страницы основной памяти. При обращении в КЭШ-память базовые адреса страниц в КЭШ-памяти устанавливаются с помощью

служебной полностью ассоциативной памяти небольшого размера,

а поиск слов в странице КЭШ-памяти производится на основе

прямого адресного доступа. Секторная память удобна для больших

ЭВМ, где программа может целиком располагаться в одной или

нескольких страницах КЭШ-памяти. Для суперскалярных процессоров, реализуемых на одном кристалле, такой подход трудно реализовать, поскольку внутрикристальная КЭШ-память реально

имеет объем менее одной страницы.

         4. Другим промежуточным отображением, которое в основ-

ном и используется в однокристальных суперскалярных микропроцессорах является КЭШ-память с множественно-

ассоциативным доступом. В ней, как и в памяти с прямым отображением, используется выбор строки КЭШ-памяти по младшим

разрядам адреса основной памяти, но в этой строке КЭШ-памяти

содержится несколько слов основной памяти, выбор между которыми производится на основе ассоциативного поиска.

      Это означает, что по одному смещению выбирается строка, содержащая информацию по двум разным страницам памяти. Это увеличивает вероятность удачного обращения. Обычно кратность ассоциации колеблется от единицы до четырех. Обычная длина поля

тэгов до 24 или 32 разрядов, длина строки данных (одной) — от 4

до 32 байтов; число строк в КЭШе — до 256.

Важной величиной является число портов в КЭШе. Как правило, число адресных портов (входы тэга) составляет 2...3, а порт

данных — единственный. Объем внутрикристального КЭШа в МП

колеблется в пределах от 4 до 32 килобайт, а внешнего — составляет несколько сотен килобайт.

На рис. 4.6 представлена зависимость числа попаданий от

размера КЭШ-памяти с множественно-ассоциативным доступом.

Из рисунка следует, что, если строка КЭШ-памяти содержит более

четырех строк основной памяти, то это уже увеличивает степень

попаданий незначительно.

Переход к RISC. Ранее было показано, что вследствие наличия многотактных команд, зависимости по данным, влияния условных переходов и аппаратных ограничений нельзя достичь пре-

дельной для конвейера архитектурной скорости 1 команды за такт.

В рамках архитектуры CISC-процессора можно ослабить влияние

указанных выше причин. В частности, для уменьшения влияния

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

ратные обходы и введение независимых команд; для ослабления

влияния условных переходов предложены различные методы

предсказания; для повышения пропускной способности памяти

предложена иерархия запоминающих устройств и шинные системы с высокой пропускной способностью.

Однако проблема многотактных команд может быть решена

только при переходе от СISC к RISC и MISC системам команд.

Этот переход позволяет:

1. Сократить систему команд за счет устранения сложных ко-

манд.

2. Увеличить количество РОН; использовать для операций

АЛУ трехадресные команды, ввести файлы РОН с произвольным

доступом вместо стека для плавающей запятой.

3. Использовать команды фиксированного формата.

Рассмотрим эти средства несколько подробнее.

Переход к системе команд типа RISC приводит к разрешению

системы команд на две группы: одна — для работы с АЛУ, другая

— для работы с памятью. Такое разделение приводит к Load/Store

Архитектуре.

В такой структуре АЛУ и память работают параллельно. Что-

бы обеспечить максимальное быстродействие системы, необходимо обеспечить упреждающую работу памяти.

Число РОН в RISC-процессоре достигает величины 32, 64 и

даже более, в то время как в CISC оно не превосходит 8 или 16.

Увеличение числа РОН уменьшает число обращений к памяти,

сокращает длину программы, позволяет устранить некоторые зависимости по данным.

Трехместный (неразрушающий) формат команды выбран по

следующим причинам: уменьшается число обращений к памяти

(при достаточном числе РОН), устраняются излишние зависимости

по данным. Например, в программе:

R3 = R1 + R2

R1 = R4 + R5

существует зависимость обратного типа, а в программе

R3 = R1 + R2

R6 = R4 + R5

использующей большее число регистров, она отсутствует, поэтому

команды могут выполняться параллельно.

В RISC-процессорах РОН плавающей запятой организованы в

виде файла с произвольным доступом, а не в виде стека, как в

CISC. Это устраняет зависимости между смежными командами,

вызванные единственным ресурсом — верхушкой стека, и уменьшает число обращений к памяти.

Препятствием к однотактной реализации команд CISC являет-

ся последовательная структура дешифрации полей микрокоманды

и переменная длина команды. Например, в системе команд МП

i80×86 характер дешифрации полей команды последовательный:

по префиксу или первому байту определяется длина команды, по-

сле выборки оставшихся байтов производится дешифрация их по-

лей. В отличие от этого в RISC команды имеют фиксированный

формат, все поля независимы, поэтому дешифруются одновременно.

Все эти мероприятия позволяют выполнять большинство команд за 1 такт, при этом микропрограммирование перестает быть

необходимым.

Таким образом, конвейер на базе системы команд типа RISC

позволяет получить предельную для одиночного конвейера архитектурную скорость — 1 результат за такт.

Переход к новой системе команд типа RISC требует перепрограммирования громадного объема прикладного программного

обеспечения, накопленного для широко распространенных систем

команд типа CISC, используемых в МП i80×86, MC 680×80, по-

этому естественным является стремление получить более высокую

архитектурную скорость для CISC-МП на базе приближения свой-

ства CISC-процессоров к свойствам RISC-процессоров. Для этой

цели предпринимаются следующие действия программного и ап-

паратного характера:

1. Новые компиляторы CISC-процессоров __________строятся таким об-

разом, чтобы для генерации машинных кодов из большого списка

команд CISC-процессора использовать только небольшой набор

простых команд, называемый RISC-ядро.

2. Ограничение на количество РОН в CISC-процессорах (всего

8 в i80×86) преодолевается следующим образом. При проектиро-

вании нового кристалла для CISC-процессора предусматривается

увеличенный файл РОН, например, 32, и эти РОН составляют вир-

туальный файл. В процессе выполнения команд каждому логиче-

скому РОН, описанному в команде, предоставляется свободный

РОН из виртуального файла, благодаря чему, как было показано

ранее, растет параллелизм исполнения.

3. Для приближения стека по способу функционирования к

файлу РОН с произвольным доступом аппаратно реализуются бы-

стрые команды адресного обмена между регистрами стека типа

FXCH, благодаря которым верхушка стека в каждом такте пред-

стает как новый РОН с требуемым номером.

§ 12.2.  Cтруктура суперскалярного процессора

В настоящем параграфе для иллюстрации особенностей построения суперскалярных систем в качестве базовой используется

архитектура суперскалярного процессора Пентиум фирмы Intel с

системой команд типа CISС [20]. Вызвано это следующими при-

чинами:

суперскалярная организация процессора Пентиум доста-

точно проста для изучения, однако в ней отражены все

особенности построения суперскалярных систем;

система команд процессора Пентиум практически совпадает с системой команд широко известного семейства микро-

процессоров i80×86, поэтому примеры программ легко

воспринимаются;

наконец, в процессоре Пентиум на программном и аппаратном уровне принято ряд решений, приближающих его

архитектуру к архитектуре RISC-процессоров, позволяю-

щих, однако, сохранить программную совместимость с

большим объемом ранее написанного прикладного матобеспечения.

Появление в структуре процессора более одного конвейера

делает этот процессор суперскалярным.

Как правило, в суперскалярных процессорах в первую очередь

увеличивают количество целочисленных конвейеров, так как статистика показывает, что в обычных пакетах прикладных программ

для ПЭВМ около 80% команд — целочисленные, 15% — команды

условных переходов, и только небольшой процент команд являет-

ся командами с плавающей запятой.

Немедленно после введения второго или большего числа конвейеров возникают принципиально важные для суперскалярной структуры вопросы по организации и технической реализации вычислений:

1. Как организовать запуск параллельных команд во множественных конвейерах. Нетрудно видеть, что здесь решается и вопрос

о распараллеливании последовательных программ.

2. Как уменьшить отрицательное влияние на работу конвейеров зависимости по данным для смежных команд и потери быстродействия из-за появления в программе условных переходов.

Планирование межконвейерного параллелизма должно производиться с учетом указанных эффектов.

3. Как обеспечить повышенную пропускную способность всех

видов памяти в суперскалярном процессоре, особенно если число

одновременно выполняемых операций составляет 20-30.

4. Каковы в перспективе предельные возможности, размеры суперскалярных процессоров.

Организация параллельного запуска команд предусматривает

выполнение трех этапов: распараллеливание последовательной

программы; планирование порядка выполнения команд для заданных ресурсов; представление спланированной программы в форме,

пригодной для исполнения аппаратурой.

В зависимости от способа реализации этих этапов методы

формирования и запуска параллельных команд можно разделить

на статические, динамические и смешанные. Считается, что стати-

ческие способы предпочтительнее, поскольку анализ программы в

процессе компиляции обеспечивает более глубокое выделение и

планирование параллелизма, кроме того, исключает служебные

команды управления параллелизмом из вычислительного процесса

. Динамический же запуск позволяет более полно учитывать

текущее состояние программы и ресурсов при исполнении про-

граммы.

Возможны следующие способы статического формирования

параллельной команды:

1. Производится распараллеливание программы обычными

методами, затем параллельные команды с помощью оптимизирующего планировщика упаковываются в виде СДК фиксированного формата. В таком СДК каждое поле формата закреплено за

определенным конвейером и хранится в одной ячейке параллель-

ной памяти. При чтении СДК из памяти выбираются все поля СДК

независимо от их заполнения. Конвейеры запускаются синхронно

в каждом такте. Это является возможным, поскольку в RISC-

конвейерах основные операции выполняются за 1 такт. Основной

недостаток схемы с фиксированным форматом СДК — неполное

использование памяти при отсутствии команд в некоторых позициях СДК.

2. Более полное использование ячейки памяти фиксированного формата применяется в МП i860 .

Рис. 4.8.Представление СДК в памяти МП i860

В МП i860 только два конвейера, поэтому СДК имеет длину 2.

Если в некоторой команде, например, Ki указан признак d (dual-двойной), это означает, что следующие две команды по списку, а

именно, Ki+1 и Ki+2 образуют параллельную пару. Физически эта

пара может быть расположена либо в одной ячейке параллельной

памяти, либо в смежных ячейках последовательной памяти.

3. Описанные выше способы годятся для вновь разрабатываемых систем команд, поскольку на этапе разработки можно зало-

жить средства, обеспечивающие объединение команд в СДК фиксированного формата. Однако эти способы нельзя применить к

системам команд CISC-процессоров, которые нельзя

“подкорректировать”, поскольку для них уже существует большой

объем написанного математического обеспечения.

В этом случае используются элементы смешанного формирования и запуска СДК.

Конвейер МП Пентиум выполняет команды строго в порядке

их следования в программе. Такой способ функционирования существенно снижает эффективность конвейера, поскольку конвейер

вынужден останавливаться, когда на этапе EX выполняется многотактная команда. Кроме того, для загрузки двух целочисленных

конвейеров используется параллелизм только пары смежных команд, а он невелик, поэтому и вероятность совместной работы этих конвейеров невысока.

Повысить эффективность суперскалярной обработки можно,

если допустить выполнение команд в порядке готовности их операндов. Такая архитектура использована в МП Р6 фирмы Intel . В МП Р6 используется та же система команд, что и во

всех микропроцессорах i80x86.

Функции блоков микропроцессора таковы:

1. Блок выборки и декодирования команд ВД обеспечивает

чтение команд их КЭШ, их декодирование, преобразование и запись в буфер команд БК. Команды обрабатываются блоком ВД в

порядке их следования в программе.

2. Буфер команд БК представляет собой ассоциативную па-

мять, в которой команды представлены в трехадресном формате.

Поскольку в системе команд i80x86 мало РОН (всего 8), то из-

за этого между командами возникают ложные зависимости по

данным. Для устранения этих зависимостей в МП Р6 введено 40

команд и дополнительных регистров, которые недоступны программисту.

Они используются аппаратурой для временного хранения результатов. Обозначим эти регистры временного хранения через V. Тогда  V1, V2 и VР обозначают соответственно номера

регистров для хранения первого, второго операндов и результата.

Преобразование команд системы i80x86 в трехадресный формат и

переименование регистров производится блоком ВД.

Каждая команда в БК сопровождается блоком событий БС, в

котором отмечаются следующие состояния команды: готовность

каждого операнда, готовность команды к исполнению, готовность

результата и др.

3. Центральным блоком МП Р6 является блок планирования и

выполнения команд ПВ. Именно он выполняет команды в порядке

их готовности. ПВ содержит несколько АЛУ и устройств обращения к памяти. За один такт ПВ способен одновременно запустить

на исполнение до пяти команд и передать в БК до пяти результатов.

Выборка готовых команд из БК производится путем ассоциативного опроса блока БС всех команд, а размещение нескольких

команд по устройствам ПВ осуществляется в соответствии с определенным алгоритмом планирования. Одним из наиболее простых

для аппаратной реализации является алгоритм FIFO (первым при-

шел — первым ушел).

При получении в ПВ каждого нового результата адрес его

размещения используется как ассоциативный признак для полей

V1, V2 буфера команд. Если одна или несколько команд откликнулись на этот признак, значит, эти команды завися по данным от

выполненной команды. В блоках БС откликнувшихся команд устанавливаются биты и готовности операндов, а, если готовыми

оказались оба операнда, то устанавливается и бит готовности для

исполнения всей команды. Это позволяет сформировать очередной

набор “готовых” команд для следующего такта работы ПВ.

Чтобы блок ПВ мог выполнять за один такт до 3...5 команд

необходимо, чтобы в БК находилось до 20...30 команд. По стати-

стике среди такого объема команд в среднем имеется 4...5 команд

условных переходов. Следовательно в БК находится некоторая

трасса выполнения команд. Выбор таких наиболее вероятных

трасс является новой функцией МП с непоследовательным выполнением команд. Эта функция выполняется в блоке ВД на основе

расширенного до 512 входов буфера истории переходов.

Поскольку реально вычисленный в ПВ адрес перехода не всегда совпадает с предсказанным в блоке ВД, то вычисление в ПВ

выполняется условно, т. е. результат записывается в регистр временного хранения. Только после того, как установлено, что пере-

ход выполнен правильно, блок удаления команд УК выводит из БК

все выполненные команды, расположенные за командой условного

перехода, преобразует их в формат системы i80x86 и производит

запись результатов по адресам, указанным в исходной программе.

Блоки ВД, ПВ и УК совместно составляют конвейер из 12

этапов, однако все три части этого конвейера работают практически независимо, взаимодействуя только через БК. Следовательно,

такой конвейер можно считать неблокируемым, так как остановка

любой его части не прекращает работу других частей.

Глава 13

ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПАРАЛЛЕЛЬНЫХ ЭВМ

§ 13.1. Особенности программного обеспечения параллельных

ЭВМ

                       Параллелизм оказывает существенное влияние на архитектуру

вычислительных средств.

Под вычислительными средствами будем понимать аппаратуру ЭВМ и ее программное обеспечение. Влияние параллелизма и

прежде всего системы команд на аппаратуру было описано в предыдущих главах, в этой главе будет рассмотрено влияние параллелизма на программное обеспечение.

Программное обеспечение традиционной универсальной ЭВМ

можно разделить на три части, часто называемые системным программным обеспечением: операционные системы, системы программирования и прикладные пакеты.

Ядро операционной системы (ОС) мультипрограммной ЭВМ

содержит следующие компоненты:

1. Средства управления ресурсами системы (драйверы ввода-

вывода, динамическое управление памятью, система прерывания

процессора и др.).

2. Средства управления процессами (создание, уничтожение,

синхронизация процессов).

3. Средства планирования и распределения ресурсов между

задачами, заданиями, процессами.

4. Системы управления файлами.

5. Интерфейс пользователя, оператора (управляющие средства, командные языки).

6. Средства восстановления и реконфигурации ЭВМ и ОС после появления сбоев и неисправностей.

В зависимости от режима работы мультипрограммная ОС

приобретает специализацию. В частности, для пакетного режима

усиливаются функции планирования, оптимизируется распределение времени между пользователями в системах разделения времени, совершенствуются средства прерывания в системах реального

времени.

         Системы программирования включают языки программирования, компиляторы, отладчики, средства объединения и загрузки

программ, редакторы, библиотеки подпрограмм и функций разных

этапов выполнения программы. Интегрированные системы программирования обычно включают также собственную систему

управления файлами, интерфейс программиста и некоторые другие функции, характерные для ОС.

Прикладные пакеты разрабатываются и поставляются как

фирмами, которые разрабатывают оборудование, так и фирмами-разработчиками программного обеспечения. Существует большое

количество пакетов различного назначения, например, пакеты для

автоматизации проектирования, текстовые редакторы, графические пакеты, пакеты научной математики, базы данных, пакеты

для цифровой обработки сигналов, для обработки экономической

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

Параллелизм в основном затрагивает систему программирования, причем, в наибольшей степени это проявляется при программировании одной задачи, поскольку основное назначение параллельных систем — уменьшение времени выполнения отдельных трудоемких задач. Поэтому, если в последовательной ЭВМ процесс программирования можно, образно говоря, считать одномерным, так как в этом случае достаточно только обрабатывать

последовательность арифметико-логических операций, то в параллельной ЭВМ необходимо еще отслеживать размещение процессов

в пространстве ресурсов и их синхронизацию во времени, то есть

здесь процесс программирования является, по крайней мере, трехмерным.

На систему программирования ложатся функции создания

языков программирования и трансляторов, которые во многих

случаях должны обеспечивать функции автоматического распараллеливания последовательных программ (программ, а не алгоритмов, так как распараллеливание алгоритмов относится к области параллельной вычислительной математики и рассматривается в

главе 6).При появлении параллельных ЭВМ приходится перерабатывать ранее написанные прикладные пакеты, однако вопросы их

мобильности в настоящем пособии не рассматриваются.

Таким образом глава 5 в основном посвящена системам программирования.

§ 5. 2. Векторные языки

Наиболее важным и трудоемким для векторных ЭВМ является

создание языков и трансляторов.

Несмотря на очень большой разрыв в производительности, обеспечиваемой различными языками, на практике по тем или иным причинам используются все названные языки.

                  Языки типа ассемблер в символической форме отражают машинную систему команд параллельной ЭВМ, т. е. все особенности структуры ЭВМ: число процессоров, состав и распределение регистров и ОП, систему коммутации, особенности структуры ПЭ, средства специализированного

размещения данных и т. д. Языки такого типа используются на

всех параллельных ЭВМ и позволяют детально приспособить параллельный алгоритм к особенностям структуры конкретной параллельной ЭВМ. Программы, написанные на ассемблере, обеспечивают наивысшую производительность ЭВМ.

              Ассемблер, несмотря на высокую эффективность программ,

написанных на этом языке, не может использоваться для массово-

го прикладного программирования по следующим причинам:

1) программирование на ассемблере является очень трудоемким даже для последовательных ЭВМ, не говоря уже о параллельных, где необходимо дополнительно программировать размещение

данных и синхронизацию процессов;

2) в вычислительной технике происходит регулярная смена

элементной базы, что сказывается на системе команд ЭВМ, в особенности параллельных (это означает переработку всего запаса

программ, написанных на ассемблере);

3) программы, написанные на ассемблере, не мобильны, т. е.

их нельзя выполнять на параллельных ЭВМ других классов, а час-

то и внутри одного класса ЭВМ, но для разных размеров ПП.

Поэтому, как правило, программы на ассемблере используются:

1) при создании системного математического обеспечения;

2) для написания программных библиотек стандартных функций и численных методов;

3) для оформления гнезд циклов с наибольшим временем счета в программах, написанных на ЯВУ;

4) для написания небольшого числа программ постоянного

пользования в специализированных ЭВМ.

Параллельные ЯВУ в большинстве случаев строятся как расширение стандартных вариантов Фортрана, хотя в некоторых случаях используются расширения на базе языков Паскаль, Ада, Си.

Иногда параллельный язык строится как новый, не имея в качестве

базы стандартного последовательного языка.

Проблемно-ориентированные языки не имеют структур данных и операций, отражающих свойства конкретной параллельной

ЭВМ. Если ЯВУ является векторным, то написанные на нем про-

граммы должны с равной эффективностью выполняться как на

конвейерных ЭВМ, так и на ПМ. В проблемно-ориентированных

языках все конструкции данных и операции над ними соответствуют математическому понятию этих данных и операций. Размерности данных, как правило, не ограничены, в таких языках часто

отсутствуют средства для размещения пользователем данных в

ПП. Проблемно-ориентированные языки достаточно просты для

программирования.

Машинно-ориентированные языки в сравнении с проблемно-

ориентированными языками позволяют создавать значительно

более эффективные программы, предоставляя пользователю средства, отражающие структуру параллельной ЭВМ.

В машинно-ориентированных языках часто вводятся:

1) переменные типа “суперслово”. Число элементарных слов в

суперслове строго соответствует размеру ПП (64 для ЭВМ

ILLIAC-IV). Пользователь имеет возможность представить данные

в виде суперслова, обеспечивая, таким образом, лучшее использование ОП и увеличенное быстродействие;

2) операторы для размещения в ПЭ данных по “срезам” раз-

личных индексов массивов;

3) средства типа “масок” для включения-выключения отдельных ПЭ.

Написание программ на машинно-ориентированных ЯВУ является более трудоемким процессом, чем написание программ на       проблемно-ориентированных ЯВУ.

Для специализированных применений ЭВМ часто используются системы программирования, содержащие библиотеку про-

грамм ограниченного размера, написанную на ассемблере. Под-

программы библиотеки вызываются из основной программы,

оформленной на последовательном Фортране или другом ЯВУ и

предназначенной для выполнения в базовой ЭВМ. Этот метод использования библиотечных программ обладает средними характеристиками по трудоемкости, эффективности и универсальности.

При разработке параллельного ЯВУ необходимо:

• выбрать новые структуры данных и определить методы

доступа к структурам и элементам этих структур данных;

• определить допустимые арифметико-логические и управляющие операции над введенными структурами данных;

• определить базовые методы размещения и коммутации

данных в ПП;

• предложить изобразительные средства для оформления

структур данных и операций над ними.

Рассмотрим наиболее общие методы решения этих вопросов в

параллельных ЯВУ [2].

Основными объектами параллельной обработки в параллель-

ных ЭВМ являются массивы различной размерности, а также под-

структуры этих массивов: плоскости строки, столбцы диагонали и

отдельные элементы. Следовательно, для выборки данных объектов в параллельном ЯВУ должны существовать специальные механизмы

различных ЭВМ.

§ 13. 2.  Языки программирования для транспьютерных систем

Разнообразие и широкое распространение транспьютерных

систем предъявляют повышенные требования к системам программирования для транспьютеров.

Прежде чем перейти к рассмотрению систем программирования, опишем концентуальную модель вычислений в мультитранспьютерной системе:

                         1. Вычислительный процесс представляет собой параллельное

выполнение нескольких подпроцессов на различных транспьютерах в асинхронном режиме. Синхронизация осуществляется путем

обмена сообщениями. Каждый параллельный процесс в мультитранспьютере может, в свою очередь, быть разбит на более мелкие подпроцессы, которые выполняются квазипараллельно в од-

ном транспьютере в режиме разделения времени.

                       2. В однотранспьютерной системе запуск параллельных ветвей осуществляется командой “стартовать процесс” (операция

THREAD в ЯВУ ), которая по своим функциям подобна оператору

FORK: заводится критический блок, и новый процесс планировщиком включается в очередь процессов, претендующих на время

процессора. Команда “завершить процесс” соответствует оператору JOIN: процесс исключается из очереди, из счетчика критического блока вычитается единица и, если содержимое счетчика оказывается равным нулю, завершается вышестоящий процесс. Обмен

между квазипараллельными процессами осуществляется через

программные каналы, следовательно, общие переменные отсутствуют, то есть реализуется модуль МКМД-ЭВМ с раздельной памятью. При этом конкуренции за ресурсы нет, так как их распределение производится программистом на этапе написания программы.

Процессы разделяются на: срочные, которые выполняются по

очереди до полного завершения каждого из них; и на несрочные,

которые обслуживаются по кольцу с равным интервалом времени.

Управление ими осуществляется встроенным планировщиком,

реализованным микропрограммно или аппаратно.

В случае необходимости реализовать разделяемую общую па-

мять (например, буфер для нескольких процессов) пользователь

обязан сам организовать синхронизацию с помощью семафоров.

Реальный физический параллелизм процессов достигается в

мультитранспьютере (МТ). Чтобы обеспечить этот параллелизм,

пользователь должен создать сеть транспьютеров и разместить

части задачи в узлах этой сети.

Программное обеспечение транспьютерных систем включает

системы программирования, операционные системы, пакеты прикладных программ и некоторые специальные средства. Основным

элементом систем программирования являются языки программирования. В дальнейшем будут рассмотрены: язык Оккам-2, особенности языков высокого уровня Фортран и Си для транспьютеров, возможности программирования средством операционной

системы Helios. сигналов и др.

Глава 14

ПАРАЛЛЕЛЬНЫЕ АЛГОРИТМЫ

§ 14.1. Принципы создания параллельных алгоритмов

Для последовательных ЭВМ накоплен большой запас алгоритмов вычислительной математики, оформленных в виде про-

грамм на ЯВУ, ассемблере, языках описания алгоритмов.

К алгоритмам предъявлялся ряд требований, например: минимальное время исполнения задачи, минимальный объем памяти,

минимизация обращений к внешним устройствам и т. д. Эти требования часто противоречили друг другу и приводили, в конце

концов, к появлению ряда вычислительных алгоритмов для решения одной и той же задачи.

В связи с появлением параллельных ЭВМ возникла необходимость в разработке параллельных алгоритмов. Следует заметить,

что признаки параллельных алгоритмов можно обнаружить и в

пакетах программ для последовательных ЭВМ там, где параллелизм присутствует в естественном виде, например, в матричной

алгебре, при решении систем уравнений и т. д. В этих случаях

возможным является даже эффективное автоматическое преобразование последовательных программ в параллельные с помощью

автоматических распараллеливателей или векторизующих компиляторов. Однако чаще необходимо специально разрабатывать и

обосновывать параллельные алгоритмы. Это и является задачей

новой и бурно развивающейся отрасли вычислительной математики — параллельной вычислительной математики.

Для описания свойств параллельного алгоритма в литературе

используется ряд характеристик. Внешне некоторые из них сходны

с характеристиками параллельных ЭВМ, описанных в § 1.2, однако

отличаются от последних по существу, поскольку не связаны с

аппаратурой. Рассмотрим некоторые характеристики алгоритмов.

1. Параллелизм алгоритма, задачи, степень параллелизма. Эти

понятия определяют число операций l, которые можно выполнять

одновременно, параллельно. Причем при определении l считается,

что алгоритм выполняется на идеализированном параллельном

компьютере, в котором отсутствуют задержки на коммутацию и

конфликты при обращении к памяти, а число процессоров не ограничивает параллелизм. В таком компьютере параллелизм зависит

только от внутренних свойств алгоритма. Будем называть такие

алгоритмы параллельными математическими алгоритмами в отличие от прикладных параллельных алгоритмов, которые выполняются на параллельных ЭВМ с конечным и часто небольшим числом процессоров. В главе 6 рассматриваются в основном математические алгоритмы.

Если l характеризует часть задачи с основным объемом вычислений, эту величину называют потенциальным параллелизмом

и выражают как функцию f(e) или f(n), где e — общее количество

арифметико-логических операций в задаче; n — размерность зада-

чи, например, длина вектора, размер стороны квадратной матрицы,

число уравнений в системе.

Представление l = f(e) позволяет выбрать один из численных

методов среди множества возможных методов для решения данной

задачи. Представление l = f(n) позволяет оценить варианты внутри

одного численного метода.

Величина l оценивается только по порядку и может прини-

мать, например, такие значения: 0(logn), 0(n), 0(n2), где 0(Z) обо-

значает “порядка величины Z”.

2. Время исполнения параллельного алгоритма (глубина параллелизма, алгоритмическая сложность). Эти понятия отражают

время исполнения параллельного алгоритма q, выраженное в так-

тах. Величина q информативнее ширины параллелизма l. Однако и

q не несет полной информации о качестве параллельного алгоритма. Если l описывает алгоритм по горизонтали, то q — по вертикали.

Качественно q можно определить как

q = e/l (6.1)

Формула (6.1) указывает на средства, позволяющие получить

лучший параллельный алгоритм: необходимо уменьшать e и увеличивать l. В некоторых случаях при реорганизации алгоритма

эффект можно получить и увеличением e, когда l растет быстрее,

чем e: q' = (e +Δe )/(l + Δl), q'< q.

Глубину параллелизма также выражают как функцию f(e) или

f(n). Параллельные алгоритмы можно разделить на алгоритмы с

221

фиксированной глубиной параллелизма, алгоритмы с глубиной

типа 0(log n), алгоритмы с большей глубиной параллелизма.

В алгоритмах с фиксированной глубиной параллелизма вели-

чина q не зависит от объема вычислений или размера структуры

данных.

Примерами таких алгоритмов являются простейшие бинарные

операции над векторами C() = A()B(), где A, B, C — векторы

длиной n;  — символ произвольной арифметико-логической операции. Такая операция будет выполняться за один такт при любом

n.

Особенное значение получили алгоритмы с q = 0(logn). При-

меры таких алгоритмов даны в § 6.2. Это алгоритмы каскадного

суммирования, циклической редукции и некоторые другие, связанные с распараллеливанием рекурсивных алгоритмов.

Алгоритмы с большей глубиной параллелизма l = 0(nlogn),

l= 0(n2logn) и другие малоэффективны, и необходимо искать

более быстрые алгоритмы.

3. Наиболее информативной характеристикой параллельного

алгоритма является ускорение r, показывающее, во сколько раз

применение параллельного алгоритма уменьшает время исполнения

задачи по сравнению с последовательным алгоритмом: r = eпс/q.

       Для реальных параллельных ЭВМ на основе математических

параллельных алгоритмов разрабатываются параллельные прикладные алгоритмы, характеристики которых хуже, чем у математических алгоритмов. Прикладные алгоритмы должны учитывать

наличие в реальной ЭВМ оперативной памяти, системы коммутации и ограниченного числа процессоров. Это значительно усложняет создание прикладных алгоритмов, так как при их разработке

по сравнению с математическими алгоритмами используются другие критерии. Для =_>_6_5_=_математических алгоритмов требовалось

уменьшать e и максимально увеличивать l. Для прикладных алгоритмов нет смысла в слишком большом l, так как оно должно быть

равно N. В результате если за счет ограничения l удастся уменьшить e, то это повысит качество разрабатываемого прикладного

алгоритма.

Параллельные системы предназначены для решения задач

большой размерности. Поэтому среди прочих источников погрешностей заметной становится погрешность округления. Известно,

что среднеквадратичное значение погрешности округления

σ = 0(β e) , где β — значение младшего разряда мантиссы числа.

Для чисел с плавающей запятой одинарной точности β = 224 .

Величина e для ЭВМ с быстродействием 100 млн. оп/с за время

работы около 1 ч достигает значения примерно 10. В результате σ

может иметь порядок 0(224106)=0(24), т. е. погрешность составляет несколько процентов и более, что не всегда допустимо,

поэтому для параллельных вычислений часто используется двойная точность.

Далее будут рассмотрены способы построения параллельных

алгоритмов для некоторых задач вычислительной математики:

суммирование чисел, умножение матриц, решение дифференциальных уравнений в частных производных. Эти задачи характеризуются тем, что они охватывают основные методы вычислитель-

ной математики: рекурсию, прямые и итерационные методы решения.

Многопроцессорные системы более эффективны для задач с

неоднородными по составу операторов ветвями. Эта неоднородность отражает природу какого-либо явления и может быть из-

вестна заранее. Тогда в параллельной программе для запуска не-

идентичных ветвей используется оператор FORK. Неоднородность

может проявляться и в процессе счета, в таком случае она отображается в программе с помощью операторв IF. Подобная ситуация

встречается, например, при имитационном моделировании цифровых схем.

ЗАКЛЮЧЕНИЕ

Прогноз роста характеристик микропроцессоров на ближайшие годы указывает на следующие тенденции [24]:

Характеристика

Темпы удвоения характеристики

Состояние на 1995 год

Состояние на 2000     год

       Частота синхронизации

       3,6 года

       10 Мгц

      300 Мгц

Число транзисторов на     крисстале

   ( процессор)

      2 года

 

       6 млн

   50-100 млн

Разрядность шин    данных

       5 лет

         160

-

                  Таким образом, к 2000 году за счет параллелизма и повышения тактовой частоты возможно получение быстродействия триллионы оп/с. Это позволяет перейти к новому способу оценки быстродействия ЭВМ, определяя его как задержку (время реакции) при решении крупных задач.

Высокие характеристики микропроцессоров во многом решают проблему аппаратуры, но выдвигают ряд новых проблем в области архитектуры и программирования. Не касаясь проблем, общих для всей вычислительной техники, перечислим некоторые проблемы, связанные непосредственно с параллелизмом:

             1. Исследования численных методов показывают (см. гл. 6),

что в них имеется достаточно большой уровень параллелизма.

С другой стороны, характеристики микропроцессоров таковы,

что представляется возможным строить системы с сотнями и тысячами процессоров. Таким образом, развитие параллельных ЭВМ

обосновано как со стороны алгоритмов, так и со стороны аппаратуры. Однако большое разнообразие параллельных архитектур

приводит к распылению сил в разработке параллельной техники.

Это означает, что вопросы унификации параллельных архитектур

становятся центральными. Одной из наиболее перспективных является архитектура МКМД-ЭВМ на базе n-кубов, в узлах которой

используются векторные и суперскалярные процессоры.

                 2. Параллельное программирование является слишком сложным для массового пользователя, поэтому вопросы автоматизации

распараллеливания, планирования и отладки пользовательских

программ становятся ведущими в разработке программного обеспечения параллельных ЭВМ.

               3. Выживаемость любой новой архитектуры в первую очередь

определяется возможностью быстрого создания большого объема

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

Все упомянутые выше проблемы в той или иной мере нашли

отражение в  данном конспекте.

                   Список литературы 

        1.  Воеводин В. В., Воеводин Вл. В.       Параллельные вычисления. — СПб.: БХВ-Петербург, 2002. — 608 с: ил.

        2.   Шпаковский Г.И. Организация параллельных ЭВМ и суперскалярных

процессоров: Учеб. пособие. — Мн.: Белгосуниверситет, 1996. — 296 с.: ил.

3. Антонов А. С, Воеводин Вл. В. Эффективная адаптация последовательных программ для современных векторно-конвейерных и массивно-параллельных супер-ЭВМ // Программирование. — 1996. — № 4. — С. 37-51.

4. Васильев Ф. П. Численные методы решения экстремальных задач. — М.: Наука, 1988. - 430 с.

5. Воеводин В. В. Вычислительные основы линейной алгебры. — М.: Наука, 1977. - 304 с.

6. Воеводин В. В. Информационная структура алгоритмов. — М.: МГУ, 1997. - 139 с.

7. Воеводин В. В. Компьютерная революция и вычислительная математика // Математика и кибернетика. — М.: Знание. — 1988. — Вып. 3. — 47 с.

8. Воеводин В. В. Массивный параллелизм и декомпозиция алгоритмов // ЖВМ и МФ. - 1995. - Т. 35. № 6. - С. 988-996.

9. Воеводин В. В. Математические модели и методы в параллельных процессах. — М.: Наука, 1986. — 296 с.

10. Воеводин В. В. Математические основы параллельных вычислений. — М.: МГУ, 1991. - 345 с.

11. Воеводин В. В. Параллельные структуры алгоритмов и программ. — М.: ОВМ АН СССР. 1987. - 148 с.

12. Воеводин В. В. Полиномиальное оценивание сложности алгоритмов // ЖВМ и МФ. - 1999. - Т. 39, № 6. - С. 1032-1040.

13. Воеводин В. В. Численные методы алгебры (теория и алгоритмы). — М.: Наука, 1966. - 248 с.

14. Воеводин В. В., Краснов С. А. Математические вопросы проектирования систолических массивов / Препринт ОВМ АН СССР. 1985. — № 80. — 26 с.

15. Воеводин В. В., Пакулев В. В. Определение дуг графа алгоритма / Препринт ОВМ АН СССР. 1989. - № 228. - 22 с.

16. Воеводин Вл. В. Статистический анализ и вопросы эффективной реализации программ // Вычислительные процессы и системы. — 1993. — № 9. - С. 249-301.

17. Воеводин Вл. В. Статистические оценки возможности выявления параллельной структуры последовательных программ // Программирование. — 1990. - № 4. - С. 44-54.

18. Воеводин Вл. В. Легко ли получить обещанный гигафлоп? // Программирование. — 1995. — № 4. — С. 13—23.

19. Воеводин Вл. В. Проект профессионального центра в сети Интернет // Тезисы докладов научной конференции "Интернет и современное общество" (30 ноября — 3 декабря. — 1999 г., г. Санкт-Петербург). СПб. — 1999. - 55 с.

20. Воеводин Вл. В. Суперкомпьютеры: вчера, сегодня, завтра // Наука и жизнь. - 2000. - № 5. - С. 76-83.

21. Воеводин Вл. В. Теория и практика исследования параллелизма последовательных программ // Программирование. — 1992. — № 3. — С. 38—53.

22. Воеводин Вл. В. Точное описание входных и выходных данных программ // Вестн. Моск. ун-та. Сер. 15, Вычислительная математика и кибернетика. — 1997. — № 1. — С. 41—44.

23. Воеводин Вл. В., Капитонова А. П. Методы описания и классификации архитектур вычислительных систем. — М.: МГУ. 1994. — 79 с.

24. Головкин Б. А. Параллельные вычислительные системы. — М.: Наука, 1980. - 520 с.

25. Гэри М., Джонсон Д. Вычислительные машины и труднорешаемые задачи. — М.: Мир. 1982. — 416 с.

26. Дымников В. П. Современные проблемы моделирования отклика климатической системы на малые внешние воздействия // Труды межд. теор. конф. "Проблемы гидрометеорологии и окружающей среды на пороге XXI века". — М.: Гидрометеоиздат, 2000. — С. 14—34.

27. Ершов А. П. Современное состояние теории схем профамм // Проблемы кибернетики. — 1973. — № 27. — С. 87—110.

28. Забродин А. В., Луцкий А. Е., Марбашев К. X., Чернов Л. Г. Численное исследование обтекания летательных аппаратов и их элементов в реальных полетных режимах // Общероссийский науч.-техн. журнал "Полет". - 2001. - № 7. - С. 21-29.

29. Задыхайло И. Б. Организация циклического процесса счета по параметрической записи специального вида // ЖВМ и МФ. — 1963. — Т. 3. № 2. - С. 337-357.

30. Коновалов Н. А., Крюков В. А., Погребцов А. А., Сазанов Ю. Л. С-DVM — язык разработки мобильных параллельных программ // Программирование. — 1999. — № 1. — С. 20—28.

31. Крюков В. А., Удовиченко Р. В. Отладка DVM-программ // Программирование. - 2001. - № 3. - С. 19-29.

32. Арапов Д. М., Калинов А. Я., Ластовецкий А. Л., Дедовских И. Н., Посыпкин Н. А. Язык и система программирования для высокопроизводительных параллельных вычислений на неоднородных сетях // Программирование. — 2000. — № 4. — С. 55—80.

33. Лебедев С. А. Электронно-вычислительные машины // Сессия АН СССР по научным проблемам автоматизации производства. Пленарные заседания. - М.: АН СССР. - 1957. - Т. 1. - С. 162-180.

34. Котов В. Е., Марчук Г. И. Проблемы вычислительной техники и фундаментальные исследования // Автомат, и вычисл. техн. — 1979. — № 2. — С. 3-14.

35. Мультипроцессорные системы и параллельные вычисления / Под ред. Ф. Г. Энслоу. - М.: Мир, 1976. - 384 с.

36. Оре О. Теория графов. — М.: Наука, 1980. — 336 с.

37. Михайлов А. П., Самарский А. А. Компьютеры и жизнь. — М.: Педагогика, 1987. - 128 с.

Интернет-ресурсы

1. http://www.citforum.ru — сервер информационных технологий.

2. http://www.parallel.ru — Информационно-аналитический центр по параллельным вычислениям в сети Интернет.

 


 

А также другие работы, которые могут Вас заинтересовать

14100. Конструювання моделей із сірникових коробок та Аплікація. Види аплікацій. Естетика і культура 5.11 MB
  Конспект залікового уроку з трудового навчання проведеного в 2А класі ЗОШ ІІІІ ступенів № 2 Тема уроку: Конструювання моделей із сірникових коробок. Об’єкт праці. Виготовлення моделей вантажних та легкових автомобілів. Мета. Ознайомити учнів із поняттям констр
14101. Конспект уроку Я і Україна. Декларація прав дитини. Про доброту і милосердя 607.11 KB
  Конспект уроку Я і Україна 2 клас 02. 03 Тема. Декларація прав дитини. Основний Закон держави. Обов’язки батьків та дітей. Мета. Формувати в учнів уявлення про Декларацію прав людини Основний Закон нашої держави; з’ясувати обов’язки батьків і дітей; виховувати шано...
14103. Секретарська справа. Конспект уроків та лекцій 767.33 KB
  УРОК № Тема: Вимоги до приміщення де знаходиться місце секретаря. Санітарно гігієнічні вимоги. Мета уроку: ознайомити учнів з загальними та санітарногігієнічними вимогами до приміщення секретаря. Ознайомити з сучасними тенденціями у обладнанні офісів та орга
14104. Легка атлетика. Біг на короткі дистанції. Техніка естафетного бігу та передачі естафетної палички 103 KB
  ПЛАН ВІДКРИТОГО ЗАНЯТТЯ для студентів денного відділення Тема заняття: Легка атлетика. Біг на короткі дистанції. Техніка естафетного бігу та передачі естафетної палички. Мета заняття: Місце проведення: Спортивний майданчик. Планконспект заняття ...
14105. Легка атлетика. Орієнтовний план уроку для учнів 5-х класів 43.5 KB
  Орієнтовний план уроку для учнів 5х класів початковий етап розвитку витривалості Тема уроку: Легка атлетика. Мета уроку: навчальна ознайомити з технікою бігу з низького старту. Вивчати техніку стрибку у кроці з приземленням на обидві ноги. Вивчити техніку метанн...
14106. Баскетбол. Конспект уроку для учнів 8 класу 142 KB
  КОНСПЕКТ УРОКУ для учнів 8 класу ТЕМА УРОКУ: БАСКЕТБОЛ ЗАВДАННЯ УРОКУ: вдосконалити техніку виконання ведення і передач м’яча на місці і в русі; вдосконалити техніку кидків в корзину після подвійного кроку; виховувати почуття колективізму та взаємови
14107. Баскетбол. Урок з фізкультури 63.5 KB
  Місце проведення: спортивна зала Тема: Баскетбол Мета уроку: Поглибити знання учнів з історії виникнення й розвитку баскетболу. Повторити правила гри у баскетбол. Закріпити отримані дітьми навички й уміння з техніки виконання стійки гравця та пересування з м’ячем
14108. Цикл с параметрами 256.5 KB
  9 урок Цикл с параметрами.1 урок. Общий вид цикла для: нц для i от i1 до i2 тело_цикла кц Здесь i величина типа цел она называется параметром цикла а i1 и i2 целые выражения т. е. выражения типа цел. При выполнении цикла для тело цикла выпол няется последовательно