Книга
Книга
ЧАСТЬ I
МОДЕЛИ ВЫЧИСЛЕНИЙ
Глава 1
ОСОБЕННОСТИ ОБРАБОТКИ В СИСТЕМАХС МАСШТАБИРУЕМОЙ АРХИТЕКТУРОЙ
Масштабируемые параллельные системы
Общая характеристика и типы. Масштабируемые параллельные системы, как уже говорилось, можно подразделить на мультикомпьютеры, кластеры, симметричные мультипроцессоры, архитектуры с распределенной памятью и массово-параллельные системы (табл. 1.1). Ориентация на использование в вычислительных системах серийных микропроцессоров и памяти позволяет снизить стоимость, приходящуюся на единицу производительности. Именно соотношение стоимости и производительности стало одной из основных
Таблица 1.1
Основные характеристики масштабируемых вычислительных систем
Характеристика
Тип системы
Мультикомпьютер
Кластер
SMP, DSM
МРР
Порядок числа N узлов
ПьПММ
до 100
10-100
100-1000
Сложность узла
В широком диапазоне: от компьютера и выше
Компьютер, рабочая станция
Один или несколько процессоров
От процессорного элемента до компьютера
Взаимодействие узлов
Разделяемые файлы, удаленный вызов процедуры, обмен сообщениями, уровень процессов
Обмен сообщениями
Общая разделяемая (SMP) или распределенная (DSM) память
Обмен сообщениями или разделение переменных распределенной памяти
Таблица 1.1 ^окончание^
Характеристика
Тип системы
Мультикомпьютер
Кластер
SMP, DSM
МРР
Планирование вычислительных работ
Независимые очереди процессов
Множество скоординированных очередей
Одна очередь
Одна очередь на хост-узле
Поддержка образа единой системы
Частично
Да
Да (SMP) или иногда (NUMA)
Частично
Тип и наличие копий ОС
N копий распределенной ОС
N копий или N разных ОС или микроядер
1 монолитная (SMP), от 1 до N в DSM
N микроядер монолитной ОС или N копий распределенной ОС
Адресное пространство
Множественное
Множественное или единое
Единое
Множественное или единое (DSM)
причин вытеснения векторно-конвейерных суперкомпьютеров массовопараллельными системами.
Доминирование МРР-архитектур среди вычислительных систем высокой производительности началось в 90-х годах XX века. Тем не менее это вовсе не означает окончание эры векторных компьютеров. Серьезные достижения в этом направлении имеют японские корпорации NEC, Hitachi, а также американская компания SGI (проект Cray SV1). Однако в настоящей книге мы ограничиваемся системами, в которых использование коммерчески доступных кристаллов процессоров и памяти является одним из необходимых условий масштабируемости.
Мультикомпьютеры. Мультикомпьютер — совокупность объединенных сетью отдельных вычислительных модулей, каждый из которых управляется своей операционной системой (ОС). Пример — серия SP фирмы IBM. Узлы мультикомпьютера, как правило, не имеют общих структур, кроме сети, обладают высокой степенью автономности и могут состоять из отдельных компьютеров или представлять собой различные комбинации кластеров, SMP-, DSM- и МРР-систем.
Для распределенной ОС мультикомпьютер выглядит как виртуальный однопроцессорный ресурс, хотя понятие образа единой системы, поддерживаемого в кластерах программным обеспечением промежуточного уровня, в полной мере к мультикомпьютерам не применимо. Взаимодействие процессов реализуется с помощью явно заданных one™
раций связи между отдельными вычислителями, например с помощью библиотеки MPL
Обычно в мультикомпьютере реализуется согласованный сетевой протокол и нет единой очереди выполняющихся процессов. Хотя известны и другие примеры. Например, система пакетной обработки заданий LL (Load Leveler) может применяться в суперкомпьютерах IBM SP (см. § 1.3). В отличие от традиционных вычислительных сетей, как локальных (LAN — local area networks), так и глобальных (WAN — wide area networks), мультикомпьютер может рассматриваться пользователем как общий ресурс, выполняющий отдельные части его параллельной программы.
Кластеры. Кластер — набор компьютеров, рассматриваемый ОС, системным программным обеспечением, программными приложениями и пользователями как единая система [9, 104]. Кластеры получили широкое распространение благодаря высокому уровню готовности при относительно низких затратах. Высокая готовность объясняется отсутствием совместно используемой оперативной памяти и наличием в каждом узле копии ОС или своей ОС в неоднородных кластерах. Специальное программное обеспечение производит контроль работоспособности узлов. Если какой-либо из узлов кластера считается вышедшим из строя, его ресурсы, например, дисковое пространство, и программы переназначаются на другие узлы.
По существу кластер образуется из отдельных «полноценных» узлов, включающих процессоры, память, подсистему ввода/вывода, ОС и т. д. При объединении компьютеров в кластер чаще всего поддерживаются прямые межузловые коммуникации, осуществляемые посредством передачи сообщений. Коммуникационные системы могут быть как довольно простыми (например, на основе сети Ethernet), так и довольно сложными, реализуемыми такими высокоскоростными сетями, как SCI, Memory Channel, ServerNet, Myrinet. Возможно использование нескольких независимых сетей. Так, в отечественном суперкомпьютере МВС-1000М [35] (Межведомственный суперкомпьютерный центр) сеть Myrinet используется для обмена данными в пользовательских программах, a Fast Ethernet — для выполнения сервисных функций ОС.
Две типичных организации кластеров — это архитектура с разделяемыми дисками (рис. 1.1, а) и архитектура без разделения ресурсов (рис. 1.1, бу В первой из них все узлы имеют доступ к общим дискам, на которых может располагаться единая база данных. Во второй архитектуре, несмотря на то, что поддерживается целостный образ ресурса, каждый узел имеет собственные оперативную память и диски. В таких системах общей является лишь коммуникационная система.
С точки зрения увеличения производительности, кластер — хорошо масштабируемая система. Однако отсутствие общей разделяемой памяти (а иногда и единого адресного пространства) обуславливает большие накладные расходы, связанные с обменом сообщениями между узлами.
Рис. 1.1. Кластеры с разделяемыми дисками (а) и без разделения ресурсов (б)
Так, при использовании в кластерах коммуникационного протокола TCP/IP временные затраты на обмен несоизмеримо больше затрат на передачу данных в SMP- и DSM-системах. Существуют специальные протоколы для внутрикластерных коммуникаций, значительно снижающие время обмена, например Virtual Interface Architecture (разработка группы компаний во главе с Intel).
Наиболее эффективной областью применения кластеров являются хорошо структурируемые, как правило, научные приложения. С позиций удобства масштабирования кластерные архитектуры допускают практически неограниченное наращивание числа узлов. Однако для управления кластером необходимы специальные инструменты администрирования, поддерживающие образ единого ресурса, в частности система пакетной обработки заданий.
Симметричные мультипроцессоры. SMP-системы состоят из нескольких десятков процессоров, разделяющих общую основную (оперативную) память и объединенных коммуникационной системой (рис. 1.2). Существуют варианты SMP-архитектур с од-
Рис. 1.2. Структура SMP-системы
ной и несколькими системными шинами (например, четырьмя в Cray SuperServer 6400), а также со специальным коммутатором для связи процессоров, памяти и подсистемы ввода/вывода (Sun Ultra Enterprise 6000).
Каждый процессор имеет доступ ко всей основной памяти, может прерывать другие процессоры и выполнять операции ввода/вывода. Пропускная способность коммуникационной системы достаточна для поддержания быстрого доступа к памяти. У отдельных процессоров имеется один или несколько уровней собственной кэш-памяти.
Достаточный объем кэша и сравнительно небольшое количество процессоров в SMP-системах позволяют удовлетворить обращения к основной памяти, поступающие от нескольких процессоров, так что время доступа к общей памяти примерно одинаково для всех процессоров. Это объясняет еще одно название таких архитектур — UMA (Uniform Memory Access), т. е. однородный доступ к памяти. В них имеется одна ОС, а программное обеспечение работает с единым адресным пространством общей памяти, несмотря на реально существующую иерархию «кэш-основная память».
При этом возникает сложная проблема сохранения когерентности данных, т. е. согласованных изменений содержимого кэшей и общей памяти, когда предотвращается использование копий данных в кэше какого-либо процессора, если они подверглись модификации в другом процессоре. Следовательно, если модифицируется одна из копий данных, остальные копии должны либо так же модифицироваться, либо объявляться недостоверными. По сути это определяет два альтернативных подхода к поддержанию когерентности разделяемых данных: запись с обновлением и запись с аннулированием копий данных. В SMP- системах, как правило, реализуется шинный протокол наблюдения (snoopy), когда происходит «прослушивание» шины всеми процессорами с целью обнаружения операций записи в те ячейки памяти, копии содержимого которых размещены в кэшах. Производительность систем с общей памятью, в том числе и SMP, зависит от принятой модели согласованности (consistency) памяти, определяющей, в каком порядке процессоры наблюдают последовательность операций записи и чтения (см. § 1.2).
Разумеется, передача данных между кэшами разных процессоров в SMP-системах выполняется значительно быстрее, чем обмен данными между узлами кластера или мультикомпьютера. Поэтому SMP- архитектуры хорошо масштабируются с целью увеличения производительности при обработке большого числа коротких транзакций, свойственных банковским приложениям. Что же касается удобства масштабирования и уровня готовности, то SMP-системы уступают кластерам. Ограничения в наращивании числа процессоров обусловлены, прежде всего, наличием общей основной, нераспределенной по процессорам памяти и поддержанием моделей строгой, последовательной или процессорной согласованности.
Сохранение когерентности требует специальных аппаратных средств быстрой модификации копий данных. Однако если при этом следовать модели строгой согласованности, когда каждая операция чтения возвращает последнее записанное значение, то снижение про™
изводительности системы неизбежно. Причина заключается в том, что необходимо введение «единого времени» и упорядочение действий всех процессоров.
Невысокая степень готовности SMP-систем объясняется сильной связанностью процессоров и наличием одной ОС, разделяемой всеми процессорами. Потеря работоспособности каким-либо из них может привести к деградации системы, если модифицированная вышедшим из строя процессором копия данных не передается другим процессорам и в основную память.
Системы с распределенной разделяемой памятью. DSM-системы могут быть реализованы различными способами. Общим является наличие, помимо кэша, локальной памяти в каждом процессорном узле. Узел может состоять из нескольких процессоров и иметь архитектуру SMP. Поддерживается общее адресное пространство памяти. Однако при этом память является распределенной по узлам, и время доступа зависит от места расположения данных. Поэтому некоторые DSM-системы получили название NUMA (Non-Uniform Memory Access), что означает неоднородный доступ к памяти.
Один из способов реализации NUMA-архитектур — отказ от аппаратных средств поддержки когерентности кэшей. Наиболее известные примеры таких систем — это суперкомпьютеры Cray T3D/T3E. Процессорные узлы в таких системах объединяются сетью, в узлах которой размещаются специальные контроллеры, анализирующие адрес обращения к памяти. Если данные размещаются в памяти удаленного узла, то его контроллеру посылается сообщение для обращения к этим данным. Разделяемые данные не заносятся в кэши, что снимает проблему когерентности. Однако по сравнению с SMP-системами программирование таких NUMA-архитектур усложняется. Механизмы программной поддержки компилятором когерентности данных ограничены, и существующие методы применимы к программам с хорошо структурированным параллелизмом на уровне циклов.
Альтернативный способ — обеспечение согласованности данных в кэш-памяти всех процессорных узлов. В архитектуре ccNUMA (cache coherent NUMA) механизм работы кэша каждого узла увязан с доступом к локальной памяти удаленного узла. Одна из первых реализаций этого принципа — система NUMA-Q компании Sequent. Другой пример — компьютер HP Superdome. Состояния кэшей отслеживаются с помощью протокола на основе справочника (directory). Этот протокол может рассматриваться как альтернатива протоколу наблюдения. Общая структура ccNUMA-системы показана на рис. 1.3.
Справочник распределен по узлам ccNUMA-системы и хранит состояние каждого блока данных, который может заноситься в кэш. В справочнике содержится информация о том, в каких кэшах имеются копии этого блока данных, а также сведения о модификации данных. Пусть узел 1 (см. рис. 1.3) обращается к ячейке с адресом А в основ™
Коммуникации
Рис. 1.3. Структура ccNUMA-системы
ной памяти, не являющейся локальной памятью узла 1. Справочник узла 1 анализирует адрес Л и распознает, что он относится к локальной памяти узла N. После этого он посылает сообщение с запросом Л в справочник узла N^ который выбирает значение ячейки Л из своей локальной памяти и передает его справочнику узла 1. В отличие от шинного протокола наблюдения при записи нового значения в кэш узла сообщение о модификации передается не всем узлам, а лишь тем, в которых имеются копии соответствующих данных. Достоинством протокола на основе единого справочника является его простота. Однако размеры справочника пропорциональны емкости не кэш-памяти, а основной памяти системы.
Иерархичность доступа к памяти в NUMA-архитектурах сдерживает увеличение числа процессорных узлов. Как правило, в современных NUMA-системах их число не больше 64, а число процессоров — 128. Для сглаживания неоднородности по времени доступа к памяти некоторые поставщики ccNUMA-систем определенным образом модифицируют ОС: при запросе программой данных ОС выделяет соответствующую область локальной памяти именно в том узле, в котором эта программа выполняется. И все же в силу дополнительных накладных расходов на пересылку данных из удаленных узлов NUMA-архитектуры вряд ли могут заменить симметричные мультипроцессоры на задачах, требующих интенсивного трафика обмена данными и частой синхронизации работы процессоров. Из-за проблем с масштабируемостью и SMP-системы, и NUMA-системы в большей степени ориентированы на емкий рынок коммерческих приложений (например, в качестве UNIX- серверов), нежели на место среди наиболее производительных систем в классе суперкомпьютеров. Невысокая степень готовности ccNUMA- архитектур объясняется теми же причинами, что и для симметричных мультипроцессоров: наличием единой ОС и необходимостью поддержки когерентности кэш-памяти.
Как развитие архитектуры ccNUMA, преодолевающее ограничение на масштабируемость, можно рассматривать архитектуру S2MP (Scalable Shared Memory MultiProcessing), реализованную в компьютерах Опух 2 и Origin 2000 фирмы SGI (рис. 1.4).
Одним из узких мест, сдерживающих увеличение числа процессор
ных узлов, является пропускнаяных узлов, является пропускнаяРис. 1.4. Структура S2MPРис. 1.4. Структура S2MPспособность шин оперативной памяти. В частности, по этому показателю векторно-конвейерные суперкомпьютеры (например, Cray С90) сильно опережают системы на базе RISC-микропроцессоров [8]. В архитектуре S2MP процессорные узлы (рис. 1.5) объединены сетью, образуемой средой межсоединений (CrayLink Interconnect) и маршрутизаторами, что сближает S2MP с архитектурой Server Net.
ных узлов, является пропускная
ных узлов, является пропускная
Рис. 1.4. Структура S2MP
Рис. 1.4. Структура S2MP
Структура сети позволяет многим процессорным узлам одновременно связываться друг с другом.
к машрутизаторуРис. 1.5. Структура процессорного узла архитектуры S2MPк машрутизаторуРис. 1.5. Структура процессорного узла архитектуры S2MPВажная часть каждого узла (см. рис. 1.5) — концентратор. По сути он представляет собой коммутатор (crossbar switch) с четырьмя двунаправленными портами, которые связывают его с процессорами, оперативной памятью, подсистемой ввода/вывода и маршрутизаторами.
к машрутизатору
Рис. 1.5. Структура процессорного узла архитектуры S2MP
к машрутизатору
Рис. 1.5. Структура процессорного узла архитектуры S2MP
Для поддержания когерентности кэшей используется протокол справочника. Применение программируемых маршрутизаторов позволяет реализовать системы с различной топологией. В частности, в компьютерах Origin 2000 стандартной является топология гиперкуба, а число процессорных узлов достигает 512.
Архитектура NUMAflex, положенная в основу систем Origin 3x00, во многом наследует черты S2MP. Более высокая степень готовности обеспечивается технологией так называемого разделения, которая роднит NUMAflex с кластерами. Каждый раздел, представляющий собой независимый сервер, для связи с другими узлами использует инфра-
структуру межсоединений (см. рис. 1.4). В каждом разделе может работать своя версия ОС Irix. Специальные аппаратные средства позволяют изолировать ошибку, возникающую в одном из разделов, не давая ей распространиться далее.
Существуют также и другие разновидности систем с распределенной разделяемой памятью: СОМА — Cache Only Memory Architecture и системы с рефлексивной памятью (RM — reflective memory).
В СОМА-архитектурах (рис. 1.6) локальная память узла строится по принципу кэш-памяти и называется притягивающей. Поступающий в узел блок данных размещается в кэше процессора и притягивающей
Коммуникации
Рис. 1.6. Структура процессорного узла СОМА-архитектуры
памяти. Каждый блок данных снабжается тегом, определяющим адрес блока и его состояние. Если требуемый блок данных не содержится в кэше, то контроллер памяти узла просматривает теги притягивающей памяти с целью извлечения необходимых данных из локальной памяти узла. При их отсутствии запрашивает другие процессорные узлы системы. Примеры систем с архитектурой СОМА: KSR, SUN S3.mp, DDM.
Способы реализации СОМА-архитектуры различаются организацией межузловых связей. В многоуровневых СОМА-системах имеет место древовидная структура шин. Каждый уровень дерева содержит справочник со сведениями о блоках данных, размещаемых в нижележащих уровнях. Поэтому при поиске данных необходимо просматривать справочники вышележащих уровней иерархии до тех пор, пока не будет обнаружен требуемый блок данных.
В одноуровневых (плоских) СОМА-системах справочник каждого узла содержит сведения о местоположении резидентных данных этого узла. В таких системах, в отличие от иерархических СОМА- архитектур, для организации межузловых взаимодействий не требуются специальные сети. Если необходимый блок данных не содержится в притягивающей памяти узла, то определяется резидентный узел, в справочнике которого имеется информация о местоположении требуемых данных. В резидентный узел направляется запрос на передачу данных. В случае их отсутствия в притягивающей памяти резидентного узла запрос направляется к местоположению данных в соответствии со справочником.
Притягивающая память функционирует подобно кэшу. Однако данные, удаляемые из нее, должны быть размещены в притягивающей
памяти другого процессорного узла. Если существует несколько копий блока данных, то одна из них объявляется основной. В отличие от других копий, основная обязательно перемещается в притягивающую память другого узла, если нет места для вновь поступающих в узел данных. Таким образом, для СОМА-архитектуры характерно перемещение данных между отдельными узлами, что создает дополнительную нагрузку на коммуникационную сеть.Главной особенностью RM-архитектур является то, что каждая ко- всех процессорных узлах имеет одно и то же значение. Общая структура узла RM- системы показана на рис. 1.7.Страницы памяти узла делятся на локальные неразделяемые и глобальные разделяемые. Рефлексивная память содержит глобально разделяемые страницы, отображаемые в единое адресное пространство. В отличие от NUMA- и СОМА-архитектур, в RM-архитектуре для пользователя имеется возможность управлять степенью разделения данных путем заполнения таблиц трансляции адресов, отображающих область локальной памяти узла в единое адресное пространство. Таким образом, фиксированнаяпамяти другого процессорного узла. Если существует несколько копий блока данных, то одна из них объявляется основной. В отличие от других копий, основная обязательно перемещается в притягивающую память другого узла, если нет места для вновь поступающих в узел данных. Таким образом, для СОМА-архитектуры характерно перемещение данных между отдельными узлами, что создает дополнительную нагрузку на коммуникационную сеть.Главной особенностью RM-архитектур является то, что каждая ко- всех процессорных узлах имеет одно и то же значение. Общая структура узла RM- системы показана на рис. 1.7.Страницы памяти узла делятся на локальные неразделяемые и глобальные разделяемые. Рефлексивная память содержит глобально разделяемые страницы, отображаемые в единое адресное пространство. В отличие от NUMA- и СОМА-архитектур, в RM-архитектуре для пользователя имеется возможность управлять степенью разделения данных путем заполнения таблиц трансляции адресов, отображающих область локальной памяти узла в единое адресное пространство. Таким образом, фиксированнаяпия разделяемых данныхКоммуникационная системапия разделяемых данныхКоммуникационная системавовоАдаптеркоммуникационнойсистемыАдаптеркоммуникационнойсистемы| Память"|| Память"|IШина| процессора | Процессор |IШина| процессора | Процессор |Рис. 1.7. Структура процес-сорного узла RM-архитекту-рыРис. 1.7. Структура процес-сорного узла RM-архитекту-ры
памяти другого процессорного узла. Если существует несколько копий блока данных, то одна из них объявляется основной. В отличие от других копий, основная обязательно перемещается в притягивающую память другого узла, если нет места для вновь поступающих в узел данных. Таким образом, для СОМА-архитектуры характерно перемещение данных между отдельными узлами, что создает дополнительную нагрузку на коммуникационную сеть.
Главной особенностью RM-архитектур является то, что каждая ко- всех процессорных узлах имеет одно и то же значение. Общая структура узла RM- системы показана на рис. 1.7.
Страницы памяти узла делятся на локальные неразделяемые и глобальные разделяемые. Рефлексивная память содержит глобально разделяемые страницы, отображаемые в единое адресное пространство. В отличие от NUMA- и СОМА-архитектур, в RM-архитектуре для пользователя имеется возможность управлять степенью разделения данных путем заполнения таблиц трансляции адресов, отображающих область локальной памяти узла в единое адресное пространство. Таким образом, фиксированная
памяти другого процессорного узла. Если существует несколько копий блока данных, то одна из них объявляется основной. В отличие от других копий, основная обязательно перемещается в притягивающую память другого узла, если нет места для вновь поступающих в узел данных. Таким образом, для СОМА-архитектуры характерно перемещение данных между отдельными узлами, что создает дополнительную нагрузку на коммуникационную сеть.
Главной особенностью RM-архитектур является то, что каждая ко- всех процессорных узлах имеет одно и то же значение. Общая структура узла RM- системы показана на рис. 1.7.
Страницы памяти узла делятся на локальные неразделяемые и глобальные разделяемые. Рефлексивная память содержит глобально разделяемые страницы, отображаемые в единое адресное пространство. В отличие от NUMA- и СОМА-архитектур, в RM-архитектуре для пользователя имеется возможность управлять степенью разделения данных путем заполнения таблиц трансляции адресов, отображающих область локальной памяти узла в единое адресное пространство. Таким образом, фиксированная
пия разделяемых данных
Коммуникационная система
пия разделяемых данных
Коммуникационная система
во
во
Адаптеркоммуникационнойсистемы
Адаптеркоммуникационнойсистемы
| Память"|
| Память"|
IШина
| процессора | Процессор |
IШина
| процессора | Процессор |
Рис. 1.7. Структура процес-сорного узла RM-архитекту-ры
Рис. 1.7. Структура процес-сорного узла RM-архитекту-ры
адресация всей памяти отсутствует, вместо нее применяется отображение в единое адресное пространство выделенных страниц. Взаимные преобразования локальных адресов узла и глобальных адресов осуществляются с помощью адаптера коммуникационной системы (см. рис. 1.7). Необходимость модификации множественных копий разделяемых страниц может создавать большую нагрузку на коммуникации. Примеры кластерных реализаций RM-архитектуры: AlphaServer8xxx, HP SPP1600, DEC TruCluster.
В рассмотренных системах с общей памятью применяются различные механизмы поддержки когерентности. Так, в SMP-архитектурах возможны как модификация разделяемых данных, так и объявление их недостоверными. В архитектурах NUMA и СОМА реализуется объявление разделяемых данных недостоверными, в RM-архитектуре — модификация разделяемых страниц.
Массово-параллельные системы. Прежде всего эти системы характеризуются большим числом процессорных узлов (см. табл. 1.1). Узлы обычно состоят из одного или нескольких процессоров, локальной памяти и нескольких устройств ввода/вывода.
Чаще всего в МРР-системах реализуется архитектура без разделения ресурсов. В каждом узле работает своя копия ОС, а узлы объединяются специализированной коммуникационной средой. Если узел управ-
ляется своей собственной ОС и имеет уникальное адресное пространство памяти, то не требуется аппаратного обеспечения когерентности. Когерентность в этом случае обеспечивается программными средствами на основе техники обмена сообщениями. Такие МРР-системы можно отнести к мультикомпьютерам (например, IBM SP1 и SP2).
В МРР-системах с распределенной разделяемой памятью возможна как программная, так и аппаратная поддержка когерентности кэшпамяти. Как уже отмечалось, эти разновидности массово-параллельных систем можно определить соответственно как NUMA (например, Cray T3D/3E) и ccNUMA (в частности, Origin 2000/3x000, а также системы HP Exemplar).
Вообще же нужно признать, что классификацию МРР-архитектур и используемую при этом терминологию вряд ли можно считать устоявшимися.
Итак, общей особенностью рассмотренных масштабируемых систем является распределенность процессов обработки и распределенность данных. С одной стороны, в распределении вычислений и данных заложена возможность повышения производительности таких систем. С другой стороны, интенсивный обмен данными, часто и не вызванный информационными зависимостями между процессами обработки, как в СОМА-архитектуре, сильно загружает коммуникационную среду. Естественно, это ограничивает возможности масштабирования систем. Следовательно, эффективность выполнения программ в масштабируемых архитектурах в значительной мере зависит от организации взаимодействия распределенных процессов.
. Вычисления и обмен даннымив масштабируемых системах
Модель обмена сообщениями. Модели обмена данными в распределенных системах настолько важны, что зачастую та или иная модель параллельных вычислений ассоциируется с конкретным способом взаимодействия процессов или нитей (легковесных процессов). Нить, в отличие от полновесного процесса, нс имеет защищенной области памяти, хотя может обладать своими локальными переменными, и разделяет с другими нитями общий ресурс, например оперативную память. Каждая из нитей управляется своим потоком команд. Далее понятие «процесс» будет использоваться тогда, когда деление на полновесные и легковесные процессы не является существенным. Основные способы взаимодействия процессов в масштабируемых параллельных системах: обмен сообщениями, разделение общей памяти и прямой доступ к удаленной памяти (RDMА — remote direct memory access).
Модель обмена сообщениями, посредством которых передаются данные, как уже говорилось, применима к различным архитектурам —
без единого адресного пространства (мультикомпьютеры и кластеры) и с общей памятью (SMP, DSM). Модели распределенной обработки традиционно использовали механизм передачи сообщений. Так, удаленный вызов процедуры (RPC — remote procedure call) является по сути одним из способов передачи сообщений. В средах DCOM (Distributed Component Object Model) и CORBA (Common Object Request Broker) вызов метода представляет собой объектный вариант RPC. При этом RPC реализует схему передачи сообщений, в соответствии с которой в распределенном приложении взаимодействуют процедура-клиент и процедура-сервер. Технологии InfiniBand и RapidlO предусматривают операции передачи сообщений, хотя и предполагают реализацию концепции общей разделяемой памяти [28].
Разновидности модели обмена сообщениями определяются главным образом реализацией механизмов и организацией среды для взаимодействия процессов. Сначала поясним, что понимается под меха™ низмом взаимодействия. Прежде всего, это — режимы и характер передачи/приема сообщений.
Различают неблокирующий и блокирующий режимы обмена. При неблокирующем обмене ни один из взаимодействующих процессов не приостанавливается, дожидаясь завершения приема (receive) или передачи (send) сообщения. Если обмен блокирующий, то передающий процесс (source) и/или принимающий процесс (destination) продолжают работу лишь после подтверждения получения сообщения.
Характер обмена сообщениями может быть синхронным, асинхронным либо асинхронно/синхронным. При синхронном обмене один из взаимодействующих процессов, достигая некоторого состояния, в котором он готов к обмену, переходит в режим ожидания до тех пор, пока другой процесс не достигнет соответствующего состояния. В этом смысле такой обмен можно назвать блокирующим.
Классические примеры синхронной передачи сообщений — механизмы рандеву в моделях Ч. Хоара (CSP — communicating sequential processes) [106] и Р. Милнера (CCS — calculus of communicating systems) [134]. Рандеву представляют собой атомарные, мгновенные акции, или события, соответствующие взаимодействию процессов. Атомарность рандеву означает, что оба процесса одновременно вовлекаются в обмен сообщениями, который является одним непрерывным действием. Механизмы рандеву поддерживаются такими языками, как Occam, Lotos, Ada. В модели CSP механизм взаимодействия поддерживается командой ввода
<input command>:=<source>?<target variable>
и командой вывода
<output command>:=<destination>!<expression>,
где target variable — входная (принимаемая) переменная, a expression — выходное (передаваемое) выражение.
При асинхронном взаимодействии возврат из процедуры обмена осуществляется сразу же после передачи сообщения без ожидания завершения приема. Такой обмен можно охарактеризовать как неблокирующий. В случае асинхронно/синхронного обмена операция передачи сообщения является асинхронной (процесс-отправитель не блокируется), а операция приема — синхронной (процесс-получатель блокируется).
В литературе [9] иногда блокирующий обмен называют обменом с синхронизацией, а неблокирующий обмен — асинхронным. Используя понятия «синхронный», «асинхронный», мы будем придерживаться несколько иной точки зрения. Дело в том, что для организации асинхронного обмена необходимо наличие так называемых буферов, которые упорядочивают сообщения в соответствии с некоторой дисциплиной (как правило, FIFO (first in first out), т. e. «первым вошел — первым вышел»). Например, при асинхронной передаче сообщения оно может копироваться в буфер процесса-отправителя, который продолжает работу одновременно с пересылкой сообщения процессу-получателю. Буферизованный обмен сообщениями произвольных размеров поддерживается в ОС UNIX и Windows NT. В системе UNIX процессы взаимодействуют через каналы — специальный вид буфера, не сохраняющего границы сообщений. В ОС NT, помимо каналов, механизмы взаимодействия реализуются почтовыми ящиками, сокетами, RPC и общими файлами [46]. Буферные прием/передача специфицируются также средствами системы программирования MPL Механизм рандеву не требует никакой буферизации [106]. В дальнейшем под синхронным и асинхронным взаимодействием процессов мы будем понимать соответственно безбуферный или буферизованный обмен сообщениями.
Назначение среды взаимодействия — обеспечение парных и коллективных обменов сообщениями между процессами, которые могут объединяться в группы. Когда говорят о парном взаимодействии процессов, иногда используют понятие канала — своего рода, виртуальной однонаправленной коммуникационной линии, связывающей процессы. Каналы можно создавать и удалять. При отправке сообщения достаточно указать идентификатор канала без указания имени принимающего процесса. В соответствии с механизмами взаимодействия процессов различают синхронные, асинхронные и асинхронно/синхронные каналы. Так, при асинхронном обмене сообщение посылается в канал, связывающий передающий и принимающий процессы, причем работа передающего процесса не блокируется.
В некоторых моделях с каналами ассоциируются очереди (потоки) сообщений. Подобный механизм, в частности, описывает взаимодействие процессов в модели Г. Кана [113] и взаимодействие акторов (процессов) в потоковых моделях (dataflow), например, в модели Дж. Денниса [90], посредством пересылки токенов (атомарных значений данных). Пример описания канала (channel) и процесса (Process) в модели Кана:
Integer channel X, Y, Z, Tl, T2;
Process f (integer in U, V; integer out W);
Здесь X, Y, Z, T1, T2 — каналы для передачи целочисленных переменных между взаимодействующими процессами (тип переменных может быть произвольным — булевым, вещественным и т. д.). Процесс f связан с другими процессами двумя входными каналами, по которым передаются целочисленные переменные U, V, и одним выходным каналом для передачи целочисленной переменной W.
В модели Кана рассматриваются бесконечные потоки сообщений, а в таком разрешимом случае акторных моделей, как SDF (Synchronous Data Flow), емкость буфера FIFO ограничивается. При этом говорят о реализуемости модели SDF с ограниченным размером памяти токенов [122].
На рис. 1.8 показан простейший информационный граф модели SDF: вершины обозначают акторы, дуги — информационные связи,
Рис. 1.8. Пример информационного графа SDF-моделиРис. 1.8. Пример информационного графа SDF-модели
Рис. 1.8. Пример информационного графа SDF-модели
Рис. 1.8. Пример информационного графа SDF-модели
маркировка начал и концов дуг соответствует числу потребляемых и производимых токенов при однократном «срабатывании» соответ
ствующего актора.
Так, актор ai однократно производит 10 токенов, актор а^ однократно потребляет один токен. Размер выходного буфера ai должен быть не менее 10 токенов, а входного буфера ai — не менее одного токена. Возникает следующий вопрос: можно ли так организовать итеративное выполнение процессов в модели, заданной SDF-графом, чтобы размеры буферов были ограничены и априори заданы?
Для разрешимых случаев, подобных тому, который показан на рис. 1.8, на этот вопрос можно ответить утвердительно. Чтобы определить необходимый размер памяти токенов и соответственно число «срабатываний» каждого актора, решают так называемое уравнение баланса Гг = о, где Г — топологическая матрица, г — вектор-столбец
числа повторений выполнения каждого из акторов, а о — вектор- столбец, элементы которого равны нулю. Элемент (j, г) топологической матрицы (j — номер строки, г — номер столбца) равен целому положительному числу О^, если г-й актор производит О^ токенов, передаваемых по j-й дуге. Элемент (j, г) равен целому отрицательному числу — Л, если г-й актор потребляет Ц токенов по входящей j-й дуге. Так, для SDF-графа, показанного на рис. 1.8, топологическая матрица
110100101110100101и решение уравнения баланса имеют следующий вид:
1
10
100
101
1
10
100
101
■ 10 -100 о ]
г _010-1оо,
1 ™001-100, г -&
0001-10
где к — произвольный целочисленный коэффициент, не меньший 1.
Возможны и такие виды SDF-графов, когда нетривиального решения уравнения баланса с отличными от 0 элементами вектора г не существует (соответствующие примеры рассматриваются в § 2.3). Под разрешимостью модели SDF понимается возможность получения ответа на вопрос, существует или нет нетривиальное решение уравнения баланса.
Чтобы локализовать взаимодействие параллельных процессов, используются группы процессов, каждой из которых предоставляется отдельная коммуникационная среда коммуникатор. Эти понятия относятся к числу основных в стандарте интерфейса передачи сообщений MPI [9, 26]. Группа — совокупность процессов, любой из которых имеет уникальный номер в соответствующем коммуникаторе. Процесс, одновременно входящий в разные коммуникаторы, характеризуется различными номерами. В MPI параллельные процессы порождаются лишь однажды (после инициализации параллельной части программы) с помощью функции MPI_Init. Число процессов в ходе выполнения программы не изменяется. После инициализации коммуникатор MPI_COMM_WORLD задает стандартную среду с номерами процессов от О до rz — 1 (п ™ число процессов в группе). Над группами определены такие теоретико-множественные операции, как пересечение, объединение и т. д.
MPI позволяет реализовать как блокирующий, так и неблокирующий обмен сообщениями. Заметим, что и в том, и в другом случаях осуществляется прием/передача сообщений через буферы. Функции передачи (Send) и приема (Recv) с блокировкой имеют следующий вид:
MPI_Send (buf,count,datatype,dest,tag,comm),
MPI_Recv (buf,count,datatype,source,tag,comm,status).
Здесь buf — начальный адрес буфера передающего/принимающего процесса; count — число элементов данных в посылаемом/принимае- мом сообщении; datatype — тип передаваемых/принимаемых данных; dest/source — номер принимающего/передающего процесса; tag — тег сообщения; comm — идентификатор коммуникатора; status — параметры принятого сообщения.
При организации среды взаимодействия процессов необходимо учитывать опасность возникновения тупиковых ситуаций (дедлоков), заключающихся во взаимной блокировке обменивающихся сообщениями процессов. Простейшее проявление дедлока состоит в том, что один процесс не может передать сообщение другому процессу, поскольку этот другой процесс ждет, когда первый процесс примет сообщение от него. Например, тупик может возникнуть при использовании блокирующих функций MPI_Send и MPI_Recv [9]. Для предотвращения подобной ситуации можно воспользоваться соответствующими неблокирующими функциями
MPI_Isend (buf,count,datatype,dest,tag,comm,request),
MPI_Irecv (buf,count,datatype,source,tag,comm,request), где request — идентификатор неблокирующей (асинхронной) операции передачи/приема.
При передаче/приеме с помощью функций MPI_Isend/ MPI_IRecv возврат из функций происходит сразу после начала процесса передачи/приема, без ожидания пересылки/получения всего сообщения буфера buf. Окончание процессов передачи/приема, когда можно повторно воспользоваться соответствующим буфером, например, записать в него новое сообщение, определяется параметром request и специальными функциями MPI_Wait, MPI_Test.
Избежать возможного тупика позволяет также функция совмещенных передачи и приема сообщений
MPI_Sendrecv (sbuf,scount,stype,dest,stag,rbuf,rcount, rtype,source,rtag,comm,status),
где sbuf — начальный адрес буфера передающего процесса; scount — число передаваемых элементов сообщения; stype — тип передаваемых данных; dest — номер принимающего процесса; stag — тег посылаемого сообщения; rbuf — начальный адрес буфера принимающего процесса; rcount — число принимаемых элементов сообщения; rtype — тип принимаемых данных; source — номер передающего процесса; rtag — тег принимаемого сообщения; comm — идентификатор коммуникатора; status — параметры принятого сообщения.
Эта функция совмещает в одном запросе и посылку, и прием сообщения, что гарантирует предотвращение тупиковых ситуаций.
Существуют и сильные, и слабые стороны в синхронном и асинхронном обменах сообщениями. Так, CSP и CCS адекватно представляют недетерминизм, необходимый в приложениях, связанных с разделением ресурсов: модели баз данных типа «клиент-сервер», мультизадачные системы, интерливинг в использовании аппаратных средств и т. д. Однако попытки использования CSP и CCS для описания распределенных систем со «слабосвязанными» процессорами, а также для моделирования детерминированных приложений вызывают серьезные трудности. Здесь необходимы модели, основанные либо на асинхронной передаче сообщений, либо на разделении переменных общей памяти. Модель Кана допускает асинхронный обмен сообщениями между процессами, однако является сугубо детерминированной моделью вычислений с преобладанием потоков данных.
Понятие среды и, в частности, канала используется главным образом для описания событий, называемых взаимодействиями совместно протекающих процессов. Заметим, что механизм взаимодействия объектов приложения на основе неструктурированных, не упорядоченных особым образом событий поддерживается такими средами, как DCOM, CORBA и JavaBeans. Вычисления в этих средах базируются на вызовах метода, не требующих какого-либо упорядочения. Поскольку при этом нет необходимости во встроенных механизмах синхронизации,
программист может реализовать асинхронные взаимодействия объектов без всякого риска возникновения дедлока. Попытки же синхронизации, например, для упорядочения передачи данных, принуждают программиста заботиться о предотвращении тупиков и обеспечении однозначности вычислительного процесса.
В ОС UNIX тупики исключаются путем специальной организации взаимодействия процессов и буферизации сообщений в каналах (pipes), откуда байты считываются в порядке записи. Сообщения можно считывать порциями произвольных размеров.
Еще один способ взаимодействия, основанный на объявлении событий, получил название «издавай и подписывайся» (publish and subscribe). Какой-либо компонент приложения декларирует заинтересованность в наступлении некоторых событий («подписывается»), другой обуславливает наступление событий («издает»). Примером одного из наиболее сложных воплощений этого принципа в системе параллельного программирования Linda [70] может служить среда JavaSpaces компании Sun Microsystems, надстраиваемая над распределенной компонентной технологией Jini. Более простая версия может быть реализована на основе прикладного программного интерфейса службы событий в среде CORBA. Механизм «издавай и подписывайся» хорошо подходит для описания распределенных недетерминированных взаимодействий: «издателю» не нужно знать, кто «подписчики», состав которых может изменяться во времени.
Основные достоинства модели обмена сообщениями заключаются в следующем. Во-первых, снимаются проблемы разделяемой памяти, связанные с согласованным состоянием данных. Во-вторых, уделяется внимание обмену данными, который требует существенных затрат времени даже при использовании высокоскоростных сетей. В-третьих, учитываются такие аспекты, как произвольная структура (длина) сообщений и, возможно, различные последовательности (недетерминизм) формирования составных частей сообщений, что характерно для распределенных систем с коммутацией пакетов.
Последний тезис находит отражение и в стандарте MPI. В нем предусматривается возможность формирования сообщений из разнотипных данных с помощью специального механизма — введения производных типов данных. Далее, функции сборки MPI_Gatherv и раздачи MPI_Scatterv данных позволяют процессам коммуникатора обмениваться порциями данных различных размеров. Наконец, при передаче нескольких сообщений разными процессами таким образом, что эти сообщения соответствуют одной и той же функции MPI_Recv, последовательность их получения принимающим процессом заранее не определена.
Модель общей памяти. Разделение общей памяти для организации взаимодействия процессов предполагает, что один процесс размещает данные в известную область памяти, а другой может их
считывать. Сложность реализации такого взаимодействия обуславливается необходимостью обеспечения безопасности записи (удаления) и считывания данных.
Два основных подхода к решению этой проблемы — взаимное исключение критических интервалов и координация (условная синхронизация) процессов. В критическом интервале лишь один процесс имеет исключительный доступ к общей переменной. Для установки критических интервалов используются операции синхронизации, реализуемые, например, с помощью семафоров, блокирования процессов или битов «занято/свободно», присоединяемых к разделяемым словам общей памяти.
Так, в стандарте ОрепМР критический интервал программы оформляется с помощью специальных директив:
!$0МР CRITICAL [имя интервала]
код программы
!$0МР END CRITICAL [имя интервала]
Известно, что программа, разработанная с помощью ОрепМР, делится на последовательные и параллельные области. Параллельные области выполняются набором нитей, которые могут работать с общими и локальными переменными, обозначаемыми соответственно как SHARED и PRIVATE. В критическом интервале лишь одна нить может исполнять код программы. Все остальные нити ждут, пока эта нить не выполнит директиву END CRITICAL и не выйдет из критического интервала. Существует также директива, гарантирующая неделимый доступ к памяти и корректную работу с общей переменной, следующей за оператором ATOMIC.
Координация действий процессов может быть осуществлена с помощью барьерной синхронизации, поддерживаемой, в частности, стандартом ОрепМР. Барьер определяет такое состояние программы, при достижении которого каждый процесс задерживается до тех пор, пока все остальные процессы не достигнут барьера. В ОрепМР для этого существует директива
!$0МР BARRIER
Координация нитей, т. е. упорядочение исполнения параллельных областей программы, может быть реализована следующим образом:
!$0МР ORDERED
код программы
!$0МР END ORDERED
При этом ни одна из нитей не может начать выполнение кода программы, если не завершены предшествующие ему последовательные области программы.
Выбор той или иной системы синхронизации зависит от особенностей решаемой задачи. Известно, что переусложнение и избыточность затрат при реализации синхронизации процессов ведут к потере эффективности вычислений. Поэтому внимание исследователей уже давно привлекают принципы асинхронного программирования на основе событийного, потокового и динамического управления процессами [64]. Известны также примеры аппаратной поддержки синхронизации, в частности барьеров в компьютерах Cray T3D/3E [9]. Стандарт ОрепМР, предоставляющий богатый выбор средств синхронизации, исходит из того, что синхронизация в каждой конкретной задаче должна быть минимально необходимой.
Модель общей памяти чаще всего используется в SMP- и DSM-архитектурах. Ее достоинства обусловлены следующими факторами. Во- первых, имеется единое адресное пространство, что упрощает программирование и отладку. Во-вторых, нет необходимости явного задания операций посылки и приема сообщений, когда необходимо обеспечивать своевременную смену данных в буферах. В третьих, программы, разработанные для SMP-систем, могут быть перенесены на DSM-системы.
Главная проблема, как уже отмечалось — поддержание непротиворечивого, согласованного состояния памяти в соответствии с принимаемой моделью. Кратко, на качественном уровне, рассмотрим некоторые способы обеспечения согласованности памяти, имеющие прежде всего практическое значение. Подробнее с различными моделями согласованности можно ознакомиться в работах [46, 67, 68, 135]. Будем использовать следующую символику [135]. Обозначим через Ж(ж) и операцию записи в переменную х некоторого значения и, а через R^ и — операцию чтения из переменной у значения и. Историю выполнения операций записи и чтения будем представлять диаграммами следующего вида:
Р1: W(x) 1 Ж(ж) 2
р2: Л(ж)2
Смещение операции записи Ж(ж) 2, выполняемой процессом pi, вправо относительно Ж(ж) 1, а операции чтения R(x) 2, которую осуществляет процесс р2, вправо относительно Ж(ж) 2 вдоль горизонтальной линии означает, что Ж(ж) 1 предшествует Ж(ж) 2, а последняя в свою очередь предшествует R(x) 2. Отсутствие смещения операций вдоль горизонтальной линии говорит о том, что они выполняются параллельно либо одна из них начинается, когда другая еще может быть не закончена.
Строгая согласованность предписывает: операция чтения должна возвращать значение переменной, соответствующее последней по времени операции записи. Выше приведен пример строгой согласованности: операция чтения R(x) 2 возвращает значение 2, присвоенное переменной х последней из операций записи, а именно Ж(ж) 2.
Пример нарушения этого правила:
pi: Ж(ж) 1 Ж(ж) 2
р2:Я(ж)1
В однопроцессорных системах или системах с одним модулем памяти, обслуживающим запросы в порядке поступления, соблюдение этого принципа вполне естественно. Что же касается распределенных систем, то здесь все осложняется отсутствием «единого времени», которое позволило бы полностью упорядочить действия процессоров, но неминуемо привело бы к снижению производительности. Поэтому необходимы модели с более слабыми требованиями к согласованности.
В модели последовательной согласованности (Л. Лэмпорт, 1979 г. [121]) все процессы наблюдают одну и ту же последовательность обращений к памяти. Практически это означает, что процессор, выполняющий запись, ожидает от других процессоров подтверждения модификации или объявления модифицируемых копий данных несостоятельными. Это обеспечивает единый порядок записей, видимый всеми процессами. Тем не менее последовательная согласованность не гарантирует, что операция чтения возвратит значение, записанное чуть раньше другим процессом. Ниже приводится история обращения к памяти в соответствии с моделью последовательной согласованности:
Р1: Ж(ж) 1 Ж(ж) 2
р^:Д(ж) 2 R^ 1
Рз :R^ 2 R^ 1
Процессы р2 и рз считывают одни и те же значения, причем процесс р2 считывает значение, которое еще не записано. Технически это, конечно, невозможно, однако не противоречит модели последовательной согласованности и демонстрирует ее гибкость по отношению к строгой согласованности.
Пример нарушения правила последовательной непротиворечивости данных:
Р1: Ж(ж) 1
р2:Ж(ж) 2
Рз :R(x) 1 Д(ж) 2
Р4:й(ж)2Я(ж)1
Последовательно согласованная память не позволит процессу рз получить значения 1, 2, если процесс р4 считал значения 2, 1.
Модель причинной согласованности характеризуется тем, что последовательность потенциально причинно-зависимых операций записи должна наблюдаться всеми процессами одинаково, другие же, например, параллельно выполняемые операции записи, могут наблюдаться в разных последовательностях.
Понятие потенциальной причинной зависимости было введено в [120] и может трактоваться следующим образом. Положим, один процесс модифицирует значение некоторой переменной, затем другой процесс считывает его и модифицирует значение этой же или другой переменной. Тогда эти модификации переменных потенциально зависимы.
Пример допустимой последовательности операций в соответствии с моделью причинной согласованности:
Рх: Ж(ж) 1Ж(ж) 3
р2: Я(ж)1 Ж(ж)2
р3:R^XR(x)3 R(x)2
р4:R^x)!R^x)^ R(x) 3
Здесь операции записи Ж(ж) 1 и Ж(ж) 2 являются причинно-зависимыми, а Ж(ж) 2 и Ж(ж) 3 — нет. Процессы р3 и р4 наблюдают вторую пару операций записи в разных последовательностях.
Следующая модель согласованности применима в так называемой конвейеризованной памяти (PRAM — pipelined random access memory). Она характеризуется тем, что операции записи, выполняемые одним процессом, наблюдаются остальными процессами одинаково, в том порядке, в котором они производились, а операции записи, осуществляемые разными процессами, могут быть видны в разных последовательностях:
Рх: Ж(ж) 1
р2:ф)1Ж(х)2
Рз-R(x) 1 R(x) 2
р4:R(x) 2 R(x) 1
Здесь процессы р3 и р4 наблюдают записи со стороны процессов рх и р2 по-разному, хотя операции Ж(ж) 1 и Ж(ж) 2 являются потенциально причинно-зависимыми. Таким образом, PRAM-согласованность слабее причинной согласованности.
Согласованность кэш-памяти, или когерентность, устанавливает порядок, в котором процессы модифицируют одну и ту же переменную, а операции записи в разные переменные могут осуществляться и параллельно. Таким образом, когерентность — это последовательная согласованность локальной области памяти, и, следовательно, когерентность строго слабее модели последовательной согласованности. Пример соблюдения когерентности [135]:
Pi: Щж) 1 R^ 0
Р2 : Щу) 1 ЯЦ) 0
Обращения процессов рх и р^ к переменным х и у могут быть упорядочены соответствующим образом: Я(ж) 0, Ж(ж) 1 и R(y) 0, Ж(?/) 1.
Процессорная согласованность предполагает одновременное соблюдение правил PRAM-согласованности и когерентности. Таким образом, между процессами устанавливается «соглашение» о порядке наблюдения записей, выполняемых любым из них, однако этот порядок может не соблюдаться при осуществлении записей разными процессами. При этом процессы согласуют свои действия по отношению к одной и той же локальной области памяти. Таким образом, процессорная согласованность обладает большими ограничениями в сравнении с PRAM-моделью и когерентностью кэш-памяти.
Модель слабой согласованности основывается на введении операций или переменных синхронизации. Доступ к переменным синхронизации или выполнение операций синхронизации осуществляется в соответствии с моделью последовательной согласованности. Обращение к переменным синхронизации возможно лишь после завершения всех операций записи, а доступ к обычным переменным задерживается до окончания выполнения всех обращений к переменным синхронизации.
Свободная согласованность представляет собой развитие модели слабой согласованности и требует непротиворечивости данных между парой обращений к переменным синхронизации: acquire (вход в критический интервал), release (выход из критического интервала). В отличие от модели слабой согласованности, здесь операция синхронизации «расщепляется» на две — acquire, release. Операции захвата (acquire) и освобождения (release) переменной синхронизации должны удовлетворять требованиям последовательной или процессорной согласованности.
Существует несколько разновидностей этой модели, называемой иногда согласованностью по выходу. Упомянем лишь две из них. Одна — это энергичная модель (ERC — eager release consistency), когда модификации данных передаются при выполнении операции release независимо от того, когда они будут нужны. Другая — ленивая модель свободной согласованности (LRC — lazy release consistency), в рамках которой передача всех модифицированных данных откладывается до выполнения операции acquire.
Особенности реализаций моделей LRC, ERC можно охарактеризовать так [28]. Частичная упорядоченность операций синхронизации (все процессорные узлы должны наблюдать одинаковую последовательность обращения к переменным acquire, release) осуществляется путем введения локальной метки логического времени в каждом узле и общего вектора меток времени. Локальная метка времени последовательно увеличивается при выполнении очередной операции синхронизации, а вектор меток поддерживает временные зависимости между узлами системы. Модификация блока данных сопровождается отметкой записи. Перед первой модификацией блока данных создается его копия. После выполнения операции release состояние данных сопоставляется с копией и вычисляется так называемая разность — адреса и новые значения данных. Узел, просматривая список отметок записи,
определяет, какая разность ему необходима для получения достоверной копии данных. Недостатком программной реализации моделей LRC и ERC в системах с передачей сообщений является необходимость в трудоемких процедурах определения разности.
Еще одна модель, основанная на использовании критических интервалов, называется согласованностью по входу. В этой модели каждая разделяемая переменная связывается с переменной синхронизации. В отличие от свободной согласованности эта модель допускает параллельный доступ к различным критическим интервалам. При этом захват переменной синхронизации может быть монопольным, когда какой-либо процесс модифицирует данные, и немонопольным, когда данные только считываются. Это также является источником потенциального параллелизма процессов.
Разумеется, в этом кратком обзоре мы не охватили всех известных моделей согласованности памяти. Нужно лишь отметить следующее. С одной стороны, чем слабее требования к согласованности данных, тем больше возможностей для повышения производительности системы, а с другой стороны — усложняются модели программирования. Некоторые системы программирования поддерживают согласованность сложно организованной иерархической памяти. Так, в стандарте ОрепМР предусмотрен оператор FLUSH. Значения переменных тех нитей, которые исполняют этот оператор, сохраняются в основной памяти, а модификации данных видны всем нитям. Оформляется это с помощью директивы
!$0МР FLUSH [список сохраняемых переменных]
В списке перечисляются переменные, требующие согласованного представления в памяти.
Нужно заметить, что в целом надстройка моделей общей памяти над аппаратными средствами передачи сообщений приводит к дополнительной нагрузке на коммуникационную сеть. Это связано с созданием копий данных в удаленных узлах, передачей модификаций и миграцией данных. Альтернативой, преодолевающей этот недостаток, может быть аппаратная реализация механизмов доступа к удаленной памяти, или RDMA.
Прямой доступ к удаленной памяти. Это промежуточная форма между моделями передачи сообщений и общей памяти. По сути RD МА отражает главную особенность функционирования RM-систем — распространение записей в разделяемые страницы [28]. В каждом процессорном узле наблюдаются все модификации страниц, отображаемых узлом в единое адресное пространство. С помощью вектора отметок синхронизации определяются необходимые преобразования конкретной разделяемой страницы при доступе к ней какого-либо узла. Спецификация InfiniBand предусматривает операции передачи и приема сообщений, а также доступ к удаленной памяти по записи и чтению.
Парадигмы программирования. По П. Хансену [102], парадигма параллельного программирования, — это реализация того или иного типа параллелизма, характерного для некоторого класса алгоритмов. Тип параллелизма отражает структуру приложения и/или структуру данных. В первом случае имеет место функциональный параллелизм, или параллелизм по управлению, во втором — параллелизм по данным. Функциональный параллелизм означает одновременное выполнение различных задач, которые могут взаимодействовать друг с другом. В случае параллелизма по данным возможно совместное протекание процессов, соответствующих выполнению одного и того же программного кода, но с различными данными.
Как показывает практический опыт, в основе подавляющего числа параллельных программ лежит сравнительно немного различных парадигм программирования. Выбор той или иной из них зависит от доступных вычислительных ресурсов и типа параллелизма, присущего приложению. В частности, ряд задач линейной алгебры допускает преобразование информационной структуры алгоритмов для эффективной реализации на параллельной системе [9]. Существуют подходы к программированию распределенных приложений, никак не учитывающие их потенциального параллелизма, например, весьма распространенная объектная модель «клиент-сервер», основанная на механизме RPC и используемая в средах DCOM и CORBA. Разумеется, подобные модели необходимо отличать от парадигм параллельного программирования. Рассмотрим наиболее часто используемые из них.
В основе концепции распределения задачи (task-farming) лежат два понятия — основной и зависимый процессы (другое название парадигмы — master/slave). Основной процесс (master) осуществляет
результат
Рис. 1.9. Распределение задачи декомпозицию решаемой задачи и распределяет подзадачи по зависимым процессам (slaves). Кроме этого, он собирает промежуточные результаты и формирует окончательный результат вычислений (рис. 1.9). Как правило, зависимые процессы взаимодействуют лишь с основным. Распределение подзадач по процессорам может быть как статическим, т. е. выполняться до начала вычислений, так и динамическим.
Динамическая реализация парадигмы master/slave уместна тогда, когда количество подзадач превышает число процессоров либо когда количество подзадач заранее не известно и сложно прогнозировать время их выполнения. Динамическое распределение полезно и тогда, когда необходимо сбалансировать загрузку процессоров, оптимизировать ее и учесть возможную реконфигурацию вычислительных ресурсов. Это особенно важно в кластерах в случае выхода из строя некоторых процессорных узлов.
Парадигма распределения позволяет реализовывать масштабируемые вычисления, однако «узким местом» при большом числе процессоров является централизованное управление со стороны основного процесса. Возможный путь решения этой проблемы — создание совокупности основных процессов, каждый из которых управляет своим подмножеством зависимых процессов.
Наиболее часто используемая парадигма — «одна программа-множественные данные» (single-program multiple-data, или SPMD). В рамках SPMD каждый процесс соответствует выполнению одного и того же кода с различными данными, т. е. данные распределяются по доступным процессорам и воплощается параллелизм по данным (рис. 1.10).
Распределение данных
ВычисленияВычисления ^^ Вычисления
и обмен ^^ и обмен ^^ и обмен
Сборка результатов
Рис. 1.10. Общая структура вычислений на основе парадигмы SPMD
Каждый из процессоров системы взаимодействует с процессорами- соседями, причем нагрузка на коммуникационную среду пропорциональна размеру промежуточных результатов вычислений. Вычислительная нагрузка на процессор зависит от размера отрабатываемого блока данных. Между различными процессорами периодически осуществляется синхронизация, причем взаимодействия процессов обычно хорошо структурированы и заранее предсказуемы. Парадигма SPMD может быть очень эффективной, если данные легко распределяются между процессами и вычислительная система является однородной, т. е. процессорные узлы идентичны.
В неоднородных системах необходима специальная схема балансировки загрузки процессоров, позволяющая перераспределять данные в ходе вычислений. SPMD весьма чувствительна к уровню готовности системы: достаточно выхода из строя одного процессора, чтобы возникла тупиковая ситуация, когда ни один из процессов не может продолжаться без общей синхронизации.
Парадигма конвейеризации данных основана на принципе функциональной декомпозиции: подзадачи алгоритма, которые могут выполняться одновременно, закрепляются за соответствующими про-
Рис. 1.11. Конвейер данных
цессорами, каждый из которых реализует небольшую часть (фазу) вычислений (рис. 1.11).
Процессы образуют конвейер, причем каждый из них соответствует определенной стадии обработки и выполнению частной подзадачи. Модель взаимодействия процессов может быть достаточно простой, поскольку данные передаются лишь между соседними фазами вычислений. По этой причине этот тип параллелизма определяют также как параллелизм потоков данных (data flow parallelism). Взаимодействие процессов может быть синхронным и полностью асинхронным. Эффективность рассматриваемой парадигмы зависит от возможности сбалансировать загрузку процессоров на различных стадиях конвейера. Устойчивость к возможным изменениям конфигурации (деградации) системы обеспечивается независимыми путями обмена данных в обход отдельных стадий обработки.
Парадигма «разделяй и властвуй» хорошо известна из области последовательных алгоритмов: сложная задача подразделяется на ряд подзадач, каждая из которых решается независимо, а результаты решения частных задач используются для формирования окончательного результата. Эффективность параллельной реализации этого принципа высока, если отдельные подзадачи могут быть решены приблизительно за одинаковое время. Подзадачи независимы, поэтому нет необходимости в организации взаимодействия соответствующих процессов.
Три основных типа операций, реализующих парадигму «разделяй и властвуй», — это разбиение, вычисление и слияние. Выполнение приложения представляется в виде виртуального дерева, когда отдельные процессы создают подзадачи и комбинируют частные результаты для получения промежуточного результата (рис. 1.12).
Таким образом, парадигма master/slave (см. рис. 1.9) является частной формой принципа «разделяй и властвуй», в которой операции разбиения и слияния реализуются лишь основным процессом, а другие, зависимые процессы выполняют только вычисления. В рассматриваемой парадигме (см. рис. 1.12) задачи могут генерироваться в ходе выполнения программы и добавляться в единую очередь заданий либо распределяться по различным очередям вычислительной системы.
Спекулятивный параллелизм представляет собой такую парадигму, когда делаются некоторые допущения, способствующие распараллеливанию программы. В частности, допускается опережающее выполнение (look-ahead execution) связанных действий при оптимистическом пред™
Рис. 1.12. Виртуальное дерево «разделяй и властвуй»
положении, что параллельное выполнение таких действий не нарушает целостности процесса вычислений. Когда же случается противное, необходимо вернуться в некоторое допустимое состояние приложения, в котором этого нарушения не происходит.
Другое воплощение этой парадигмы — применение различных алгоритмов для решения одной и той же задачи. Выбирается тот из них, который первым обеспечивает окончательный результат. Такой подход полезен тогда, когда довольно трудно реализовать распараллеливание на основе рассмотренных выше парадигм. В частности, это может быть обусловлено сложными зависимостями по данным, препятствующими параллельному выполнению вычислений.
Разумеется, границы между различными парадигмами программирования могут быть весьма условными, размытыми, а для реализации сложных параллельных приложений могут потребоваться комбинации отдельных парадигм или их элементов. В такой ситуации целесообразна одновременная реализация обоих типов параллелизма (функционального и по данным), в том числе и в различных компонентах одной и той же парадигмы. В общем же парадигмы программирования отличаются двумя основными признаками: способами декомпозиции задачи и распараллеливания (распределения данных и вычислений). Например, функциональная декомпозиция и распределение конвейеризируемых данных осуществляются статически. В парадигме master/slave задача декомпозируется в статике, но распределение данных осуществляется динамически. Принцип «разделяй и властвуй» предполагает динамические декомпозицию и распределение данных и процессов.
Модели программирования. Когда речь идет о достоинствах той или иной модели обмена данными, имеется в виду возможность адекватного представления особенностей функционирования масштабируемых систем с целью эффективной реализации вычислений. Обеспечение удобства разработки и отладки программ — это задача, решаемая с помощью моделей (систем) программирования.
С этой точки зрения модель программирования, базирующаяся на концепции общей памяти, более предпочтительна для SMP- и DSM- систем, нежели модель программирования с передачей сообщений. Однако еще раз заметим, что мы разделяем назначения моделей вычислений и программирования. Важно, чтобы модель выполнения программы не противоречила модели программирования, а последняя могла быть надстроена над моделью вычислений.
В качестве модели программирования может непосредственно использоваться и модель выполнения программы. Так, при ориентации на модель обмена сообщениями программист явно представляет взаимодействие процессов, например, с помощью библиотек MPI или PVM. Близкой моделью программирования является модель «процесс-канал»: процессы, число которых может изменяться в ходе выполнения программы, обмениваются данными через однонаправленные каналы, соединяющие только два процесса. При работе в модели общей памяти программирование осуществляется в терминах нитей. При этом нет необходимости представлять программу в виде совокупности процессов, взаимодействующих с помощью обмена сообщениями. Как правило, модель программирования воплощает тот или иной тип параллелизма — функциональный (по управлению) или/и по данным, а также позволяет разработать программу в соответствии с принимаемой парадигмой.
Концепция виртуальной разделяемой памяти лежит в основе системы программирования Linda [70]. Соответствующий стиль разработки программ основывается на понятиях коммуникационной модели и виртуальной ассоциативной памяти, называемой пространством кортежей. Память разделяется процессами программы посредством операций in, out, read, eval. Поскольку при этом процессы явно не взаимодействуют друг с другом, то с помощью системы Linda можно эффективно разрабатывать программы в соответствии с парадигмой master/slave.
Распараллеливающие компиляторы и параллельные языки позволяют реализовать так называемый скрытый параллелизм программы. В отличие от него явный параллелизм используется программистом для декомпозиции задачи, распределения подзадач по процессорам и организации их взаимодействия. Применимость распараллеливающих компиляторов, как правило, ограничивается приложениями с так называемым регулярным параллелизмом, например на уровне циклов.
Существуют распараллеливающие компиляторы, которые возможно использовать в архитектурах с общей, но не распределенной памятью, например Т-система [1] (Институт программных систем РАН). Заметим, что средства для динамического управления ресурсами и процессами имеются и в PVM. В DSM-архитектурах нужно распределять не только вычисления, но и данные. Эффективность использования векторизующих и распараллеливающих компиляторов подтверждена в системах с нераспределенной памятью. Трудности их применения
в DSM-системах обусловлены неоднородностью времени доступа к памяти в удаленных узлах.
Параллелизм по данным, например, SPMD, не предусматривает явной передачи сообщений или синхронизации. Программист распределяет данные последовательной программы по процессорам, выполняющим параллельную программу, причем каждый процессор работает с собственными данными. Известная реализация этой идеи — проект HPF (High Performance Fortran). Однако модель программирования с параллелизмом по данным не имеет прямой связи с моделью выполнения программы, что затрудняет отладку.
В рамках модели программирования с параллелизмом по управлению языки расширяются специальными конструкциями, позволяющими описать параллельное выполнение процедур. Попытки реализации этого подхода предпринимались в проекте ХЗН5, не получившем широкого распространения. Стандарт ОрепМР развивает многие идеи проекта ХЗН5 и позволяет создавать одну версию программы, которая может выполняться и как последовательная, и как параллельная в зависимости от аппаратной платформы. DVM-подход [25, 33] (Институт прикладной математики им. М. В. Келдыша РАН) сочетает в себе черты моделей программирования с параллелизмом по данным и управлению, позволяет согласованно распределять по процессорам данные и вычисления. При этом параллельная DVM-программа может отлаживаться как последовательная.
Идея параллельного объектно-ориентированного программирования призвана обеспечить разработку хорошо структурированных приложений за счет применения подходящих абстракций и методов. Как и в традиционной объектной модели, объекты представляют собой абстрактные типы (пассивные контейнеры) данных, состояние которых определяется интерфейсом. Если эту модель обогатить набором разделяемых объектов, то она будет хорошо соответствовать концепции программирования над общей памятью. Известны реализации параллельных объектно-ориентированных сред на основе языка С Н—h [Ю4].
Следующий подход, являющийся альтернативой программированию на уровне обмена сообщениями, заключается в использовании таких высокоуровневых абстракций, как скелетоны. Скелетон (skeleton) строится на соответствующей парадигме программирования и включает в себя примитивы управления и взаимодействия, образуя целостную абстракцию. Он скрывает от пользователя специфические детали реализации приложения и позволяет описать вычисления на уровне интерфейса, выполненного согласно выбранной парадигме. Этот стиль программирования можно рассматривать как модель более высокого уровня по отношению к моделям на основе обмена сообщениями, виртуальной разделяемой памяти и объектно-ориентированного подхода. Скелетон параметризуется заданием степени детализации, структуры и распределения данных. Таким образом, программист может сосредоточиться на сути вычислительной задачи, а не на механизмах управле-
ния и координации параллельных процессов. Такой подход используется, например, в проекте PUL [104] (Эдинбургский центр параллельных вычислений). Здесь пакет параллельных утилит поверх интерфейса MPI поддерживает наиболее часто используемые парадигмы программирования.
В заключение нужно заметить, что чем выше уровень модели программирования, тем сильнее скрыты некоторые детали, необходимые для анализа эффективности выполнения программ. В частности, это недетерминизм, присущий распределенным вычислениям, проявления которого зависят от принятой модели обмена данными.
. Управление ресурсамив распределенных средах
Системы и службы управления доступом к ресурсам. Необходимость в особых механизмах управления ресурсами в локально и глобально распределенных средах хорошо осознана. К ресурсам относится все, что так или иначе участвует в обработке данных: вычислительные установки, файловые системы, коммуникации, программное обеспечение, хранилища данных.
Локально распределенными средами с определенной условностью мы назовем «замкнутые» конфигурации: мультикомпьютеры, кластеры, симметричные мультипроцессоры, системы с распределенной памятью и массово-параллельные системы. Глобальная среда метакомпьютинга в настоящее время напрямую ассоциируется с Grid- технологиями [22]. Нынешняя интерпретация концепции Grid [93] подразумевает не только высокопроизводительные вычисления на суперкомпьютерах, но и использование в качестве процессорных ресурсов рабочих станций, а также обычных персональных компьютеров.
Нужно сразу же заметить, что обеспечение доступа к ресурсам в глобальной среде Grid и «замкнутых» конфигурациях имеет существенные различия. Это обусловлено прежде всего автономностью сайтов — основных структурных и административных единиц Grid. Следствием является отсутствие единой политики обслуживания и планирования вычислительных работ.
Сначала рассмотрим особенности управления работами в локально распределенных средах. Эти функции выполняют системы управления ресурсами. В англоязычной литературе им соответствует такие термины, как JMS (job management system), RMS (resource management system или resource management and scheduling), CMS (cluster management software) и т. п. Использование для управления ресурсами штатных средств операционных систем, например, в локальной сети, требует отыскания свободных компьютеров, пересылки исполняемых файлов, файлов данных и т. д. Даже при небольшом числе пользователей адми-
нистративное управление этими процессами становится практически невозможным.
Назначение систем управления ресурсами — распределение программных приложений по процессорным узлам или компьютерам. Цели, которые при этом могут преследоваться, — это увеличение реальной производительности, балансировка нагрузки процессоров и т. д. В программном обеспечении соответствующих систем, как правило, можно выделить два компонента — менеджер ресурсов и планировщик [104, 144]. Менеджер отвечает за распределение вычислительных ресурсов,
Процессорные узлы
Рис. 1.13. Типичная структура системы управления ресурсами
их аутентификацию, создание и миграцию процессов. Планировщик определяет очередность выполнения работ и их назначение на те или иные ресурсы (рис. 1.13).
В основе многих систем управления ресурсами лежит архитектура «клиент-сервер». Пользователь взаимодействует с системой через клиентскую программу — пользовательский интерфейс, который может быть, например, Web-браузером или системой X-Windows. На узлах (серверах), где выполняются работы, устанавливаются исполнительные демоны, которые поддерживают обновляемые таблицы данных о том окружении, в котором функционирует система управления ресурсами. Чаще всего реализуется не интерактивный доступ к ресурсам, а режим пакетной обработки (batch job). Мы здесь используем термин «работа» (job), хотя в литературе также применяется и понятие задания. В этом случае говорят об обработке пакетного задания. Далее в этой главе и гл. 6 и 7 задание считается частью более крупной единицы, под которой понимается работа. Чтобы запустить работу, пользователь через клиентскую часть должен представить информацию о местоположении входных и выходных данных, требуемой конфигурации аппаратной платформы, максимальном времени прогона программы и т. д.
Кратко рассмотрим основные функции систем управления ресурсами:
поддержание очередей и планирование работ;
балансировку нагрузки;
миграцию работ;
механизм контрольных точек.
В основе управления ресурсами лежит механизм очередей и планирования работ, или диспетчеризации. Два наиболее часто реализуемых принципа организации очередей: «первым пришел — первым обслужен» (FCFS — first come first serve) и «наименее трудоемкая работа выполняется первой» (LWF — least work first). В LWF трудоемкость может быть выражена через произведение необходимого числа процессорных узлов и оценки времени выполнения работы. Очереди конфигурируются с помощью специальных атрибутов. Например, в планировщике Maui, информация о котором доступна по адресу http://www.mhpcc.edu/maui, каждая из работ снабжается атрибутами geom и dur. Первый описывает требуемую конфигурацию ресурсов: запись geom=2,4 означает, что для выполнения работы требуется два узла, в одном из которых задействуется два, а в другом четыре процессора. Атрибут dur соответствует длительности выполнения работы. В соответствии со значениями атрибутов алгоритм планирования определяет очередность работ и выделяет для них ресурсы. Так, из очереди первой может выбираться работа, для которой достаточно процессоров и свободного интервала времени, не занятого выполнением других работ, причем начало очереди при этом не блокируется.
Системы управления ресурсами, как правило, поддерживают совокупность очередей. Работы могут распределяться по очередям в зависимости от величины ресурсного запроса на основе специальных требований к ресурсам, если необходим, в частности, доступ к высокопроизводительным графическим станциям и т. д. Ресурсный запрос оформляется в виде скрипта команды ввода работы qsub. В целом же диспетчеризация в режиме пакетной обработки позволяет эффективнее использовать вычислительные ресурсы: персональные компьютеры или рабочие станции какой-либо организации, обычно простаивающие по ночам или выходным дням, могут в это время загружаться трудоемкими, многочасовыми работами.
Балансировка нагрузки необходима для полного и эффективного использования ресурсов. Понятно, что вычислительный процесс организован плохо, если одна часть узлов перегружена, в то время как другая простаивает. Здесь опять-таки важен механизм планирования — работы выполняются вовсе не обязательно в порядке поступления (FCFS). Работа, оформляющая свои потребности в ресурсах в виде соответствующей опции команды qsub, будет запущена на узле, который подходит по конфигурации и предполагаемому времени вычислений.
Сбалансировать нагрузку позволяет и функция миграции работ. Она определяет возможность прерывания, перемещения в другие узлы и повторного запуска работы. Миграция может быть вызвана перегрузкой одних узлов и простоем других. Эта функция в системах управления ресурсами чаще всего поддерживается с помощью очередей. Так, утилита администратора qmqr позволяет создавать очереди и устанав-
ливать их атрибуты. Например, доступ к очереди может быть разрешен работам, принадлежащим к определенным группам или введенным с конкретных рабочих мест, могут быть определены ограничения на размер очереди и число запускаемых из нее работ. Система очередей часто является сложно организованной. Одни очереди (исполнительные) непосредственно связаны с процессорными узлами, другие (маршрутизирующие) в качестве пунктов назначения опять-таки имеют очереди. Соответствующее конфигурирование очередей позволяет реализовать гибкую политику миграции работ.
В конечном итоге назначение систем управления ресурсами — обеспечить надежное, контролируемое выполнение программы пользователя, которая в случае сбоя то ли самой системы, то ли исполнительного узла могла бы быть вновь запущена из некоторого промежуточного состояния. Для этого существует механизм контрольных точек. Это своего рода фотография текущего состояния работы, позволяющая осуществить ее повторный запуск. Некоторые операционные системы также поддерживают создание контрольных точек, а перезапуск осуществляется из последней из них. Еще один вариант — сохранение промежуточных результатов программы. Механизм контрольных точек применяется и при миграции работ. Если работа прерывается, то она возвращается в очередь и может быть перезапущена, в том числе и на другом узле, из соответствующей контрольной точки.
К настоящему времени известно большое число коммерческих и свободно распространяемых систем управления ресурсами. Приведем краткие сведения лишь о части из них и укажем сайты, на которых можно получить дополнительную информацию [104, 112]:
CODINE (Computing in Distributed Networked Environments), http://www.genias.de;
DQS (Distributed Queueing System), http://www.scri.fsu.edu/;
LL (Load Leveler), http://www.austin.ibm.com/;
LSF (Load Sharing Facility), http://www.platform.com/;
NQE (Net Queueing Env), http://www.cray.com/;
PBS (Portable Batch System), http://science.nas.gov /;
Condor, http://www.cs.wisc.edu/.
CODINE — коммерчески доступная система, обеспечивающая управление ресурсами в неоднородных распределенных средах. DQS является свободно распространяемой системой пакетной обработки для неоднородных сред. Основной механизм диспетчеризации — исполнительные очереди, причем один узел может быть связан с несколькими очередями. Маршрутизирующих очередей нет. Таким образом, приоритеты работ задаются в явном виде через атрибуты очереди. Поскольку с одним узлом может быть связано несколько очередей, то узел способен обрабатывать несколько потоков работ с различными приоритетами. Коммерческая система LL поддерживает распределение ресурсов для выполнения последовательных и параллельных работ в
кластерах рабочих станций (COW — clusters of workstations), а также может применяться в суперкомпьютерах IBM SP. LSF — коммерческий продукт общего назначения, при этом основной акцент делается на балансировку нагрузки и периодический постепенный захват ресурсов (cycle-stealing). Эта система используется в кластерах рабочих станций и суперкомпьютерах для управления как последовательными, так и параллельными работами. Коммерческая система NQE рассчитана на использование в суперкомпьютерах, в частности в Cray ТЗЕ. Однако она может применяться для организации пакетной обработки и в кластерах рабочих станций. Система PBS существует в двух версиях (свободно распространяемой и коммерческой) и ориентирована на высокопроизводительные приложения. В PBS реализован комбинированный механизм диспетчеризации: в отличие от системы DQS поддерживаются маршрутизирующие, а также исполнительные очереди к узлам. Распределение работ по исполнительным узлам выполняется планировщиком, который не обязательно располагается на узле- сервере. Порядок выполнения работ в PBS определяется как маршрутизацией на сервере, так и планировщиком. Последний может сортировать работы по длительности, требуемому объему памяти, приоритетам. Вся совокупность работ просматривается с учетом либо без учета очередей, очереди могут сортироваться по приоритетам, наконец, работа может выполняться в строгом соответствии с дисциплиной FCFS. Конфигурирование системы PBS осуществляется с помощью административной утилиты qmqr, которая определяет ограничения по ресурсам в целом и для отдельных очередей. Одной из первых систем управления ресурсами, которая поддерживает не только UNIX- платформы, но и Windows NT, является система Condor. Она свободно распространяется. Отличительной ее особенностью является развитый механизм миграции работ. Condor («охотник за свободными узлами») ориентирован на выполнение продолжительных, многочасовых работ: через некоторое время текущая работа может прерываться и мигрировать на другой узел, где продолжается или завершается ее выполнение.
Глобальная вычислительная среда Grid формируется из автономных распределенных узлов, конфигурация ресурсов динамически изменяется, узлы свободно отключаются и подключаются. Все это требует принципиально новых моделей вычислений и управления ресурсами [21, 22, 61]. Главная задача, решаемая Grid-технологиями, — это обеспечение доступа к глобально распределенным ресурсам с помощью специального инструментария, а именно набора служб [61]. Модель «клиент-сервер» уже перестает быть адекватной такого рода средам, поскольку свой набор служб устанавливается на каждом из ресурсов. При этом должен быть обеспечен стандартный протокол доступа к ним, а службы различных ресурсов должны быть согласованными. Осуществить это позволяет архитектура OGSA (Open Grid Services Architecture). Она вводит унифицированную семантику предоставления
служб, общие правила создания, именования и поиска экземпляров Grid-служб, связывание различных протоколов доступа к ресурсам. Фактически стандартом разработки Grid-систем стал свободно распространяемый инструментарий Globus Toolkit на базе архитектуры OGSA (http://www.globus.org/ogsa).
Сложность управления глобально распределенными ресурсами заключается в том, что запуск, выполнение работы и доступ к необходимым данным могут производиться в совершенно различных местах. Системы управления ресурсами в «замкнутых» конфигурациях опираются на единую политику администрирования. Grid — динамически самоорганизующаяся система, в которой, естественно, не может быть единого администратора, а сайты автономны. Владельцы ресурсов лишь на время отдают их в общее пользование. Кроме этого, локальные системы управления ресурсами не стандартизованы. Как быть в такой ситуации?
Инструментарий Globus включает ряд служб, которые позволяют справиться с этой проблемой. Это, в частности, служба распределения и управления ресурсами (GRAM — Grid Resource Allocation and Management), информационная служба сбора метаданных (GIS — Grid Information Service) и служба инфраструктуры безопасности (GSI — Grid Security Infrastructure). Служба GIS позволяет получить данные о состоянии распределенных ресурсов и базируется на использовании протокола LDAP (Lightweight Directory Access Protocol). Служба GSI представляет собой по сути общий интерфейс для локальных систем безопасности автономных сайтов. Она поддерживает однократную проверку пользователя в течение одного сеанса, делегирование ему полномочий и отображение прав доступа на локальные системы.
Примерная схема доступа к ресурсам в глобальной среде такова. Пользователь в команде запуска работы специфицирует требования к ресурсам с помощью специального языка RSL (Resource Specification Language). За поиск ресурсов, адекватных требованиям, отвечает служба брокеров, которые преобразовывают требования на языке RSL в более детальную спецификацию. Для поиска ресурсов необходима метаинформация, поставляемая службой MDS (Metacomputing Directory Service). В MDS данные представляют различные типы распределенных ресурсов, формализуемые в протоколе LDAP понятиями объекта и атрибутов. Возвращаемая информация содержит адреса сайтов, которые обладают необходимыми ресурсами. Нижний уровень управления в архитектуре глобальной среды представляет GRAM. Он обрабатывает спецификации RSL, отвергает или запускает запросы от пользовательских утилит Globus, наконец вводит работу на локальном узле в пакетном режиме с помощью команды qsub. По полученным с помощью брокеров адресам пользовательскими утилитами, в частности, globus-job-submit, можно осуществить удаленный запуск работы. Из опций утилиты job™submit формируется паспорт работы, который пересылается в GRAM. Такой его компонент, как Gatekeeper, осуществ-
ляет аутентификацию и авторизацию пользователя. Менеджер л окаль- ной системы управления ресурсами ставит работу в одну из очередей.
Разумеется, ключевым звеном в этой схеме является распределение ресурсов в глобальной среде. Здесь необходимо поддерживать такие службы планирования, которые бы собирали запросы пользователей, организовывали очереди и определяли порядок выполнения работ. Это функции своего рода метадиспетчера, один из проектов которого [21] предложен в Институте прикладной математики им. М.В. Келдыша РАН. Метадиспетчер является промежуточным звеном в цепи «удаленный запуск работы-выделение ресурса» и представляет собой надстройку над стандартными компонентами Globus. Таким образом, метадиспетчер — это интерфейс с менеджерами ресурсов для совокупности отдельных сайтов. Понятно, что для создания таких средств необходимы новые принципы планирования вычислительных работ и распределения ресурсов. Об этом подробнее мы поговорим чуть позже.
Классификация задач и типы алгоритмов планирования. Укрупненная классификация задач планирования распределенных вычислений может быть представлена графом, показанным на рис. 1.14. Этот граф является несколько измененным вариантом
Задачи
статическогодинамического
планированияпланирования
Оптимальное Субоптимальное
перечислительные теорииматематическоготеории
графовпрограммированияочередей
Рис. 1.14. Классификация задач планирования распределенных вычислений
иерархии задач, предложенной в [84]. В нашем случае рассматриваются задачи планирования распределенных взаимодействующих, но не автономно протекающих процессов. Классификация, приведенная на рис. 1.14, является, однако, слишком общей.
Она конкретизируется введением соответствующих типов алгоритмов планирования, которые рассматриваются ниже в этом параграфе. Конкретный алгоритм, реализуемый планировщиком, в распределенных системах выполняет функцию управления ресурсами. Когда речь идет о планировании вычислений, т. е. об определении порядка выполнения процессов и работ, то нужно иметь в виду, что эта задача предполагает и назначение — распределение доступных ресурсов между процессами и работами. Планирование и назначение — два аспекта одной проблемы управления ресурсами.
Статическое планирование процессов осуществляется до начала выполнения программы. Таким образом, порядок следования процессов уже известен к моменту компоновки объектных модулей в загрузочные, исполняемые модули. Динамический план формируется в ходе прогона программы. В случае, когда вся необходимая информация о состоянии вычислительной системы и потребностях процессов в ресурсах известна, можно говорить об оптимальном планировании, используя соответствующий критерий оптимальности. Например, о минимизации времени выполнения программы при заданном ограничении на число процессоров, о максимизации загрузки процессоров на определенном интервале времени. В случае, когда получение оптимального решения из-за проблем вычислительного характера невозможно, ищут близкое к нему приемлемое, субоптимальное решение. Здесь возможно построение приближенных и эвристических планов. Эвристики предполагают наличие некоторого априорного знания о характеристиках процессов и ресурсов [92]. Как правило, эвристики базируются на использовании наблюдаемых параметров, косвенно влияющих на эффективность планирования. Так, степень связности процессов по данным и распределение процессов по узлам влияет на загруженность коммуникационной среды. Однако не всегда и не только эти факторы непосредственно определяют реальную производительность вычислительной системы.
И оптимальные, и субоптимальные приближенные решения могут отыскиваться с помощью следующих методов:
перечислительные, переборные методы [47];
теоретико-графовые методы [58];
методы математического программирования, например, метод ветвей и границ [47] или метод динамического программирования [50];
методы теории очередей [19, 118].
Рассмотрим некоторые типы алгоритмов планирования, отчасти опираясь на классификацию, предложенную в [84], и работы в этой области, опубликованные в последние годы [2, 100, 111, 119, 151, 160162].
Адаптивные алгоритмы [84] позволяют динамично изменять политику распределения ресурсов в зависимости от текущего состояния вычислительной системы и ее реакции на предшествующие этому состоянию действия планировщика. В основу некоторых адаптивных планировщиков закладывается стохастическая модель обучаемого ав-
томата. Неадаптивные алгоритмы не изменяют своих действий в зависимости от истории поведения распределенной системы.
Алгоритмы балансировки нагрузки [2, 84, 119] позволяют оптимизировать использование вычислительных ресурсов в однородных и неоднородных средах. Особенно важны эти алгоритмы при программировании в соответствии с парадигмами SPMD и master/slave. Основная идея алгоритмов этого типа состоит в равномерной загрузке всех процессорных узлов, когда каждый из них выполняет свою часть программы примерно за одинаковое время. Пример такого рода задачи — распределение данных по узлам вычислительной системы с целью минимизации времени выполнения цикла в рамках парадигмы SPMD [2]. Другой пример — максимизация эффективности использования процессоров неоднородной распределенной вычислительной среды.
Рассмотрим последнюю задачу подробнее для алгоритма трассировки лучей, реализуемого в соответствии с парадигмой master/slave [143]. Основная функция программ-трассировщиков лучей заключается в определении цвета пикселей монитора в двухмерном изображении, чтобы можно было реалистично представлять различного рода трехмерные сцены. Эта задача допускает высокий уровень распараллеливания, поскольку вычисление цветов пикселей, принадлежащих разным блокам, на которые разбивается изображение, может выполняться независимо на разных процессорах. По этому принципу осуществляется обработка с помощью известной программы POV, когда
Master
Рис. 1.15. К алгоритму трассировки лучей основной процесс (master) распределяет одинаковые прямоугольные блоки пикселей по зависимым процессам (slaves), выполняющимся на разных процессорах (рис. 1.15, а).
Как только зависимый процесс заканчивает работу над очередным блоком пикселей, он пересылает результаты основному процессу. Здесь возможны два типа планирования: статическое, когда все блоки пикселей распределяются по процессорам до начала вычислений (рис. 1.15, б), и динамическое, в ходе решения задачи (рис. 1.15, в). В последнем случае зависимые процессы изначально загружаются одним
блоком, другие блоки пикселей пересылаются им по мере окончания обработки предыдущих блоков.
Балансировка нагрузки при решении такого рода задач в распределенных средах должна учитывать два аспекта: разные объемы вычислений для различных блоков и неоднородность ресурсов, в частности неодинаковую производительность процессоров. Такой критерий, как эффективность использования процессоров, может быть введен следующим образом. Пусть г-й зависимый процесс реализует свой объем Wi вычислений за время 7ф Время выполнения программы трассировки лучей равно
Tf = тах{ТД , г = 1, . . . , F,
».=1 52 ДДС)».=1 52 ДДС)рргде Р — число процессоров. Время Т^, включает в себя чистое время ТСг, затрачиваемое на вычисления, а также некоторое время на обмен данными с основным процессом. Время ТСг определяется объемом вычислений wi и производительностью Pi(t^ процессора, зависящей от состояния (степени загруженности) системы в момент времени F • ТСг = = Wi/pi(ti.y Эффективность использования процессоров формально определяется так:
».=1 52 ДДС)
».=1 52 ДДС)
р
р
RE =
Тогда задача балансировки нагрузки состоит в максимизации значения RE на отрезке времени Тf при заданном числе Р процессоров. Для статического планирования необходимы методы определения объема работ w^ для каждого из процессоров, а также методы оценки его производительности Pi(t^. Недостатки алгоритмов статического типа — чувствительность к различиям в производительности процессоров в неоднородных системах и точности оценок гщ, Pi^fi). Динамическая балансировка позволяет преодолеть эти недостатки, однако может приводить к дополнительным затратам времени на обмен данными между основным и зависимыми процессами.
Наибольший эффект от применения алгоритмов балансировки нагрузки достигается в однородных системах. Если процессорные узлы периодически обмениваются информацией о степени загруженности, то возможно реализовать не только статическую, но и динамическую балансировку нагрузки [119].
Механизм торгов, или нредлоснсения цены (bidding) [150], основан на том, что узлы обмениваются информацией о том, какие из них и чем загружены, а какие могли бы выполнить работы. Эта информация, естественно, доступна планировщику. Все это очень напоминает механизм, реализуемый в системе Condor, выступающей в роли брокера между пулом свободных процессоров и пользователями, запускающими свои программы. Кроме сведений об имеющихся ресурсах, узлы сообщают, при каких условиях они будут выполнять работы, посту™
пающие от планировщика Condor, и каков предпочтительный вид этих работ. Со стороны пользователя также выставляются требования к «товару», например, характеристики процессоров, объем памяти и т. и. В системе Condor для сбора и размещения этих сведений используется специальная объектная технология ClassAds.
В процессе торгов каждый процессорный узел выступает в двух качествах — «менеджера» и «подрядчика». «Менеджер» предлагает работу, а «подрядчик» предоставляет доступный ресурс. Ключевым положением в механизме торгов является то, что все узлы сохраняют автономию в том смысле, что «менеджер» обладает полной свободой выбора, какому узлу предложить работу среди тех процессорных узлов, которые выставляют за нее определенную цену. С другой стороны, автономию сохраняют и «подрядчики», берущиеся за работу лишь на своих условиях.
Вероятностные алгоритмы довольно давно известны из теории расписаний [24]. Основная посылка к их применению заключается в том, что во многих задачах число перестановок некоторого процесса по оси времени и число возможных его назначений на процессоры столь велики, что аналитическое решение невозможно получить за приемлемое время. Вместо этого используется вероятностный (в соответствии с заданным распределением) выбор процесса из числа доступных к назначению. Итеративное применение этого приема случайным образом порождает некоторое множество расписаний. Затем из них по определенному критерию отбирается лучший. При этом выделяются параметры, наиболее существенно влияющие на качество расписания. Эти параметры также случайным образом варьируются, чтобы с некоторой вероятностью «хорошее» решение попало в множество порождаемых расписаний. В некоторых моделях используются априорные вероятности получения «хороших» расписаний для выполнения очередного этапа планирования.
В алгоритмах однократного назначения выбранный план и назначение работ не изменяются в течение всего времени обработки в пакетном режиме. Эти алгоритмы базируются на требованиях, содержащихся в ресурсном запросе пользователя, а их эффективность зависит от того, насколько сведения пользователя адекватны реальному времени выполнения работы, характеристикам процессорных узлов и т. д.
Алгоритмы динамического назначения пытаются улучшить принятые решения, используя промежуточную информацию о ходе выполнения отдельных, более мелких составляющих ранее назначенных работ. Таким образом, эти алгоритмы можно назвать также и адаптивными. Следствием их применения может быть миграция процессов с одних узлов на другие.
В настоящее время для планирования вычислений в масштабируемых системах активно используются такие алгоритмы, как миграция процессов и работ, совместное, связанное планирование (gangscheduling) и так называемый бэкфилинг (backfilling), или заполнение
[111, 160^162]. О механизме миграции, который может использоваться для балансировки нагрузки, речь шла выше. В связанном планировании процессы, относящиеся к одному приложению или одной работе, распределяются по процессорным узлам совместно. Иными словами, они выполняются параллельно или разделяют во времени одно и то же подмножество процессоров, в отличие от пространственно распределенного планирования. Нужно сказать, что этот тип планирования поддерживается не только системами управления ресурсами, но и некоторыми операционными системами, в частности HP-UX. Пожалуй, связанное планирование является одним из наиболее распространенных приемов в распределении ресурсов. Однако оно имеет ограниченную масштабируемость, а его эффективность в большой мере зависит от уровня готовности системы. Это объясняется необходимостью явной синхронизации между процессами, принадлежащими одной группе (gang). Другой недостаток этого подхода — возможное замедление выполнения отдельных процессов группы, каждый из которых получает в свое распоряжение лишь часть необходимых ресурсов, например процессорного времени или пространства памяти.
Рассмотрим подробнее алгоритм бэкфилинга, реализуемый многими планировщиками, в том числе и уже упоминавшимся планировщиком Maui [111]. Планировщик Maui поддерживает пакетный режим обработки и широко используется на таких платформах, как SP, Origin 2000, LINUX™кластеры. Коротко идею бэкфилинга можно описать так: для запуска может быть выбрана и не первоочередная работа, если она не блокирует (не задерживает) выполнение работы в начале очереди и при этом имеется достаточно свободных ресурсов.
Поясним процесс бэкфилинга в планировщике Maui (рис. 1.16). На рис. 1.16, а показана ситуация до выполнения бэкфилинга: параллельно выполняется три работы, j0, jl и j2, использующие процессорные узлы п0, п2 и пЗ. Каждый из узлов содержит по четыре слота: рО, ..., рЗ — основные конструктивные единицы, число которых совпадает с числом процессоров узла. Работа j0 выполняется на всех четырех слотах узла пО, работа j 1 использует слот рЗ узла пЗ, а работа j2 загружает все слоты узла п2 и слоты рО и pl узла пЗ.
На рис. 1.16, а представлено также состояние очереди: в ней ожидают запуска работы q0, ql, q2, ... , qi, ... с атрибутами, значения которых определяют потребности в процессорных ресурсах и время выполнения. Так, для выполнения работы q0 необходимы два узла, содержащие по четыре слота (geom=4,4), и интервал dur=12 единиц времени. Чтобы выполнить работу q2, достаточно одного узла (geom=4), а работа qi требует полной загрузки трех узлов (geom=4,4,4). Процедура бэкфилинга, выбирая работы из очереди, пытается либо тут же назначить их на свободные ресурсы, либо зарезервировать для них ресурсы.
Результат бэкфилинга показан на рис. 1.16, б. Выполнено резервирование г0 для работы q0 на узлах nO, nl. Работа q0 начнет выполняться с момента времени tl8 после завершения работы j0. При этом,
Очередь работqO geom=4,4 dur = 12 ql geom =2,2 dur = 10 q2 geom = 4 dur = 5Очередь работqO geom=4,4 dur = 12 ql geom =2,2 dur = 10 q2 geom = 4 dur = 5qi geom=4,4,4 dur=13qi geom=4,4,4 dur=13
Очередь работ
qO geom=4,4 dur = 12 ql geom =2,2 dur = 10 q2 geom = 4 dur = 5
Очередь работ
qO geom=4,4 dur = 12 ql geom =2,2 dur = 10 q2 geom = 4 dur = 5
qi geom=4,4,4 dur=13
qi geom=4,4,4 dur=13
Рис. 1.16. Процедура бэкфилинга
несмотря на резервирование, работа qO остается в очереди до завершения работы j0. Резервируются необходимые процессоры и для работы ql, которая начнется после окончания выполнения работы jl в момент времени t7. При этом опять-таки ql пока остается в очереди. А вот работа q2 может быть сразу же назначена на узел nl в момент времени t0, поскольку в течение необходимого для выполнения q2 интервала
времени dur=5 узел nl свободен. Запрос q2 запускается как работа j3 и удаляется из очереди. Таким образом, в результате бэкфилинга, несмотря на то, что работа qO находится в начале очереди, она начнется позже работ q2 и ql, когда станут доступны необходимые для нее восемь слотов. Ресурсов же для завершения к этому времени работ q2 и ql вполне достаточно. В этом смысле эти работы не блокируют начало очереди qO.
Планирование вычислений в среде Grid. Выше мы рассмотрели некоторые из типов планирования вычислений в «за™ мкнутых» конфигурациях, т. е. по этим принципам могут строить™ ся локальные программы-планировщики в кластерах, SMP- и DSM- архитектурах, компьютерных сетях, мультикомпьютерах и т. д. Что же касается планирования в глобально распределенной вычислительной среде Grid, то здесь, очевидно, все намного сложнее. А трудности объясняются глобальной распределенностью мест запуска приложения, хранения программы, данных и расположения вычислительных ресурсов. В этом параграфе мы коснемся лишь некоторых общих идей планирования вычислений в Grid. Можно выделить два основных подхода к планированию вычислений в глобальной среде. Один из них заключается в создании интерфейса между службами Grid и локальными планировщиками, своего рода внешнего планировщика или метадиспетчера работ [21, 22, 142]. Другой подход основан на использовании брокеров — агентов уровня приложений, занимающихся поиском свободных ре-
Пользователи
Рис. 1.17. Взаимодействие компонентов глобальной среды
сурсов [75, 76, 83, 93, 143]. К этому направлению можно отнести ряд проектов: AppLeS [75, 76, 83], Condor-G, Nimrod-G, DRM [93].
Рассмотрим принципы глобального планирования на основе модели, предложенной в [142], которая, как нам кажется, охватывает ряд существенных особенностей вычислений в среде Grid (рис. 1.17). В этой
модели внешний планировщик выполняет роль промежуточного звена между пользователями и множеством систем управления ресурсами на распределенных сайтах.
Внешний планировщик в соответствии с некоторым алгоритмом определяет сайт, куда направляется поток работ пользователя. Выбор сайта зависит от многих факторов: степени загруженности работами, наличия требуемых для вычислений данных и т. д. Эта информация может предоставляться локальными системами пакетной обработки. Для этого в них предусмотрена команда получения данных о текущем состоянии qstat. Однако информация, выдаваемая командой qstat, все-таки ориентирована на локальное управление ресурсами, и, как правило, ее недостаточно для внешнего планирования. В преодолении этих трудностей может помочь механизм предварительного резервирования ресурсов [146], поддерживаемый такими системами, как LL, PBS и Maui. Правда, как показано в [146], предварительное резервирование всегда увеличивает время ожидания работ в очереди.
Сбор информации о состоянии локальных сайтов может опираться на информационную службу MDS системы Globus Toolkit. После того как для работы выбран сайт, локальный планировщик (см. рис. 1.17) ставит эту работу в очередь. Некоторые типы алгоритмов планирования, используемые в системах управления ресурсами, мы уже рассматривали в этом параграфе. Планировщик данных отвечает за доступ к данным на удаленных сайтах, перемещение и репликацию (тиражирование) данных. Репликация и перемещение данных в сочетании с внешним планированием является весьма действенным механизмом для управления работами в среде Grid [142]. В рассматриваемой модели (см. рис. 1.17) возможны различные сценарии взаимодействия пользователей, внешних планировщиков, локальных систем управления ресурсами и планировщиков данных. При этом эффективность планирования может оцениваться по совокупности критериев: использованию ресурсов, времени ответа на запросы пользователя и др.
Вкратце на примере проекта AppLeS [75, 76, 83, 143] рассмотрим идею планирования на уровне приложений. Основная идея подхода состоит в том, что агенты-планировщики подбирают набор ресурсов для эффективного выполнения конкретного программного приложения. При этом у пользователя поддерживается иллюзия использования глобально распределенных вычислительных ресурсов исключительно в интересах его программы. Различные пользователи, естественно, пытаются оптимизировать свои приложения, разделяющие общие ресурсы, по совершенно различным критериям. Основная концепция проекта AppLeS — реализация заказного планировщика с учетом особенностей программного приложения. Эти особенности включают парадигму программирования, структуру данных, требования к памяти, модели обмена данными и т. д. Примерная структура агента-планировщика показана на рис. 1.18.
Рис. 1.18. Структура агента-планировщика
Данные о распределенных ресурсах среды, особенностях приложения, пользовательских критериях производительности, моделях для оценки производительности и распределения ресурсов образуют так называемый информационный пул. Сбор информации о среде и прогнозирование загруженности ресурсов обеспечивается службой Network Weather Service. Четыре основные подсистемы агента, управляемые агентом-координатором, выполняют функции: отбора той или иной комбинации ресурсов; планирования в соответствии с заданным пользователем критерием; взаимодействия с локальной системой управления ресурсами. Агент-координатор на основе оценки производительности отбирает лучший с точки зрения пользователя план и передает его через подсистему-исполнитель локальному планировщику в систему управления ресурсами.
Нужно подчеркнуть, что оба рассмотренных подхода предполагают планирование приложений на основе динамично меняющейся информации о глобальной среде и позволяют реализовать различные сценарии управления ресурсами. Все это заставляет говорить не просто об алгоритме, а о стратегии планирования и распределения ресурсов, т. е. о комбинации различных методов внешнего и локального планирования, размещения данных и т. д. В гл. 7 описывается один из возможных подходов к порождению стратегий вычислений по совокупности критериев, например стоимости и коэффициентам загрузки (использованию) ресурсов.
В заключение заметим, что масштабируемые ресурсы и программное приложение можно рассматривать как своего рода единую среду, позволяющую оптимизировать динамические характеристики вычислительных процессов для создания эффективных распределенных программ.
§ 1.4. Комментарий и краткий обзор к главе 1
Масштабируемые вычислительные системы. Подробное изложение особенностей современных архитектур, включая массово-параллельные системы, симметричные мультипроцессоры, кластеры и системы с распределенной памятью, дается в книгах [8, 26, 35, 46]. Там же рассматриваются вопросы параллельного программирования и организации параллельных вычислений. Высокопроизводительным вычислениям на кластерах посвящен двухтомник [104].
Обзоры [28, 103] охватывают архитектуры с распределенной разделяемой памятью. В частности, в [103] анализируются проблемы поддержки когерентности кэш-памяти в ccNUMA-архитектурах, а в [28] — аспекты аппаратной и программной реализации DSM-систем на основе соответствующих моделей согласованности разделяемой памяти.
Отдельные вопросы, связанные с повышением реальной производительности суперкомпьютеров, включая мультикомпьютеры, NUMA™ и ccNUMA-системы, рассмотрены в статье [13]. Сравнительный анализ трех типов параллельных архитектур (SMP, NUMA и кластеров), в том числе и по такому показателю, как масштабируемость, дается в обзоре [141]. Особенности архитектуры и программирования отечественных суперкомпьютеров семейств М-100 и М-1000 изложены в [26, 35].
Модели вычислений и модели программирования. Подробное и глубокое исследование различных аспектов параллельных вычислений и технологий параллельного программирования с позиций теории информационной структуры программ содержится в книге [9]. Систематический анализ различных моделей вычислений дается в серии работ [124-126]. Хотя публикации [125, 126] по большей части охватывают вопросы разработки моделей выполнения программ во встроенных системах, описываемые в них механизмы взаимодействия параллельных процессов широко применяются и в распределенных системах. В [124, 125] в числе прочих рассматриваются упоминаемые в § 1.2 модели CSP, CCS, Кана, Денниса, SDF и приводятся ссылки на соответствующие источники. В [124] предложен формализм для сравнения моделей вычислений: рассматриваются механизм рандеву в моделях CSP и CCS, асинхронный обмен сообщениями, сети Петри, потоковые модели Денниса, SDF, сети процессов Кана и др., исследуются проблемы детерминизма композиции процессов с частично упорядоченными событиями. Потоковые модели вычислений, а также их применение в параллельных системах, в частности, в архитектуре с множественными потоками управления (multithreaded architecture), анализируются в работе [137].
Последовательная согласованность разделяемой памяти обоснована в [121]. Модели ослабленной согласованности в распределенных системах, базирующиеся на идее работы [121], и вопросы их технической реализации описываются в [98, 105, 127]. В [95, 96] предлагается модель
так называемой локальной непротиворечивости, которая в противоположность моделям, основанным на модели последовательной согласованности, не предполагает глобальной когерентности данных. Состояние локальной области памяти представляется с помощью частично упорядочного мультимножества событий, соответствующих операциям записи и синхронизации. По сути эта модель может рассматриваться как развитие слабой или свободной согласованности и когерентности кэш-памяти. Вопросы программирования в различных моделях согласованности памяти исследуются в [67, 135].
В основе той или иной модели параллельного программирования лежит, как правило, соответствующая парадигма: master/slave, SPMD, «разделяй и властвуй» и т. д. (см. § 1.2). Понятие парадигмы программирования вводится П. Хансеном в [102]. Вопросам разработки моделей программирования посвящены работы [1, 3, 9, 25, 33] и второй том работы [104]. В частности, в [25, 33] излагается DVM-подход, который может рассматриваться как альтернатива явному использованию коммуникационных библиотек. Другой подход, избавляющий программиста от необходимости представлять программу в виде совокупности процессов, взаимодействующих посредством обмена сообщениями, — это автоматическое распараллеливание программ, реализуемое, например, Т-системой [1]. Применимость автоматического распараллеливания ограничивается главным образом системами с общей памятью (например, SMP), когда не нужно распределять данные. DVM-модель позволяет согласованно распределять не только вычисления, но и данные, и может использоваться для программирования мультикомпьютеров, кластеров и DSM-архитектур. Анализ направлений в программировании суперкомпьютеров различных архитектур можно найти в обзоре [7].
С тенденциями в области метакомпьютинга можно ознакомиться в обзорах [21, 22]. Почти весь первый номер журнала «Открытые системы» за 2003 г. посвящен проблемам разработки среды Grid. В статьях [77, 88] описываются некоторые модели программирования в масштабируемых, в том числе и в распределенных, вычислительных средах, включая Grid.
Управление ресурсами и планирование распределенных вычислений. Область применения систем управления ресурсами в режиме пакетной обработки — интенсивные, как правило, многочасовые вычисления. На сегодняшний день уже известны более двух десятков коммерческих и свободно распространяемых систем пакетной обработки. Сравнительный анализ некоторых из них можно найти в [112, 144], а также в третьей части первого тома работы [104]. Проблемам управления распределенными ресурсами Grid посвящены статьи [21, 22]. Открытая архитектура Grid-служб рассматривается в [61].
Классификация задач и алгоритмов планирования, приведенная в § 1.3, подобна иерархической и так называемой «плоской» системати-
зации, предложенной в [84]. В настоящее время приобретает все большую актуальность проблема балансировки нагрузки при выполнении параллельных вычислений в однородных и неоднородных системах. Известны различные постановки этой проблемы [2, 119, 143].
Среди систем программирования, поддерживающих конфигурирование вычислительных ресурсов, можно назвать трС [3]. В [2] решается задача оптимального распределения итераций параллельных циклов программ в соответствии с парадигмой SPMD. Показано, что подобные вычисления эффективнее всего выполняются в однородных системах.
Ограничения метода связанного планирования (gang-scheduling) исследуются в работе [160]. Там же предлагается новый метод динамического совместного планирования параллельных работ, в котором локальные планировщики SMP-кластера обмениваются информацией, позволяющей эффективнее организовывать вычисления. Явная синхронизация процессов в связанном планировании и разделение ресурсов во времени могут приводить к их неэффективному использованию.
В [162] предлагается применять различные стратегии планирования к различным классам совместно выполняющихся работ. Комбинирование алгоритмов бэкфилинга, связанного планирования и миграции в различных стратегиях описывается в [161]. Исследованию влияния требуемого объема памяти для работ, выполняющихся в сетях рабочих станций (NOW — network of workstations) и SMP-системах, посвящены статьи [100, 151]. (NOW часто относят к кластерам [104], а иногда к мультикомпьютерам [46].) Основные алгоритмы планировщика Maui, в том числе бэкфилинг, рассматриваются в [111].
О проблемах планирования вычислений и распределения ресурсов в глобальной среде Grid мы говорили в § 1.3 и вернемся к ним в гл. 7. Здесь же нужно отметить еще одно важное обстоятельство. В середине 90-х годов прошлого столетия было обнаружено, что в ряде случаев традиционные модели массового обслуживания [19, 118], использующие гауссовские, пуассоновские и другие распределения с быстро спадающими «хвостами», перестают быть адекватными реальным характеристикам производительности распределенных вычислительных систем и сетей [87]. В частности, не удается описать с помощью пуассоновских потоков трафик в широкомасштабных сетях [140]. Для этого необходимы иные распределения, с так называемыми «тяжелыми хвостами», спадающими, например, по степенному закону [87]. Поскольку в Grid управление потоками работ и их назначением на сайты имеет ключевое значение, очевидно, изучению влияния распределений с «тяжелыми хвостами» на вычисления в глобальной среде должно уделяться серьезное внимание.
Глава 2
СОБЫТИЙНЫЕ И ПОТОКОВЫЕМОДЕЛИ ОБМЕНА СООБЩЕНИЯМИ
. Процессы, события, сообщения
Таксономия систем взаимодействующих процессов. В начале данной главы конкретизируем общие требования к моделям распределенных вычислений в масштабируемых системах. Вычислительный процесс представляет собой некоторую последовательность действий (операций), связанную с выполнением программы или ее отдельных фрагментов (участков кода). Далее фрагмент программы будем называть оператором, понимая под ним в зависимости от уровня анализа команду, линейный участок кода, подпрограмму и т. д. При реализации распределенных программ, как правило, говорят о системе процессов, взаимодействующих посредством передачи сообщений либо разделения общей памяти.
Огромное разнообразие моделей параллельных вычислений не всегда гарантирует их адекватность множеству практических задач, с которыми приходится сталкиваться при разработке распределенных приложений. Причина заключается в противоречивости требований к этим моделям и важности представления тех или иных особенностей функционирования вычислительных систем.
Прямое следствие масштабирования архитектуры — это распределенность обработки и данных, в свою очередь определяющая недетерминированный характер вычислений. Например, различные истории выполнения распределенных программ на одних и тех же исходных данных могут быть вызваны ожиданием наступления внешних событий, арбитражем при доступе к разделяемым ресурсам, обменом сообщениями между процессами и т. д. Нас главным образом будут интересовать два аспекта, обусловленных распределенностью вычислений в масштабируемых системах.
Во-первых, недетерминизм^ означающий произвольные последовательности формирования компонентов структурированных данных. Главная проблема — как при этом обеспечить однозначность результата вычислений^ когда любому допустимому набору входных данных
соответствует один и только один набор выходных данных. Во-вторых, неоднородность^ т. е. произвольность структурированности данных, которыми обмениваются взаимодействующие процессы. Неоднородность сообщений означает, что процессы могут передавать и принимать данные порциями произвольных размеров. Основная проблема, которая при этом возникает, заключается в возможности блокировок вычислений^ когда процессы-потребители не могут быть инициированы, не имея достаточного количества требуемых данных от процессов- производителей.
В основу описания свойств и систематики моделей распределенных вычислений могут быть положены следующие таксономические признаки.
Характеристика семейства процессов^ а именно способ их порождения и ограничение на число прогрессов. Известны различные программные средства создания параллельных процессов, например, операторы fork, join; cobegin, coend и их модификации. Так, поддержка паралеллизма в стандарте ОрепМр основывается на операторах fork (разветвление) и join (объединение). Основная нить (мастер), с которой начинается выполнение программы, порождает параллельную область — совокупность нитей. При этом исполняется оператор fork. При выходе из параллельной области (исполнении оператора join) продолжает работать только нить-мастер. В свою очередь нити параллельных областей могут порождать разветвления и реализовывать объединения. Это приводит к вложенности параллельных областей. Управлять обработкой вложенных областей можно с помощью переменной OMP_NESTED и функции OMP_SET_NESTED.
Под способом порождения мы понимаем статическое или динамическое задание совокупности совместно протекающих процессов. Статический механизм при запуске параллельной программы создает фиксированное число процессов, не изменяемое при выполнении программы. Первая версия интерфейса MPI поддерживает только статическую модель параллельной программы с неизменяемым числом процессов. В некоторых парадигмах программирования, например, SPMD, процессы могут быть идентичными, т. е. они выполняют одну и ту же программу над разными данными и различаются лишь идентификаторами. Один и тот же код исполняют все порожденные нити параллельной области в рамках стандарта ОрепМР.
Реализация динамического механизма предполагает выполнение некоторых условий, в частности, наступление событий, при которых возможно создание и уничтожение процессов в ходе вычислений. Так, модель CSP [106] поддерживает динамическое порождение процессов без ограничения их числа. В противоположность ей потоковая модель SDF [122] представляет статическое задание ограниченного числа процессов. В языке Occam, воплощающем идеи CSP, число процессов ограничивается. В модели Кана [113] обеспечивается статическое порождение процессов с неограниченным уровнем рекурсивного параллелизма.
Вторая версия системы программирования MPI предусматривает возможность динамического создания процессов. Здесь реализуются специальные механизмы, устанавливающие соответствие между работающими и вновь порождаемыми процессами. В стандарте ОрепМР нити могут создаваться динамически при выполнении некоторого условия с помощью директивы
!$ОМР PARALLEL IF (условие)
Число нитей в параллельной области можно изменять с помощью функции OMP_SET_NUM_THREADS. При входе в параллельную область программы эта функция, изменяя значение переменной OMP_NUM_THREADS, задает число порождаемых нитей.
Поведение процессов. Это понятие включает несколько аспектов: детерминированный или недетерминированный характер процессов; способ описания поведения (например, выделяется ли состояние процесса, ограничивается ли мощность пространства состояний); степень детализации представления процесса (в частности, является ли он последовательным либо параллельным). Так, CSP описывает поведение последовательных недетерминированных процессов, причем недетер- минизм означает произвольное независимое чередование процессов. Модели SDF и Кана — совокупность последовательных детерминированных процессов.
С одной стороны, поддержка недетерминизма является ценным свойством моделей вычислений и систем программирования. Оно может использоваться, как уже говорилось, для адекватного представления особенностей работы распределенных систем, для написания программ, выполнение которых устойчиво по отношению к случайным внешним событиям, для отдельных этапов программирования, когда некоторые части программы представлены лишь спецификацией, и т. п.
С другой стороны, помимо проблемы однозначности результата недетерминизм влечет за собой ряд других побочных проявлений, влияющих на эффективность вычислений. Так, например, при программировании с помощью системы MPI некоторые процессы могут сколь угодно долго находиться в ожидании приема сообщения от передающего процесса, если существует какой-либо другой процесс, постоянно посылающий вызовы MPI_Recv тому же процессу-отправителю.
Организация, взаимодействия процессов. Прежде всего, — это принимаемая модель обмена данными: разделение общей памяти или передача сообщений. Далее, сюда включаются механизмы взаимодействия, в частности, способ посылки сообщений (синхронный, асинхронный), а также среда взаимодействия процессов: ограничения на емкость буфера, дисциплина упорядочения сообщений (например, FIFO), особенности доступа к каналу для передачи сообщений (проблема «писателей» и «читателей» [64]) и т. д.
Как уже отмечалось в § 1.2, синхронная (безбуферная) однонаправленная посылка сообщений обеспечивается в модели CSP, асинхронная
однонаправленная с ограничением на емкость буфера FIFO — в модели SDF. В той и другой модели реализуется доступ «один писатель — один читатель». В процессах Кана емкость буфера (длина очереди в канале) не ограничивается, а доступ к каналу для однонаправленной передачи асинхронных сообщений реализуется по принципу «много читателей — один писатель».
Развитые возможности не только для описания взаимодействий «точка-точка» (пар процессов), но и для организации коллективных взаимодействий всех процессов коммуникатора предоставляет интерфейс MPI. Правда, нужно заметить, что безблокировочные коллективные операции обмена первая версия MPI не поддерживает. Необходимо учитывать и то, что коллективные взаимодействия в общем случае недетерминированы в том смысле, что разными процессами коммуникатора коллективная операция завершается в произвольные моменты времени. Теги сообщений не используются.
Пример коллективного обмена — функция широковещательной рассылки сообщения от одного, корневого процесса source всем остальным процессам коммуникатора comm:
MPI_Bcast (buf, count, datatype, source, comm), где buf — начальный адрес буфера процесса-отправителя; count — число передаваемых элементов; datatype — тип данных.
Предусмотрена функция сборки данных от всех процессов коммуникатора comm в буфере с начальным адресом rbuf корневого процесса- получателя dest:
MPI_Gather (sbuf,scount,stype,rbuf,rcount,rtype,dest,comm).
Здесь sbuf — начальный адрес буфера передающего процесса; scount — число элементов данных в посылаемом сообщении; stype — тип данных в посылаемом сообщении; rcount — число элементов данных в принимаемом сообщении; rtype — тип данных в принимаемом сообщении. Корневой процесс собирает данные в буфере в порядке возрастания номеров процессов коммуникатора.
Функция передачи данных является по своему действию обратной функции MPI_Gather и имеет следующий вид:
MPI_Scatter (sbuf,scount,stype,rbuf, rcount,rtype,source,comm).
Корневой процесс source рассылает данные из буфера с начальным адресом sbuf всем процессам коммуникатора. Остальные параметры этой функции аналогичны параметрам функции MPI„Gather. Предполагается, что эти функции реализуют передачу и прием данных одинаковыми порциями.
С помощью функций MPI_Gatherv и MPI„Scatterv можно организовать обмен массивами произвольных размеров. Таким образом
поддерживается неоднородность сообщений, которыми обмениваются процессы.
В MPI существует еще целый ряд функций для коллективного взаимодействия процессов, в частности, редукционные операции, сборка данных с раздачей результата всем процессам, раздача/сборка данных для всех процессов коммуникатора. Во второй версии MPI коллективные операции расширяются. Например, появляется возможность взаимодействия процессов, входящих в разные коммуникаторы, внутри коммуникатора допускается совмещение входных и выходных буферов. Кроме того, вводится схема однонаправленной посылки сообщений по принципу Put/Get, когда активным является лишь процесс- отправитель. Эта схема весьма напоминает идею почтового ящика и применима, если известны процесс-получатель и область размещения передаваемых данных.
Достоинства обмена сообщениями уже обсуждались выше. В некотором смысле соответствующая модель является более «универсальной» по сравнению с моделью общей памяти, поскольку может быть надстроена над любой из рассматриваемых в гл. 1 архитектур. Известно также, что в ряде случаев затраты на систему синхронизации процессов снижают эффективность параллельных вычислений.
Асинхронные вычисления на основе событийного и потокового взаимодействия процессов, чему и посвящена настоящая глава, могут рассматриваться как альтернатива использованию систем синхронизации. Понимается это следующим образом. Наступление события подразумевает выполнение условий готовности как логических функций от некоторых других событий [64]. Условия готовности проверяются динамически и разрешают, но не предписывают выполнение соответствующих действий программы. Потоковое управление означает, что действие программы может выполняться, если готовы все необходимые для него операнды, т. е. условие готовности неявно подразумевается. Именно в этом смысле событийно-потоковое управление является альтернативой управлению процессами на основе явных средств синхронизации. Далее будет также показано, каким образом модель обмена сообщениями согласуется с реализацией общей распределенной памяти.
Учитывая рассмотренные выше таксономические признаки, можно сформулировать следующее общее описание свойств, которыми должны обладать модели распределенной обработки в масштабируемых системах: поддержка недетерминизма неограниченного числа динамически порождаемых процессов, взаимодействующих посредством асинхронной посылки сообщений.
Событийное описание взаимодействующих процессов. Пусть S — не обязательно конечное множество состояний процесса, а Т — множество тегов (меток). Состояние может трактоваться как выполнение некоторого оператора программы, а тег — как метка оператора. На множестве Т задан нестрогий порядок ^ (рефлексивное, тран-
зитивное и антисимметричное бинарное отношение). Будем считать множество тегов частично упорядоченным, что наиболее адекватно описанию распределенных систем с асинхронными процессами [120]. В системах с так называемым «единым временем» Т — упорядоченное множество, в котором каждый тег — метка времени. Событие определим как пару е = (4 s) ^ Т х 8, где t Е Т, s Е 8. С событием может ассоциироваться срабатывание помеченного оператора, формирование операндов и т. д.
Обозначим через ™Е квазипорядок на множестве Е событий. Это рефлексивное и транзитивное отношение, представляющее множество причинно-следственных связей (переходов) между событиями. Если е ez, то существует переход от события е Е Е к событию е' Е Е, или наступление события е влечет за собой наступление события е’. Процессом р будем называть частично упорядоченное множество (Е, ^). Два перехода е ez и ez е", где е, ez, е" Е Е, называются соиряснсен- ними. История h — это последовательность событий, соответствующих сопряженным переходам процесса р.
Здесь необходимо сделать небольшое отступление и дать соответствующие пояснения. Дело в том, что различные формы понятия «история» давно и широко используются в теории и практике программирования [9, 15, 31]. Если между действиями программы устанавливаются связи логические (по управлению), то говорят об операционной или операционно-логической истории [15]. Часто ее представляют графом, дуги которого соответствуют передаче управления между операторами, а вершины обозначают срабатывание операторов [9]. Тогда операционная истории программы — путь от начальной вершины к конечной. Иногда используют понятие протокола выполнения программы [31], связывая с меткой оператора или меткой соответствующей вершины стандартной (операторной) схемы состояние ее памяти, т. е. значения переменных. В операционных историях учитывается срабатывание и преобразователей (операторов присваивания), и распознавателей (альтернативных операторов). Когда принимаются во внимание лишь преобразователи, а также информационные связи между ними, то соответствующая модель называется историей реализации программы. Ее можно представить ориентированным бесконтурным графом, являющимся подграфом информационного графа программы [9]. Вершины обозначают срабатывание операторов-преобразователей, дуги — передачу информации. Нужно заметить, история реализации в общем случае, в отличие от операционной истории, не является единственным путем между некоторыми выделенными вершинами.
Когда мы говорим об истории процесса, то имеем в виду слово, т. е. последовательность символов, в алфавите Е событий. Природа связей между событиями может конкретизироваться в зависимости от решаемой задачи. В частности, если событие — это срабатывание того или иного оператора, то наступление этого события может быть вызвано передачей управления или информации. В графическом представлении
история процесса — ориентированный бесконтурный граф, вершины которого соответствуют событиям, а дуги — непосредственным пере™ ходам между событиями. При этом квазипорядок порождает на множестве Е событий отношение эквивалентности /^, разбивающее процесс р на непересекающиеся истории семейства р | /^ . Смысл обозначения е Д е' заключается в переходе от события е к событию Е с историей h, которая может интерпретироваться как «имя» перехода.
Рассмотрим следующий пример. Пусть необходимо вычислить квадратный корень из неотрицательного числа А, используя метод Ньютона. Ниже приведена соответствующая программа на языке Fortran:
8=А
Т=(S+A/S)*0.5
3 IF(ABS((T-S)/T).LE.0.1)6
S=T
GO TO 2
T=S
Операторы с метками 1, 2, 4, 6 являются преобразователями, а операторы с метками 3 и 5 — распознавателями. Вычисление производится с относительной погрешностью, не превышающей 0.1, требуемое условие завершения счета проверяется при выполнении оператора с меткой 3. Со срабатыванием каждого из операторов свяжем событие, обозначаемое меткой 1,. . . ,6. В основу выполнения перехода между событиями в одном случае положим связи по управлению, в другом — информационные связи. Соответствующие истории процесса будем называть операционной и информационной.
На рис. 2.1 показаны операционные истории процесса вычисления квадратного корня из А для разных исходных данных: для А=1 (см.
б
Рис. 2.1. Операционные истории процесса
рис. 2.1, а) и для А=2 (см. рис. 2.1, б). В одном случае программа останавливается с результатом Т=1, в другом — Т=1.5.
На рис. 2.2 представлены информационные истории процесса вычисления для А=1 (см. рис. 2.2, а) и для А=2 (см. рис. 2.2, б).
Как видно из рис. 2.1 и рис. 2.2, при двух разных значениях исходного числа А процесс вычислений представлен двумя различными множествами непересекающихся историй (классами эквивалентности). Для операционных историй отношение —> переходов строится на пере™
124•►•42•►•46бРис. 2.2. Информацион-ные истории процесса124•►•42•►•46бРис. 2.2. Информацион-ные истории процессадаче управления, для информационных историй переходы между событиями обуславливаются передачей данных.
124
•►•
42
•►•
46
б
Рис. 2.2. Информацион-ные истории процесса
124
•►•
42
•►•
46
б
Рис. 2.2. Информацион-ные истории процесса
Таким образом, истории процессов представляют собой некоторые «срезы» поведе
ния программы для разных входных данных. Какую из форм представления истории использовать, как уже говорилось, зависит от преследуемых целей. Так, например, для распараллеливания программы в духе парадигмы SPMD при распределении задач по процессорам наибольший интерес представляет история реализации программы или информационная история ее процессов. Когда же причинно-следственные связи между собы
тиями на уровне переходов установлены, от природы этих связей (по управлению или по данным) можно уже абстрагироваться.
В этом и состоит главное различие между историей реализации программы, иногда еще называемой графом алгоритма [9], операционной историей программы и историями процесса программы, несмотря на имеющееся сходство между этими понятиями. Суть этого различия заключается в том, что отношения передачи управления и информации не являются транзитивными отношениями. Этим отношениям соответствуют непосредственные переходы между событиями, например, на рис. 2.1, а это переходы 1—>2,2—>3,3—>6. Отношение переходов является транзитивным, т. е. из того, что выполнимы переходы 1^2, 2^3, следует, что выполнимым является переход 1 ^ 3 с историей 123. При этом переход однозначно характеризуется своей историей, в частности, переход 16 на рис. 2.1, б имеет «имя» 12345236. На
рис. 2.2 показаны два различных перехода 1 ^2, идентифицируемых «именами» 12 (см. рис. 2.2, а) и 1242 (см. рис. 2.2, б).
Именно свойство транзитивности переходов, как будет показано в § 2.2, играет решающую роль в обеспечении однозначности вычислений в условиях, когда для одних и тех же входных данных возможны разные истории процессов. Далее мы будем использовать понятие истории, связывая с ним переходы между событиями и процессы вычислений, т. е. выполнение программы, всегда помня о транзитивности
отношения переходов.
Пусть pi = (Ei, Р2 — ^Е2, , рк — ^Ек^ — отдельные процессы, где Ei, Е2, . . . , Ек — соответствующие множества событий, а . . . , — отношения квазипорядка на Ei, Е2, . . • , Ек- Композиция процессов программы — это такой процесс Р = (Е, ^), что
Е С Ei х Е2 х . . . х Ек,(«(^....ек),^,...,^) € S) (V/i € Р, бР^
(еъ . . ., ек) 4 (е^,..., е'к) (ех 4 е'), . . . , (ек 4 е^),
где Р^ — класс эквивалентности в Р | /^ . Это означает, что в композиции Р выполнимы переходы с одним и тем же «именем» h, представляющим собой историю выполнения программы из К-наборов событий.
С помощью понятий события и перехода можно формально представить причинно-следственные связи между процессами. Процессы Pi, pj, которым соответствуют множества Ei, Ej событий, назовем взаимодействующими, если на множестве Ei U Ej задано отношение переходов, причем Ci ej (либо ej щ), Ci € Ei, ej € Ej =4 ti
^ tj (либо tj ^ ti), где ti,tj — теги событий Ci,ej. Если теги ti и tj совпадают, то события Ci и ej являются синхронизированными. Равенство ti = tj формально представляет взаимодействие процессов в синхронных каналах, например механизм рандеву процессов pi, pj в моделях CSP и CCS. При этом события процессов pi, pj, не связанные с рандеву, частично упорядочены в соответствующих множествах Ei, Ej. В асинхронных каналах с неблокирующим обменом взаимодействие процессов pi, pj представляется переходом Ci ej (либо ej ™Э ei), причем ti < tj (либо tj < ti).
В системах с «единым временем» процесс можно определить как функцию р (t) из Т в S, измеримую относительно t Е Т, задав на множестве Р допустимых процессов операции последовательной и параллельной композиций. Пусть |р| — длительность процесса р.
Последовательная композиция процессов р, q Е Р представляет собой такой процесс г = р * q, г Е Р, что
тЩ= <тЩ= <р (t) при 0 t |р|, qW при |р| < ^ |р| + |ф, не определено при t > |р| + |ф.
тЩ= <
тЩ= <
Отношение ^ порядка на множестве Т моментов времени естественным образом распространяется на множество Р процессов: р ^ г 44 (Bq Е Р) т = р * q, причем (Vr Е Р) р ^ г =4 р Е Р, т. е. начало р любого допустимого процесса г является допустимым.
Параллельной композицией процессов р, q одинаковой длительности называется процесс т = р х q такой, что
r № = Ir № = I(рЩпри 0 < t < |р| = \q\,
r № = I
r № = I
не определено при t > |р| = |ф.
Обобщенная параллельная композиция т = р • q процессов р, q разной длительности определяется следующим образом. Положим \q\ > > |р|. Тогда
' (.pW, q^ при о < z < |р|,
г (t) = < q (t) приг (t) = < q (t) при|р| < t < kl,|р| < t < kl,
г (t) = < q (t) при
г (t) = < q (t) при
|р| < t < kl,
|р| < t < kl,
. не определено при £ > |ф
либолибоЩ) = <Щ) = <
либо
либо
Щ) = <
Щ) = <
q^ ПРИ 0 < t < kl - |р|, (pW, qW) при М - IpI < t < kl, не определено при t > |ф .
На рис. 2.3 приведены примеры композиции процессов в «едином времени»: рх * р2, Pi * Рз, Рг х Рз, Pi * (рг х р3), р4 • р5, р5 • р6, (ps ’ Рб) ' Р4- Рассмотренные операции «временной» композиции представляют по сути синхронизацию событий, соответствующих началу и
Рис. 2.3. Примеры композиции процессов в «едином времени» завершению процессов. При этом лишь последовательная композиция явно отражает причинно-следственную связь между процессами. Например, наступление события (Н,Р1 (И)) влечет наступление событий (Н,Р2 (И)) и (Н?Рз (Н)) (см- Рис- 2.3), причем все три события синхронизированы во времени. Однако при этом не ясно, существует ли причинная связь между событиями (^з, р2 (^з)) и (й? Рз (^з))- Можно лишь утверждать, что они синхронизированы. Более того, положим, что результат процесса pi порождает процесс Р4 путем посылки сообщения. Рассмотренные операции «временной» композиции этого взаимодействия не охватывают. Тем не менее его легко представить с помощью понятия перехода между событиями: (Н,Р1 (Н))(^2?Р4 (^))-
Отношение —> переходов необходимо отличать от отношения Ч предшествования событий. Так, е^ Ч ej О ti ^ tj. Отношение предшествования так же, как и отношение переходов, частично упорядочивает множество Е событий. Однако запись щ Ч ej не означает, что наступление щ Е Е влечет за собой наступление ej Е Е Е. Например, на рис. 2.3 процессы р2 и р6 не связаны операцией композиции, но при этом для событий, соответствующих завершению р-2 и началу р6, справедливо (Ь, Р2 (<з)Щ (Ь, Ре (Ь))- С другой стороны, (Д, pi (ti)) -< (Z2, Р4 (Ь)), и соответствующие события, как сказано выше, могут быть связаны переходом. С помощью отношения предшествования событий можно формально описать совместное исполнение процессов над общей памятью в принятой модели согласованности (см. § 1.2).
Асинхронный обмен сообщениями и связанные с ним проблемы. Сначала договоримся, что мы будем понимать под сообщением. Атомарное, неделимое значение данных назовем токеном. В зависимости от требований, предъявляемых к модели обработки, токен может быть словом, кэш-строкой, страницей, пакетом и т. д. Сообщение — структурированная совокупность токенов, а в общем случае — набор, каждый из компонентов которого в свою очередь является вектором связанных токенов. Асинхронная передача сообщения требует его сохранения в буфере. В общем случае процессы могут иметь как входные, так и выходные буферы. Однако с позиций анализа однозначности и отсутствия блокировок вычислений соответствующие модели являются семантически эквивалентными. Различие между ними, как будет показано ниже, проявляется при «надстройке» над той или иной моделью согласованности памяти в DSM-архитектурах.
Будем считать, что с каждым процессом р связано b входных буферов, где b — число компонентов входного сообщения М/ = ^т^ , т^, . ■ . . . . , т1^. Число токенов в компонентах т^, т^ ■ . . , т^ будем называть шириной соответствующего буфера. Глубина буфера (число входных сообщений) в общем случае может быть и не ограничена. Каждому входному сообщению М/ соответствует выходное сообщение Mq = = ^т^, т^ , . . . , т^), где с — число компонентов, или число выходных буферов процесса. Будем полагать, что как только сформирован токен либо компонент выходного сообщения процесса-производителя, он сразу пересылается в буфер процесса-потребителя. Доступ к любому буферу сразу нескольких производителей исключается. Чтение из пустых буферов блокируется. Любой из процессов инициируется после формирования входного сообщения М/. При этом наступает одно из началиных событий подмножества Е° С Е. Токен в Mq ассоциируется с одним из особых событий подмножества ЕСЕ. После окончания формирования вьшодного сообщения Mq наступает заключительное событие из Е1 С Е.
Подобный механизм пересылки сообщений аналогичен энергичной модели свободной согласованности памяти (ERC). Токены выходного сообщения пересылаются во входные буферы процессов-потребителей вне зависимости от того, когда они будут востребованы (аналог передачи модифицированных данных при выполнении операции release). При наличии у процесса, помимо b входных, с выходных буферов (по числу компонентов выходного сообщения) может быть реализован механизм обмена, эквивалентный ленивой модели свободной согласованности (LRC). При этом токены выходного сообщения пересылаются при обращении к соответствующим выходным буферам процесса- производителя со стороны процессов-потребителей (аналог передачи модифицированных данных при выполнении операции acquire).
Определение 2.1. Процесс р является детерминированным, если любому начальному событию е° € Е° соответствует не более одного
заключительного события е1 G Е\ т. е. определено частичное отображение из Е° в Е1.
Определение 2.2. Процесс р является недетерминированным, если начальному событию е° € Е° может соответствовать некоторое подмножество множества Е особых событий, т. е. определено частичное отображение из Е° в 2s.
Определение 2.3. Пусть М/ и Mq — множества входных и выходных сообщений процесса р. Процесс р является однозначным, если существует отображение из М/ в Mq.
Два однозначных процесса функционально эквивалентны, если оба они реализуют одно и то же отображение из М/ в Mq.
Очевидно, что в соответствии с определениями 2.1, 2.3, если существует переход е° —> е1, то детерминированный процесс р является однозначным. Согласно определениям 2.2, 2.3 однозначный процесс может быть и недетерминированным: токены выходного сообщения могут появляться в произвольной последовательности и любое из особых событий может стать заключительным. Понятно, что если отдельные процессы композиции являются недетерминированными, то и композиция в целом также недетерминирована.
Итак, недетерминизм вычислительного процесса означает, что любой паре, состоящей из входного и выходного сообщений, может соответствовать более одной истории выполнения программы. Недетерминизм процессов обуславливает различные последовательности формирования компонентов сообщения. Тем самым обеспечивается динамический механизм порождения процессов по готовности входных данных, а число процессов, связанное с выполнением конкретной программы, в общем случае не ограничивается. Основные вопросы, которые при этом возникают, заключаются в следующем.
Вопрос первый: при каких условиях результат вычислений является однозначным?
Далее, «внешнее» описание поведения композиции процессов в терминах сообщений определяет так называемую денотационную семантику модели. К понятию денотационной семантики обычно прибегают в теории функционального программирования [60]. При этом точно специфицируется, что является величиной любого исходного выражения, а выполнение функциональной программы представляется как вычисление математических функций. Денотационная семантика определяет отображение, которое связывает с каждым синтаксически корректным выражением определенную величину, т. е. выражения по сути обозначают (denote) некоторые величины. Нужно заметить, что идеи функционального программирования могут использоваться и для организации параллельных вычислений так, например, как это реализуется в Т-системе [1]. Говоря о денотационной семантике, мы подразумеваем существование некоторого отображения М/ —> Mq, сопоставляющего входному сообщению процесса определенное выходное сообщение.
Учет недетерминизма процессов, т. е. «внутреннее» представление поведения на уровне событий, вводит операционную семантику. Операционная семантика предписывает, как должна выполняться программа (вычисляться выражения) в терминах переходов между выделенными состояниями или событиями. Таким образом, исполнение программы представляет собой некоторую последовательность действий, связанных отношением переходов.
Допустим, мы имеем некоторый язык программирования, частью определения свойств которого является денотационная семантика. Мы хотим на этом языке писать корректные программы, выполнение которых описывается операционной семантикой языка. При этом возникает проблема, относящаяся к числу фундаментальных в теоретическом программировании. Суть ее заключается в следующем: согласованы ли, т. е. соответствуют ли одна другой, операционная и денотационная семантики языка. Иногда говорят об их эквивалентности.
Поэтому вполне естественным является вопрос второй: согласованы ли однозначность вычислений (денотационная семантика) и недетерминизм модели (операционная семантика)?
Поиску ответов на эти два сформулированных вопроса и посвящен следующий параграф.
§2.2. Однозначность и семантика вычисленийв модели обмена сообщениями
Достаточное условие однозначности результата вычислений. Переход между событиями процесса однозначно идентифицируется своим «именем» — историей. При этом еще раз подчеркнем, что отношение переходов, в отличие от отношений управления и информационной связи, является транзитивным. Поэтому на отношения переходов формально распространяются свойства транзитивных бинарных отношений [34, 65]. В частности, переход с историей hi является транзитивным относительно перехода с историей h^, если имеет место
/1.1 / / и и ^-2 / / hi и hi и
е -4 е , е 4 е4е и е4е , е -4 е 4 е4е .
Переходы с историями hi^ h% будем называть взаимно транзи- тивными^ если каждый из них транзитивен относительно другого. Взаимная транзитивность переходов содержательно может быть интерпретирована следующим образом: любой из допустимых процессов программы может быть началом или окончанием другого допустимого процесса.
Для того чтобы недетерминированный процесс рп был однозначным (см. определение 2.3), достаточно, чтобы любой из переходов, связанный с начальным событием е° Е Е°, приводил к одному и тому же подмножеству множества Е особых событий, соответствующих опреде-
ленному выходному сообщению. При этом вполне возможно, что паре, состоящей из входного и выходного сообщений, соответствует более одной истории выполнения программы в силу недетерминированного характера поведения ее процессов. Обозначим через Нп объединение историй в рп | 1^. Отношение переходов с историями из Нп — это рефлексивно-транзитивное отношение, совпадающее со своим транзитивным замыканием. Выберем произвольно подмножества Я1, Н^ С С Нп. Предположим, что имеют место переходы е° е\ где Н^ С Яьа
/ НДНг _е У ci,
где 61 — заключительное событие, после наступления которого никакие переходы не выполнимы. Тогда в силу взаимной транзитивности переходов с историями из Я1 и Я2 получаем е° ^ ё1 и е° ^ 6i. Теперь рассмотрим переходы е° —£ е", где Н^ С Я2, а
в > е^.
где е2 Е Е — заключительное событие. При этом опять-таки е° ^ 62 и е° ^ 62 - В силу того, что процесс рп недетерминирован, в общем случае ё1 ^ 62, но ё1, ё2 Е Е\ где Е'СЕ (см. определение 2.2). Поскольку подмножества историй Я1, Н^ выбирались совершенно произвольно, то любой переход, связанный с событием е°, приводит в одно и то же подмножество Е' СЕ. Иллюстрируется это следующими диаграмма™
Для того чтобы детерминированный процесс рд был однозначным, достаточно, чтобы любой переход, связанный с начальным событием е° Е Я0, приводил к одному и тому же заключительному событию е1 Е Е Е1 (см. определение 2.1). Обозначим через Нд объединение историй рд | /^. Выберем произвольно два подмножества историй Я1, Н^ С Нд. Тогда имеет место следующая коммутативная диаграмма:
Действительно,
Нг U Щ\НД = H.U (ЯДЯз) = Нг U Н2 е° ЖЖ, е1.
Таким образом, доказана следующая
Теорема 2.1. Пусть переходы процесса р взаимно транзитивны. Тогда р — однозначный вычислительный процесс.
Следовательно, взаимная транзитивность переходов является достаточным условием однозначности результата вычислений, даже если процесс является недетерминированным, т. е. возможны различные истории выполнения программы на одних и тех же исходных данных.
Взаимная транзитивность переходов детерминированного в соответствии с определением 2.1 процесса рд влечет наличие у него свойства так называемой конфлюэнтности — аналога свойства Чёрча-Россера в смысле, определенном Р. Келлером [116].
Теорема Чёрча-Россера относится к числу фундаментальных положений в лямбда-исчислении — разделе математической логики, на котором основаны многие теоретические результаты в области языков функционального программирования [60]. По сути лямбда-исчисление представляет собой средство для описания свойств математических («чистых») функций и их обработки с помощью специальных правил. Лямбда-выражения преобразуются, «упрощаются» на основе процесса, называемого редукцией и приводящего к нормальной форме выражения, когда нельзя применить никакое правило редукции. Теорема Чёрча-Россера утверждает: если выражение может быть приведено двумя различными способами к двум нормальным формам, то эти нормальные формы являются алфавитно-эквивалентными, т. е. эквивалентными с точностью до обозначения переменных. Отсюда следует единственность нормальной формы, а также идентичность результатов вычислений при любом порядке редукций.
Келлер в [116] построил абстрактную модель асинхронных параллельных вычислений, которую он назвал именованной системой переходов. Это — тройка, содержащая множество состояний, бинарное отношение на этом множестве (множество переходов) и множество «имен» переходов (слов некоторого алфавита). Именованная система переходов описывается такими свойствами, как детерминизм, коммутативность и устойчивость вычислений. Детерминизм означает, что существует не более одного перехода с одним и тем же «именем» из некоторого заданного состояния. Под коммутативностью понимается следующее. Пусть из заданного начального состояния выполнимы два перехода такие, что их «имена» образуются конкатенацией (приписыванием) двух составляющих слов в разных последовательностях. Тогда существует по крайней мере одно общее заключительное состояние, в которое ведут оба перехода из заданного начального состояния. Устойчивость вычислений трактуется так: осуществление перехода с «именем» hi не может сделать невозможным переход с «именем» /12, если последний также выполним. Иными словами, условие «переход с «именем» h2 возможен» имеет место (сохраняет устойчивость) до тех пор, пока не начнется его выполнение, причем ему предшествует
переход с «именем» hi. Это свойство можно сформулировать и так: окончание любого допустимого процесса является допустимым.
Если именованная система переходов обладает свойствами детерминизма, коммутативности и устойчивости, то параллельные асинхронные вычисления, описываемые такой моделью, являются локально конфлюэнтными. Это свойство может быть описано таким образом. Пусть два промежуточных состояния достижимы из некоторого начального состояния с помощью непосредственных, атомарных переходов. Тогда существует заключительное состояние, достижимое из обоих промежуточных путем непосредственных переходов. Непосредственные переходы могут быть элементами составных, более сложных переходов между состояниями. Из локальной конфлюэнтности вычислений вытекает конфлюэнтность глобальная^ когда достижимость промежуточных и заключительного состояний из некоторого начального подразумевает конечные последовательности непосредственных переходов.
Заметим, что, в отличие от свойств детерминизма, коммутативности и устойчивости, понятия локальной и глобальной конфлюэнтности определяются независимо от «имен» переходов. Конфлюэнтность аналогична свойству Чёрча-Россера, поскольку означает, что окончательный результат вычислений не зависит от способа (последовательности) промежуточных вычислений.
Теперь посмотрим, действительно ли из взаимной транзитивности переходов детерминированного процесса следует его конфлюэнтность. Имеют место следующие свойства для переходов между событиями:
детерминизм, или
Е) (Wep^epd \ Щ
е ^л е\ е ^¥ ен е1 = е” (здесь р^ — класс эквивалентности в рд |/^ );
коммутативность, или
(Ve € Е) (У/ll, /г2 € р_, е pd |
ее(Эе' е
где е -Е обозначает выполнимость переходов, связанных с событием е, a hi62, h2hi — конкатенацию «имен» переходов;
устойчивость, или
(Ve € £7) ^hx,hi 6 Р, 6 Pd\
hi Ф hi, е —V,е .
Отсюда следует локальная конфлюэнтность, т. е. если е -Э е? обозначает непосредственный переход между событиями е^ ef Е Е^
то (Ve, в” ЕЕ) е^Е, е\ Е е" (Эе"' Е Е) Е ем\ Е’
Ен. Следовательно, имеет место и свойство конфлюэнтности, или Де,Е,ем Е Е) еДЕ, е ДЕДЭЕ" Е Е) ЕДЕД Е'Д ЕД где * обозначает конечную последовательность событий.
Таким образом, понятие взаимной транзитивности переходов детерминированного процесса является не менее общим, чем совокупность условий а)-в). Что же касается недетерминированного процесса, то взаимной транзитивности, согласно теореме 2.1, достаточно для обеспечения однозначности результата вычислений. Очевидно также, что недетерминированная композиция однозначных процессов является однозначной. Итак, получен ответ на первый из поставленных в § 2.1 вопросов.
Операционная семантика вычислений. Формализуем операционную семантику рассматриваемой модели вычислений с помощью алгебры событий. Как уже отмечалось, история h процесса или программы, представляющая собой слово в алфавите Е, полностью описывает последовательность сопряженных переходов между событиями множества Е. Число событий (символов) в слове h будем называть длиной истории и обозначать ее | /г | - На мощность множества Е никаких ограничений не накладывается, а длина \h\ истории не обязательно конечна. Последнее предположение означает, во-первых, возможность протекания процессов не обязательно конечной длительности и, во- вторых, отсутствие ограничений на число динамически порождаемых процессов при выполнении программы. Слово h может быть и пустым, т. е. не содержать ни одного символа. Будем говорить, что ему соответствует пустое событие (процесс нулевой длительности), которое обозначим через а.
Рассмотрим класс Е, включающий в себя следующие события.
Объединение ei + в2 + - . - конечной или бесконечной последовательности событий ci, 62, . . ., представляющее собой событие, которое состоит в наступлении по крайней мере одного из событий ei, 62, . . .
Совмещение e^Cj двух событий в{ и ej, которое является событием, состоящим из наступления и е^, и ej.
Дополнение Де события е, т. е. событие, заключающееся в наступлении любого другого события класса Е, но не события е.
Достоверное событие ш, т. е. осуществление хотя бы одного из событий класса Е.
Пустое событие а, которое состоит в том, что не наступает ни одного из событий класса Е.
Нетрудно заметить, что приведенное выше определение Е формально ничем не отличается от определений алгебры множеств или алгебры событий (исходов идеализированных наблюдений), принятых в вероятностных моделях. Подчеркнем лишь то, что совмещение е^ ej событий вовсе не означает их синхронизацию, т. е. совпадение тегов Д tj. Далее, Е — дистрибутивная решетка с дополнением, или, иными
словами, булева алгебра [34], с операциями объединения и совмещения событий, которая обладает следующими свойствами.
Для (Ve/, ет, еп Е Е) имеет место:
замкнутость Е, т. е. в/ + ет, е/еп Е Е;
коммутативность, т. е. et + ет = ет + е/, е/ет = етер
ассоциативность, т. е. е/ + (ет + еп) = (е/ + еш) + еп,
^1 (^т^п) — (б/ет) еп,
дистрибутивность, т. е. е/ (em + en) = eiem + е/еп,
в/ 4" втвп — (в/ Н™ ет) (в/ Н™ еп),
в/ + а = в/, е^ш = в/, е/а = а, в/ + ш = ш;
е/+]е/ = w, eje/ = а.
При этом операции объединения и совмещения являются идемпотентными (в/ + ei = eiei = еД и выполняются свойство совместимости (щ + ет = ет О щет = еД, законы двойного отрицания, поглощения и де Моргана [34]. Более того, булева алгебра Е событий является вполне аддитивной, поскольку любое бесконечное объединение событий есть элемент Е.
Теорема 2.2. Класс Е событий есть алгебра меры р(Е) = |/z|, где \h\ ™ длина истории выполнения программы на множестве Е событий.
Доказательство. Пусть Е^ — множество событий кто процесса, а ^Ек \к = 1, 2, . . . } — семейство событий, соответствующее выполнению программы. Напомним, что отношение -Е переходов (квазипорядок на Е^) порождает отношение 1^ эквивалентности. При этом процесс р^ представляется в виде семейства р^ | /^ непересекающихся множеств переходов (историй). Значит, Е^ — измеримое множество, для которого лебеговой мерой р (Е^) является суммарная длина \hk\ историй переходов между событиями. При этом |/гД ^ 0, а р (а) =0. Множество событий программы — это Е = |J Ед., причем {Ед. \к = 1, 2, . . .} — последовательность попарно к
непересекающихся измеримых множеств, для которой выполняется свойство счетной аддитивности, или сг-аддитивности: fi(E) = = Е^(Е0, Ек1ПЕк2=0, к^к^, Ек1,Ек2 е {Ек\к = 1,2,---}- к
При этом элементы Е и Е^ П Е^ — суть объединение и совмещение событий соответственно в классе Е. Таким образом, Е есть а-алгебра с единицей а, а функция р (Е) = 52 1^1 = \h\ является а-аддитивной, что и требовалось доказать. к
При доказательстве теоремы 2.2 никаких специальных предположений ни о конечном числе процессов, ни о конечной длине истории выполнения программы (соответственно о завершении процессов в течение некоторого конечного интервала времени) не делалось. Разумеется, результат, устанавливаемый теоремой 2.2, распространяется и на конечное (фиксированное) число процессов конечной длительности и будет полезен в следующем пункте данного параграфа.
Инварианты в поведении программ. Масштабируемость аппаратных средств, а также переносимость и масштабируемость параллельных программ являются тесно взаимосвязанными проблемами, от решения которых зависит эффективность параллельных вычислений. Функционально эквивалентные (выполняющие одинаковые вычисления) программы с неодинаковой степенью параллелизма, понятно, характеризуются различным временем выполнения на соответствующих платформах. При этом практически полезным, например, с точки зрения удобства отладки, было бы наличие у программ некоторых общих свойств, инвариантных относительно реализации. Так, последовательная программа, отлаживаемая на инструментальной однопроцессорной системе, может быть «превращена» в параллельную для целевой системы с помощью расстановки в определенных местах текста директив стандарта OpenMP. С другой стороны, параллельная OpenMP-программа может выполняться и на однопроцессорной платформе. При этом «последовательный» компилятор попросту проигнорирует, не заметит комментарии OpenMP, такие, как ! $ОМР для языка Fortran или #pragma omp для языка С. Что же общего, помимо функциональной эквивалентности, есть в действиях (поведении) последовательной и параллельной программ либо параллельных программ, выполняемых на различных платформах?
Представим некоторую программу Р моделью (частным случаем алгебраической структуры) вида (Н, о), где Н — множество всех допустимых историй выполнения программы, а о представляет операцию конкатенации слов, соответствующих историям в алфавите Е событий программы. Формально (Н, о) — полугруппа с единицей (моноид), где о — операция полугруппового умножения [34], а единица — это пустое слово, соответствующее пустому событию а (этот же символ будем использовать и для пустого слова).
Рассмотрим две функционально эквивалентные программы Р^, Pt, реализуемые соответственно на инструментальной и целевой системах и представленные моделями (Н^, о), (Ht, о) с историями на множествах событий Е^ Et. Будем говорить, что программа Pt воспроизводит поведение программы Pj, если существует отображение 7: Н^ Ht такое, что
^h Е Hi, h = 61 О е2 О . . . о em, ei, е2, . . . , em Е Е^
= 7 (е1) ° 7 (е2) о о 7(ет),
(2Л)
7 (/г) € Нь 7(ei), 7(е2),..., 7 (ет) е Etl
(а) = а.
Отображение (2.1) будем называть динамическим гомоморфизмом (подобием поведений) программ P^, Pt, смысл которого заключается в том, что для каждого события в Е^ и истории в Hj существуют
соответствующие «аналоги» в Et и Н^. Выражение (2.1) естественным образом продолжается до отображения вида
(V//, kM е HJ 7 (/г' О Г) = 7 (^) О 7(Д"), 7(//), 7 (/г") е Hf. (2.2)
Соотношения (2.1), (2.2) означают, что образ любого допустимого процесса программы Pi является допустимым процессом в программе Р^. Обозначим число исполняемых операторов или число процессов в конкретной реализации программы Pi через j. Отображение (2.2) по индукции продолжим до следующего отображения:
(V/igi,. . . , hij G Hi) 7 (^л ° • • • ° hij^ — 7 (^ii) ° . • • ° 7(^г^)?(2.3)
где 7 (/^i) , • • • , 7 (hij^ Ht.
При этом с учетом (2.1) имеем |/z^i| = |у (/ги)! , • ■ • , \ hij \ = ,7 №j)|- В соответствии с теоремой 2.2 и соотношением (2.3) для суммарной длины историй \кД процессов инструментальной программы Pj справедливо очевидное соотношение
\НД = \кц\ + . . . + \ hij \ = 17 (/г^1)| + . . . + 17 (^ij)|.(2.4)
Согласно (2.4) динамический гомоморфизм (2.1) сохраняет суммарную длину историй процессов программы Pj в любой из реализаций при отображении ее на целевую систему. В этом смысле суммарная длина историй инвариантна по отношению к способу реализации целевой программы Р^ например, степени ее параллелизма и вида аппаратной платформы, на которой она выполняется.
Пусть к — число процессов или исполняемых операторов программы Р^, соответствующих согласно (2.3) процессам или операторам с историями к^щ . . . , hij при некоторой реализации программы Pj. Из (2.1)-(2.4) вовсе не следует, что в общем случае суммарная длина историй \kt\ = \hti \ + . . . + |htk| процессов программы Pt в соответствующей реализации совпадает с \кД. Инвариантность \кД предполагает возможность установления соответствия между событиями при выполнении Р^ и Pt такого, что любое событие из Е^ имеет свой «аналог» в множестве Et событий программы для целевой системы.
За отображением динамического гомоморфизма (2.1) стоит знание правил, приемов сопоставления кодов инструментальной и целевой вычислительных систем, что практически далеко не просто. Эти вопросы рассматриваются в гл. 4. А сейчас обратимся к примерам интерпретаций динамического гомоморфизма программ и практическому использованию понятия истории.
Возьмем программу на языке Fortran для вычисления Пи-числа, составленную в соответствии со стандартом ОрепМР [26]:
DOUBLE PRECISION WД,SUM,PI,F,A
F(A)=4.D0/(l.D0+A*A)
W=1.ODO/N
SUM=O.ODO
!$ОРМ PARALLEL DO PRIVATE(X), SHARED(W) !$0PM&REDUCTI0N(+:SUM) DO 1=1,N
X=W*(1-0.5D0) SUM=SUM+F(X) ENDDO PI=W*SUM
PRINT *, ’PI=’,PI STOP
END
Последовательная программа преобразуется в параллельную добавлением в текст двух директив: $ОРМ PARALLEL DO и SOPM&REDUCTION. Атрибут REDUCTION дает возможность компилятору создавать систему кэширования данных, исключающую их некорректное разделение разными нитями. До упомянутых выше директив программа исполняется нитью-мастером как последовательная. Параллельная область программы порождается с помощью оператора PARALLEL DO. Индекс цикла I является локальной переменной для каждой нити в параллельной области, где I имеет свое уникальное значение. В этой программе N — целочисленный параметр. Выполнение параллельной области заканчивается оператором ENDD0. Далее продолжает работу только нить-мастер. При выполнении этой программы как последовательной, на однопроцессорной платформе, директивы ОрепМР просто не будут восприниматься компилятором. Пусть событие представляет собой выполнение оператора. Тогда любое событие последовательной программы имеет свой образ-событие в программе параллельной, что говорит о том, что эти программы связаны отображением динамического гомоморфизма. При этом в параллельной программе «сохраняется» суммарная длина историй процессов последовательной программы с учетом того, что в параллельной области ОрепМР-программы выполняется N параллельных нитей.
Рассмотрим еще один пример. Пусть известен объем вычислений, связанный с выполнением каждого оператора последовательной программы на некотором процессоре. Положим, что эта программа допускает распараллеливание на SMP-архитектуре, построенной на процессорах, идентичных процессору последовательной платформы. При этом параллельная вычислительная система не ограничивает хода вычислений, т. е. если может выполняться N операторов параллельно, то число процессоров не меньше N, а общая память имеет достаточную емкость. Требуется определить суммарный объем вычислений при выполнении параллельной программы, зная объемы вычислений при выполнении операторов функционально эквивалентной ей последовательной программы.
Преобразуем некоторую модель, например, граф параллельной программы, в соответствующую модель (граф) последовательной программы так, что не нарушается порядок передачи управления между
операторами и для каждого оператора обеспечивается своевременное вычисление операндов. Тогда любому развитию вычислений в модели параллельной программы однозначно соответствует некоторое развитие вычислений в модели последовательной программы. При этом каждому событию (срабатыванию оператора) при последовательном вычислении соответствует событие при параллельном счете. Это означает, что и в той, и в другой модели каждый оператор либо не выполняется, либо выполняется одинаковое число раз.
Пусть число операторов в обеих моделях одинаково. Это допущение, конечно, нужно принимать с определенной условностью, поскольку системы параллельного программирования вносят в текст последовательной программы некоторую избыточность в виде специальных директив (ОрепМР), функций передачи сообщений (MPI), операторов оценки производительности (трС [3]) и т. д. Но если предположить, что число операторов для выполнения «содержательных» вычислений в обеих программах одинаково, то можно утверждать, что они выполняют и одинаковые суммарные объемы вычислений.
Примерно такая цепочка рассуждений приводит к известному факту, состоящему в том, что в некоторых случаях задача определения объема вычислений параллельной программы сводится к определению объема соответствующей ей последовательной программы [10]. История выполнения последовательной программы может быть использована для определения объема вычислений, а динамический гомоморфизм последовательной и параллельной программ по сути представляет изоморфизм, т. е. взаимно однозначное соответствие между их действиями.
Согласованность операционной и денотационной семантик вычислений. Теперь рассмотрим вопрос о том, как может быть определена денотационная семантика вычислений в модели обмена сообщениями и как она согласуется с операционной семантикой, выраженной через алгебру событий, в которых совместно протекают процессы.
Пусть М — множество сообщений процесса, включая пустое сообщение А, не содержащее данных, а П(М) — законченный частичный порядок, т. с. множество последовательностей сообщений из М, в котором для каждой последовательности хЕП(М) существует наименьшая верхняя грань Ux [60]. Положим, что процесс р однозначен, а на А функция из М/ в Му не определена. Тогда существует функция Р:П (М) -Е П (М), которая непрерывна, если (Vx Е П (М)) F (Ux) = = UF (it). В соответствии с первой теоремой Клини о рекурсии [41] непрерывная функция F имеет наименьшую неподвиаюную точку х/, т. е. F (х/) = х/, причем любая последовательность х — префикс х/. Процесс, для которого определена такая функция F, назовем непрерывным. Композиция непрерывных процессов (аналог суперпозиции непрерывных функций) также является непрерывным процессом.
Итак, «внутренний» недетерминизм однозначных процессов (см. определения 2.2 и 2.3) может не нарушать свойства непрерывности процессов, в отличие от недетерминизма «внешнего». «Внешний» недетерминизм проявляется в том, что последовательность выходных сообщений не определяется однозначно последовательностью входных сообщений. Иными словами, процессы вычислений не являются однозначными. Применительно к сетям процессов Кана [113, 123], например, «внешний» недетерминизм означает, что истории внутренних и выходных каналов сети не полностью определяются историями входных каналов.
Как отмечалось выше, денотационная семантика («внешнее» описание) определяется в понятиях сообщений, а операционная («внутреннее» описание) — в понятиях событий. На основе операционной семантики формулируются требования к реализации композиции процессов: для того чтобы композиция была однозначной, достаточно, чтобы переходы процессов были взаимно транзитивными. Если композиция однозначных процессов непрерывна, то ее денотационная семантика — это семантика наименьшей неподвижной точки. Свойство непрерывности процессов вычислений обеспечивает существование конструктивного приема нахождения неподвижной точки программ [41] как наименьшей верхней грани Ытг на законченном частичном порядке из входных и выходных сообщений. Монотонность функции F на законченном частичном порядке также обеспечивает существование наименьшей неподвижной точки, однако не дает некоторого конструктивного приема для ее нахождения. Часто теорему о неподвижной точке связывают с именами Б. Кнастера и А. Тарского, которые изучали проблему применительно к решеткам, а не к законченному частичному порядку. Поэтому иногда соответствующую семантику называют семантикой Тарского.
Таким образом, если реализация языка программирования допускает «внутренний» недетерминизм процессов, обеспечивая их однозначность и непрерывность, то денотационная семантика, являющаяся частью определения языка, точно специфицирует, что является результатом вычисления. Это — ответ на второй из поставленных в § 2.1 вопросов.
Итак, мы рассмотрели модель распределенных вычислений, существенным отличием которой от известных моделей является сочетание недетерминизма процессов и асинхронного обмена разнородными сообщениями. Теорема 2.1 обосновывает достаточное условие однозначности вычислений. Операционная семантика вводится на основе алгебры событий, являющейся алгеброй меры — длины истории выполнения программы (см. теорему 2.2). Операционная и детонационная семантика модели согласованы.
Рассмотренная модель является весьма гибкой. Не накладывается никаких ограничений на конкретную реализацию процессов: концепция событий допускает как функциональный, на уровне сообщений,
так и процедурный, на уровне состояний, подходы. Глубина буферов процессов может быть ограничена. Тогда доминирует смещение модели в сторону аппаратной поддержки обмена сообщениями.
Если множество тегов является упорядоченным, а сообщения процессов согласованы так, что глубина буферов всех процессов рассчитана на одно сообщение, то может быть реализовано так называемое событийное (имитационное) моделирование. Подобный подход реализован в языке CSIM [149], являющемся расширением языка С для имитационного моделирования, когда процессы асинхронно обмениваются сообщениями по принципу «много писателей — много читателей».
Таким образом, рассмотренная в этом параграфе модель вычислений применима в широком спектре приложений, связанных с распределенными системами и средами.
. Потоковые модели распределенных вычислений
Потоковые модели и проблема блокировки вычислений. Потоковые модели — мощное и выразительное средство выявления внутреннего параллелизма программ, которое может быть использовано для повышения производительности вычислительных систем. Потоковые вычисления реализуются по мере готовности данных. За последние тридцать лет потоковые принципы обработки как альтернатива концепции Дж. фон Неймана оказали большое влияние на исследования языков программирования, параллельной компиляции, распределенных вычислений, обработки сигналов, реконфигурируемых архитектур и суперкомпьютеров с массовым параллелизмом.
Часто потоковая обработка непосредственно ассоциируется с машинами, управляемыми потоками данных [8]. Распространенной формой представления программы для них является граф потоков данных, существенное свойство которого заключается в однократном присваивании, или отсутствии повторной входимости. Известны языки для программирования машин потоков данных, например язык однократного присваивания Sisal [123]. Сразу же подчеркнем, что понятие «потоковая модель» в данной книге используется в ином контексте, без привязки к архитектуре, управляемой потоками данных. Потоковая организация обработки понимается как использование информационных связей между частично упорядоченными действиями программы для реализации заложенного в ней параллелизма.
Потоковая модель распределенной программы рассматривается как мноэюество процессов, взаимодействующих посредством асинхронной посылки сообщений через входные, а иногда и выходные буферы и инициируемых готовностью входных сообщений.
Обогащение потоковых моделей такими свойствами, как не детерминизм и распределенность процессов программы в вычислительной среде, а также обмен разнородными сообщениями ставит ряд серьезных проблем, связанных с исследованием разрешимости как самих моделей, так и задач их анализа.
«Зависания» программ могут возникнуть, когда процессы взаимно блокируют друг друга из-за отсутствия сообщений во входных буферах либо переполнения выходных буферов. Частными случаями блокировки вычислений являются ситуации тупика (дедлока) и голодания процессов (ливлока). О тупиках речь уже шла в § 1.2. Тупик, или ситуация бесконечного ожидания, возникает тогда, когда совместно протекающие процессы разделяют ресурсы, но ни одному процессу их не хватает для завершения вычислений, после чего соответствующая часть ресурсов должна быть освобождена. Опасность возникновения дедлоков важно учитывать при использовании систем синхронизации и организации среды взаимодействия процессов. В частности, как уже говорилось в § 1.2, тупики могут возникать при использовании блокирующего обмена сообщениями, реализуемого в MPI с помощью функций MPI_Send, MPI_Recv. Чтобы избежать тупиков, можно использовать функции неблокирующего обмена MPI_Isend, MPI_Irecv или совмещенных посылки/приема сообщений MPI_Sendrecv. Для обнаружения возможности дедлока, как правило, используются различные графовые модели. Это может быть ориентированный граф [26], каждая вершина которого соответствует некоторому ресурсному семафору S [i], а дуга (S[i], S [j]) с меткой Рк — возможности последовательного выполнения P-операции процессом Рк над семафорами S[i] и S[j] (см. § 3.1). Наличие в таком графе контура свидетельствует о тупиковой ситуации. Ливлок может возникнуть, если процессам назначаются некоторые приоритеты при доступе к разделяемым ресурсам.
Известной интерпретацией ситуаций тупика и голодания является задача о пяти обедающих философах [91]. Тупик возникает всякий раз, когда все пять философов одновременно рассаживаются вокруг круглого стола, в центре которого располагается блюдо со спагетти, и каждый из философов берет по одной вилке, располагающейся слева от него. Вилок всего пять, а для поедания спагетти нужны две вилки, лежащие слева и справа от философа. Предотвратить подобную ситуацию можно, ограничивая число одновременно обедающих фи лософов. Однако при этом не исключено голодание одного из них, если его соседи договорились между собой таким образом, что каждый раз, поочередно сменяя друг друга, опережают этого философа и соответственно забирают вилки то слева, то справа от него.
В параллельных системах дедлоки могут быть обусловлены неудачным выбором алгоритма маршрутизации коммуникационной сети при передаче данных. Известно, что две основные стратегии передачи сообщений — это коммутация каналов и коммутация пакетов [46]. Первая стратегия характеризуется тем, что коммуникационные ресур-
сы (порты и буферы коммутаторов) резервируются заранее, до посылки сообщения (пакетов данных). Недостаток стратегии передачи сообщений с коммутацией каналов состоит в том, что ресурсы сети могут использоваться неэффективно: пока не завершится передача пакетов, для которых зарезервирован канал, другие пакеты находятся в состоянии ожидания. Этот недостаток преодолевает другая стратегия — коммутация пакетов. Ее суть состоит в том, что сообщения разбиваются на части (пакеты), для передачи которых коммуникационные ресурсы заранее не резервируются. Однако при этом необходимы предварительное разбиение сообщения в пункте отправления и последующая сборка пакетов в пункте назначения. Тупики могут быть обусловлены конкуренцией за право обладания портами и буферами коммуникационной сети.
Впрочем, тупик может возникать и в сети с коммутацией каналов. На рис. 2.4 приведен пример такой ситуации. Пары процессов 1, 4 и 2, 3 пытаются обменяться пакетами. Для этого им удается зарезервировать по два входных порта и одному выходному порту каждого из четырех
незарезервированные выходные порты
Рис. 2.4. Тупик в сети с коммутацией каналов
коммутаторов так, как это показано на рис. 2.4. При одновременной посылке сообщений неизбежно возникает тупик: все четыре процесса ждут, когда освободятся выходные порты коммутаторов.
Представленный на рис. 2.4 случай соответствует статической маршрутизации. Маршрутизация может быть реализована адаптивно, когда общий буферный пул динамически распределяется между входными и выходными портами. При этом коммутаторы сети учитывают
Рис. 2.5. Примеры SDF-графовРис. 2.5. Примеры SDF-графов
Рис. 2.5. Примеры SDF-графов
Рис. 2.5. Примеры SDF-графов
текущий трафик обмена данными. Во избежание тупиковых ситуаций необходимо специальным образом структурировать буферный пул [26].
Случаи блокировки вычислений не исчерпываются лишь дедлока- ми и ливлоками. Чтобы это проиллюстрировать, прибегнем к модели, которая уже частично рассматривалась в § 1.2. Это SDF-графы. На рис. 2.5, а приведены примеры SDF-графов, вершины которых, напомним, обозначают акторы, а маркировка дуг — число производимых и потребляемых ими токенов. Случай, представленный на рис. 2.5, а, соответствует последовательности гнезд циклов.
Для однократного срабатывания актора аз необходимо соответственно 10 и 100 срабатываний акторов а^ и 04. Граф на рис. 2.5, б иллюстрирует случай тупика: акторы а4, as взаимно блокируют друг друга. Пример на рис. 2.5, в представляет так называемый несогласованный SDF-граф: актор а^ при каждом срабатывании производит два токена, передаваемых по дуге (а^, «в), в то время как по дуге (а7, а§) передается один. Нетривиального решения уравнения баланса, дающего целое число срабатываний актора as, не существует. Ситуацию с актором а§ можно, с одной стороны, интерпретировать как ливлок по входящей дуге (a7,ag). С другой стороны, имеет место «переизбыток» данных, передаваемых по входу (ag, as).
Какие выводы можно сделать из этого примера? Во-первых, для обнаружения возможности блокировок вычислений необходимо учитывать детальную структуру данных, которыми обмениваются процессы. Заметим, что в стандарте MPI предусмотрены механизмы, поддерживающие обмен сообщениями из разнотипных данных (производных типов данных). Однако требовать от стандарта гарантий согласованности данных, поступающих от разных процессов, конечно, нельзя. Это забота программиста, которому нужны адекватные модели, поддерживающие информационные зависимости между процессами и соответствующую структуру данных. Во-вторых, SDF-графы не содержат условных ветвлений и альтернативных выборов (слияний) потоков данных. SDF-модели становятся алгоритмически неразрешимыми при введении в них таких конструкций. Это означает, что при этом невозможно дать ответ на вопрос, существует ли нетривиальное, отличное от нуля решение уравнения баланса. В случае, когда оно существует, можно заключить, что в модели SDF отсутствуют тупики и возможно состав™
ление беступикового циклического расписания срабатывания акторов при ограниченной памяти данных (токенов).
Разумеется, такой «игрушечный» класс моделей вряд ли может быть полезен для исследования поведения сложных программ с циклами, условными операторами и т. д. Необходимы модели, поддерживающие недетерминизм процессов вычислений с произвольно структурированными данными, а в «арсенале» таких моделей должны быть средства предотвращения блокировки вычислений при наличии в программах циклов и альтернативных операторов.
Маркированные потоковые графы. Итак, проблема реализуемости потоковых моделей заключается в согласовании параметров очередей сообщений (входных и выходных буферов) таким образом, чтобы учесть все допустимые истории процессов программы, когда ни один из них не блокируется по рассмотренным выше причинам. Для решения этой проблемы нам понадобятся графы специального вида.
Маркированным потоковым графом будем называть шестерку G = = (У, X, У, А, р, а), где V — множество вершин (операторов программы); X и У — множества входных и выходных позиций вершин; А С С У х X — множество информационных дуг; р: (X U У) V — функция распределения позиций по вершинам; а: А Lout х Ljn — функция маркировки позиций. Здесь Lin и Lout — множества меток соответственно входных и выходных позиций вершин, в том числе и фиктивных, инцидентных входам и выходам графа. При этом множество X включает подмножество ординарных позиций, каждой из которых инцидентна одна дуга, и подмножество позиций для альтернативного выбора входящих потоков данных (select, или sit). В множество У включаются подмножество ординарных выходных позиций, а также подмножество позиций, соответствующих альтернативным переключениям (switch, или swh) и ветвлениям (fork, или frk) исходящих потоков данных. В общем случае входная позиция любой вершины и EV может быть ординарной или slt-позицией. Выходная позиция вершины и является ординарной, frk-позицией либо единственной выходной swh-позицией, которой инцидентно не менее двух информационных дуг. Этот случай соответствует условному ветвлению. Точкой входа в цикл является slt-позиция.
Характер меток входных и выходных позиций определяется семантикой модели вычислений. Напомним, что сообщение есть вектор, в котором каждый компонент в свою очередь представляет собой набор атомарных объектов (значений данных), или токенов. Число входных и выходных позиций вершины графа G совпадает с числом компонентов входного и выходного сообщений соответствующего процесса. Поэтому метка позиции описывает определенные семантические свойства компонента сообщения, а совокупности меток Ljn, Lout характеризуют систему типов сообщений, поддерживаемую моделью вычислений на основе потокового графа G.
На рис. 2.6, а показан информационно-логический граф программы (информационные связи представлены сплошными дугами, логические — штриховыми), а на рис. 2.6, б приведен соответствующий ему маркированный граф, называемый метаотгераторной сетью (М- сетью). Префикс «мета» означает, что здесь мы отвлекаемся от содержательного смысла операторов программы, перенося акцент на взаимодействие процессов, реализующих эти операторы.
Рис. 2.6. Информационно-логический граф (а) и соответствующая М-сеть (б)
В информационно-логическом графе (см. рис. 2.6, а) вершины щ — — ^5 соответствуют операторам, которые связаны по данным и управлению (для организации условных ветвлений). Вершина М-сети — метаоператор т, если ее выходные позиции являются ординарными или frk-позициями (на рис. 2.6, б — метаоператоры mi — т^. Вершина — это тест f, или логическое условие, если она имеет единственную выходную swh-позицию (на рис. 2.6, б — тест ^5). В М-сети метки из Ljn, Lout — натуральные числа. Метки выходных и входных позиций обозначают число производимых и потребляемых токенов в компонентах соответствующих сообщений. Для описания недетерминированных распределенных вычислений с каждым процессом ассоциируются входные и выходные буферы типа FIFO. Тогда метка позиции обозначает ширину буфера — число токенов в компоненте сообщения. Набору
операндов, связанных с определенным буфером процесса (например, (6, с, d) в щ, (6, с) в Уз, (zi, 2:2, ^з, ^4) в ^2? (^, d) в ^4), соответствует одна позиция вершины и одна дуга М-сети.
Необходимо сделать несколько замечаний относительно семантики использования позиций альтернативного выбора sit и swh в маркированных потоковых графах, в том числе и в М-сетях. Формально slt-позиция при организации цикла в вычислениях является аналогом булевой функции ИЛИ. Например, процесс, которому соответствует метаоператор mi (см. рис. 2.6, б), может быть инициирован данными, передаваемыми по дуге х. Таким образом, здесь устанавливается приоритет в передаче данных и соответственно порядок срабатывания метаоператоров, охваченных циклом. Так, сначала в позицию slti метаоператора mi данные передаются по дуге ж, что вызывает срабатывание mi, а затем уже возможна передача данных по дуге а, после срабатывания метаоператора m3. Тем самым гарантируется отсутствие тупиковой ситуации, хотя в рассматриваемой М-сети и существует контур, в который входят вершины mi и m3. Следовательно, срабатывание метаоператора mi обуславливается передачей данных по дуге х или по дуге а. Смысл введения позиции sit2 в метаоператор m2 иной: соответствующий процесс может начаться, если данные передаются либо только по дуге ^/, либо только по дуге z. При этом никакого приоритета в передаче данных не предполагается. Следовательно, здесь имеет место аналог булевой функции исключающее ИЛИ. Тест £5 передает данные только по дуге ’1’ метаоператору m3 либо только по дуге ’О’ метаоператору тгщ. Таким образом, альтернативное переключение swh также является аналогом функции исключающее ИЛИ.
М-сеть охватывает и случай обмена сообщениями между процессами через каналы, или очереди (рис. 2.7), подобно сетям процессов Кана.
Ширина буфера (число токенов в компоненте сообщения)Ширина буфера (число токенов в компоненте сообщения)
Ширина буфера (число токенов в компоненте сообщения)
Ширина буфера (число токенов в компоненте сообщения)
Глубина буфера(число сообщений в очереди)
Рис. 2.7. Сеть процессов с очередями
Длина очереди, или глубина буфера, равна числу входных сообщений. Ширина буфера совпадает с числом токенов в компоненте сообщения. Число очередей (буферов) равно числу компонентов входного сообщения для соответствующего процесса. Так, сообщения для процессов, обозначенных вершинами щ, г^? являются однокомпонентными, а сообщения процессов, которым соответствуют вершины u3, U4, у5 — двухкомпонентными. Токены от процесса-производителя пересылаются сразу же по мере формирования в соответствующие каналы процессов-потребителей. Процесс-потребитель инициируется лишь тогда, когда переданы все необходимые компоненты сообщения от процессов-производителей. Однако при этом, в отличие от детерминированной модели Кана, допускаются различные последовательности формирования токенов в компонентах и самих компонентов входных и выходных сообщений. Дисциплина FIFO строго упорядочивает компоненты входных сообщений по глубине буферов, а каждый из токенов занимает свое определенное ему место по ширине соответствующего буфера. Таким образом, сообщение — это двумерный массив, положение любого из токенов в котором однозначно определяется двумя параметрами — принадлежностью к некоторому компоненту и местом в этом компоненте сообщения. Заполнение же этого двумерного массива токенами осуществляется так, что последовательность, в которой токены передаются от процессов-производителей, заранее не известна.
Мы уже отмечали, что программную поддержку сложной структуры разнотипных данных, их упорядочение для сохранения целостности сообщений при наличии нескольких буферов у процесса, альтернатив в развитии вычислений целесообразно считать «внутренней» функцией процесса, а не пытаться реализовать ее средствами системы программирования, например MPI. Системы вроде MPI задают интерфейс, который должен соблюдать пользователь при разработке параллельных программ. В этом смысле функции MPI можно рассматривать как «внешние» по отношению к процессам, обменивающимся сообщениями. Рассмотрим примеры поддержки буферного обмена сообщениями на языке, подобном С. Программные средства включают классы «очередь» (queue) и «управляющий буфер» (controlFIFO). Очередь сообщений queue описывается такими параметрами, как ширина w и глубина d буфера, а также своим идентификатором iq:
queue[w]iq[d];
В случае альтернативного выбора информационных потоков (рис. 2.8) описание очередей может быть таким:
queue [1] a [da] ;
queue [1] b [db] ;
Ширина буферов, в которых формируются очереди а и b (им соответствуют дуги а, и 6), определяется меткой входной slt-позиции.
queue [ 1 ] a [da] ;
queue [ 1 ] b [ db ] ;
queue[w]controlFIFO_ml[d];
/* описание очередей и управляющего буфера */
if (!а.empty&&!controlFIFO_ml.full)controlFIF0_ml.enqueue;
/* постановка на обслуживание сообщений очереди а */
if (!b.empty&&!controlFIFO_ml.full)controlFIFO_ml.enqueue;
/* постановка на обслуживание сообщений очереди b */
Рис. 2.8. Управление альтернативными потоками данных
queue[2] е [d] ;
queue[1]f [d] ;
queue[w]controlFIFO m2[d];
/* описание очередей и управляющего буфера */
if (!ef.empty&&!controlFIFO_m2.full)controlFIFO_m2.enqueue;
/* постановка на обслуживание сообщений очередей e,f*/
if (!controlFIFO_m2.empty) controlFIFO_m2.dequeue;
/* удаление обработанного сообщения из очередей */
Рис. 2.9. Управление параллельными очередями сообщений
В общем случае очереди а и b (см. рис. 2.8) могут иметь различную длину da и db, т. е. содержать различное число сообщений.
Параллельные очереди (рис. 2.9) должны иметь одну и ту же длину d и описываться следующим образом:
queue [2] е [d] ;
queue [1] f [d] ;
Ширина параллельных очередей может быть различной.
Выбор сообщений из очередей процесса р реализуется с помощью управляющего буфера controlFIFO:
queue[w]controlFIF0_p[d];
Его ширина w должна быть достаточной для идентификации очереди в альтернативном выборе (см. рис. 2.8) либо нескольких параллель-
ных очередей (см. рис. 2.9). Глубина d управляющего буфера совпадает с длиной соответствующей очереди или параллельных очередей.
Основные методы классов «очередь» и «управляющий буфер»:
опрос очереди и управляющего буфера, которые могут содержать сообщения (.full) либо быть пустыми (.empty);
постановка на обслуживание (controlFIFO_p. enqueue) и удаление обработанного сообщения из очереди (controlFIFO_p.dequeue).
На рис. 2.8, 2.9 приведены примеры управления альтернативными и параллельными очередями сообщений.
В общем случае потоковый граф G соответствует недетерминированной модели вычислений: любой паре, состоящей из входного и выходного сообщений процесса, может соответствовать более одной его истории, и допускаются различные последовательности формирования компонентов сообщений. Поясним сказанное.
Каждый токен ассоциируется с начальным состоянием входной либо с одним из особых состояний выходной позиции вершины графа G^ когда осуществляется взаимодействие между процессами программы. Так, формирование метаоператором mi любого из трех токенов (см. рис. 2.6, б^ вызывает переход процесса в одно из трех особых состояний, или наступление особых событий. Это означает, что связанные с ним процессы (на рис. 2.6, б им соответствуют метаоператор т^ и тест £5) могут перейти в одно из начальных состояний, т. е. могут наступить соответствующие начальные события. Если принимается буферная модель передачи сообщений (см. рис. 2.7), пересылка токенов означает возможность переходов соответствующих входных буферов (на рис. 2.7 — буферов процессов v3 и v5) в начальные состояния. Как только будут сформированы токены всех компонентов входных сообщений, инициируются соответствующие процессы. Так, на рис. 2.6, б процесс, обозначаемый метаоператором т^ может начаться, получив по два токена в каждую из двух входных позиций от метаоператора mi и теста t^.
Рассмотрим пример иной семантической природы меток входных Lin и выходных Lout позиций вершин графа G. Пусть они обозначают типы компонентов сообщений, или классы токенов, и частично упорядочены. Отношение порядка ^ представим иерархией наследования типов (рис. 2.10).
В эту иерархию вкладывается следующий смысл: при передаче процессом-отправителем компонента выходного сообщения его тип должен быть «не больше», чем тип компонента соответствующего входного сообщения, принимаемого процессом-получателем. Так, рассмотрим типы double (число с плавающей точкой, или число двойной точности) и int (целое число). (В соответствии с форматом IEEE 754 тип int представляется 32 битами, a double — 64 битами.) Эти типы упорядочены: double ^ int. Пусть процесс Ui (см. рис. 2.7) формирует токены класса int. Тогда классы токенов процессов-потребителей, обозначенные метками соответствующих входных позиций вершин v3
Общий типОбщий типОбъектСтрокаОбъектСтрокаЧислоЧислодвойнойдвойнойЦелоеЦелоечислочисло/точностиX (double)/точностиX (double)(int)(int)
Общий тип
Общий тип
ОбъектСтрока
ОбъектСтрока
Число
Число
двойной
двойной
Целое
Целое
число
число
/точности
X (double)
/точности
X (double)
(int)
(int)
Рис. 2.10. Пример иерархии наследования типов данных
и V5, могут, например, иметь типы int или double. Такая семантика меток позволяет ставить вопрос о реализуемости модели вычислений на заданной иерархии классов токенов. Подобная система типов может рассматриваться как основа для реализации концепции полиморфизма при компонентном проектировании программного обеспечения.
Потоковый маркированный граф G адекватно отражает обмен сообщениями с разной структурой: сообщения могут состоять из разнотипных данных, а число (тип) токенов в компоненте выходного сообщения процесса-производителя может не совпадать с числом (типом) токенов компонентов входных сообщений всех процессов-потребителей. Например, на рис. 2.6, б такому обмену соответствует маркировка дуг щ ’1’, метка frk-позиции метаоператора mi, а также метки соответствующих ординарных входных позиций метаоператора m3 и теста ^5.
Связь проблем недетерминизма и блокировки вычислений. Недетерминизм процессов и разнородность сообщений создают опасность блокировки вычислений: процессы-потребители не могут быть инициированы, не имея достаточного количества токенов соответствующих типов во входных буферах от процессов-производителей.
Поясним связь проблем недетерминизма и блокировки вычислений на следующих примерах. Рассмотрим информационно связанные процессы pi, р27 Рз? взаимодействующие посредством передачи сообщений (рис. 2.11, а). Дуги а, 6, с, d соответствуют передаче токенов.
Рис. 2.11. К проблеме блокировки вычисленийРис. 2.11. К проблеме блокировки вычислений
Рис. 2.11. К проблеме блокировки вычислений
Рис. 2.11. К проблеме блокировки вычислений
Различные структуры сообщений, которыми обмениваются процессы, представим с помощью М-сетей, приведенных на рис. 2.11, б-г. Маркировка начал и концов дуг обозначает число токенов в соответствующих компонентах сообщений. Так, выходное сообщение процесса рх состоит из одного компонента (обе) — последовательности из трех токенов, передаваемых по дугам а, 6, с. Входное сообщение (а, 6) метаоператора m2 на рис. 2.11, б является двухкомпонентным, и каждый компонент содержит один токен. Для примеров на рис. 2.11, в, г метаоператору m2 передается однокомпонентное сообщение (ab) — последовательность из двух токенов. На рис. 2.11, б, в входное сообщение (с, d), предназначенное метаоператору m3, является двухкомпонентным, каждый компонент включает один токен. На рис. 2.11, г показан случай, когда метаоператор m3 получает либо сообщение (d), либо сообщение (с), каждое из которых содержит один компонент и соответственно один токен.
Допустим, процесс рх последовательно формирует три токена, причем возможен произвольный порядок их формирования в выходном сообщении (abc) (см. рис. 2.11, а), а любой из токенов сообщения (abc) является допустимым в компонентах входных сообщений для процессов р^ Рз- Тогда для примера на рис. 2.11, б существует шесть различных вариантов развития вычислений на одних и тех же для процесса рх входных данных в соответствии с числом 3! возможных перестановок токенов в сообщении (обе).
При тех же исходных условиях случай, показанный на рис. 2.11, в, соответствует блокировке вычислений: на любой последовательности токенов в (обе) метаоператор m3 может быть инициирован трижды компонентом с и один раз компонентом d сообщения (с, d\ поскольку для срабатывания метаоператора т2 необходимо два токена. Процесс же может начаться лишь при наличии всех необходимых входных данных.
В примере на рис. 2.11, г возможна альтернатива в вычислениях: метаоператор m3 инициируется либо сообщением (с), либо сообщением (d). Если метаоператоры т2 и m3 «распознают» в сообщении (abc) предназначенные им токены, то так же, как и в случае на рис. 2.11, б, возможны шесть сценариев развития вычислений на одних и тех же входных данных для процесса pi.
Получение ответа на вопрос о возможности блокировки вычислений, когда метаоператоры т2, m3 (см. рис. 2.11, г) потребляют любой из выходных токенов метаоператора mi, требует специальных методов анализа, которые рассматриваются в гл. 3. То же касается и вопроса, как преобразовать исходную модель обработки (см., например, рис. 2.11, в), чтобы исключить блокировки.
Заметим, что маркировка дуг, подобная используемой в М-сетях, применяется для анализа некоторых разрешимых подклассов потоковых моделей, в частности акторных моделей типа SDF. Однако сразу же следует подчеркнуть, что такие модели, как SDF, являются детерминированными моделями вычислений без условных ветвлений и альтернативных слияний потоков данных. Разумеется, и семантическая природа меток в М-сетях иная: по сути она соответствует числу особых состояний, когда осуществляется обмен данными между процессами, а переход в эти особые состояния случаен.
Таким образом, недетерминированный характер обмена произвольно структурированными данными ставит серьезную задачу анализа реализуемости соответствующей модели обработки, т. е. отсутствия блокировки вычислений при любых допустимых сценариях развития процессов в системе.
Рассмотрим подробнее, каким образом с помощью М-сетей можно интерпретировать возникновение или отсутствие блокировок вычислений при буферном обмене сообщениями. С каждым процессом р программы свяжем b входных и с выходных буферов сообщений. Входное сообщение представляет собой 6-компонентный вектор, г-й компонент которого — это набор операндов-аргументов г-го входного буфера, где г = 1, . . . , Ь. Число аргументов г-го компонента — ширина 1щ буфера, или метка соответствующей входной позиции вершины М-сети. Входные сообщения процесса р образуют очередь, длина d которой является глубиной всех b буферов. В каждый из входных буферов процесса р операнды-результаты соответствующих процессов поступают асинхронно, при этом буфер (процесс) переходит в одно из начальных состояний. Процесс р инициируется после формирования полного сообщения из b наборов аргументов. Таким образом, входная очередь — это массив из b х d наборов аргументов, а Тй буфер хранит массив из 1щ х d аргументов, где 1щ х d может рассматриваться как метка входящей дуги в М-сети.
Выходное сообщение процесса представляет собой с-компонентный вектор, j-й компонент которого — это набор операндов™результатов j-ro выходного буфера, где j = 1, . . . , с. Число результатов j-ro компонента
сообщения — ширина outj буфера, или метка соответствующей выходной позиции вершины М-сети. Каждому входному сообщению процесса р соответствует выходное сообщение, так что выходная очередь — это массив из с х d наборов результатов, при этом в j-m буфере хранится массив из outj х d результатов, где outj х d может рассматриваться как метка исходящей дуги М-сети. Глубина d входных и выходных буферов процесса р может присваиваться как метка соответствующей вершине М-сети. Формирование промежуточных и окончательных результатов вычислений происходит асинхронно, и появление любого из них переводит выходной буфер (процесс) в одно из особых состояний. Условные ветвления реализуются процессами с одним выходным буфером, который может находиться в одном из заключительных состояний, причем ему соответствует определенное значение управляющей переменной процесса, которому передается управление.
Глубину d буферов процесса допустимо интерпретировать как воз- мозюное d-кратное «участие» каждого из операторов в выполнении программы из-за недетерминированного характера переходов буферов в начальные и особые состояния. Однако это вовсе не означает фактического d-кратного увеличения длительности или объема вычислений процесса р, поскольку способность «распознавания» предназначенных ему аргументов обеспечивается известными механизмами, например с помощью функций интерфейса MPI. Сформулируем допущения, учитывающие особенности недетерминизма потоковых вычислений.
Во-первых, возможны различные истории выполнения программы для одних и тех же входных сообщений. При этом одно и то же подмножество особых состояний, т. е. формирование выходных сообщений, достигается процессами с разными историями: последовательности появления наборов результатов одного сообщения могут быть произвольными.
Во-вторых, любое из особых состояний ^™го процесса (например, его выходного буфера), где k Е {1, . . . , К}, а К — число операторов программы, может переводить в начальные состояния входные буферы связанных с ним процессов.
Положим, d^ — глубина буферов процесса р^, к = 1, . . . К. Тогда если для любой из альтернатив выполнения программы существует набор (di, d2, . . . , dK) меток вершин М-сети, каждый из компонентов которого имеет наименьшее из возможных значение, то в потоковой модели распределенных вычислений отсутствуют блокировки. Как говорилось в § 2.2, в общем случае глубина любого из буферов процесса теоретически не ограничивается, т. е. допускаются бесконечные последовательности наборов входных и выходных сообщений. В соответствии с денотационной семантикой вычислений отсюда не следует, что программа никогда не останавливается с конечным результатом, определяемым исходными данными. Вопрос ставится по-другому. Существует ли на бесконечном потоке сообщений для любой из альтерна-
тив развития процессов наименьшая верхняя грань глубины буферов каждого из процессов, при котором не блокируются связанные с ним процессы? Если на этот вопрос можно ответить «да» или «нет», то проблема блокировок вычислений для предложенной модели разрешима. Иными словами, блокировки не возникают, если на бесконечном потоке входных сообщений при любом возможном развитии процессов для каждой альтернативы существует такая наименьшая неподвижная точка (число сообщений), что композиция процессов может вырабатывать бесконечное число выходных сообщений. При этом учитываются все возможные сценарии вычислений с учетом недетерминизма процессов, которые обмениваются порциями данных произвольных размеров. Методы обнаружения и предотвращения блокировок вычислений описываются в гл. 3.
. Комментарий и краткий обзор к главе 2
Таксономические признаки, подобные рассмотренным в § 2.1, используются для сравнения различных сетевых моделей взаимодействующих процессов в [149]. Модель CSP описывается в классической работе Ч. Хоара [106], где также дается сравнительный анализ CSP и модели Кана [113]. Сети процессов Кана — детерминированная модель распределенных вычислений с преобладанием потоков данных, что объясняет, в частности, их применимость к проектированию систем обработки сигналов [137]. Однако процессы Кана, в отличие от моделей, основанных на конечных автоматах, мало приспособлены для представления связей по управлению и разделения ресурсов между процессами во времени. Сравнение различных, в том числе потоковых, моделей вычислений можно найти в уже упоминавшихся работах [124126, 137].
Событийная модель, рассмотренная в § 2.1, предложена в статье [52], там же приводится доказательство теоремы 2.1 об однозначности результата, или функциональности, вычислений (см. § 2.2). Примеры абстрактных моделей вычислений (дискретных систем) и операции «временной» композиции взаимодействующих процессов можно найти в книге [17].
Проблема глобальной конфлюэнтности асинхронных параллельных вычислений, аналога свойства Чёрча-Россера, изучается Р. М. Келлером в работе [116] на основе абстрактной модели — системы переходов. Понятие, аналогичное локальной конфлюэнтности (см. § 2.2), в [17] определяется как коммутативное отношение на множестве состояний сети из алгоритмических модулей (модели параллельных алгоритмов).
Исследование согласованности операционной семантики процессов Кана, определяемой в терминах событий, и денотационной семантики
модели вычислений как семантики наименьшей неподвижной точки на бесконечном потоке сообщений приводится в статье [124]. Однако здесь рассматривается проблема «внешнего» по отношению к сети процессов недетерминизма и нет строгого определения операционной семантики. В [71] показано, что недетерминизм процессов может приводить к потере свойства непрерывности вычислений, когда уже неприменима теорема о наименьшей неподвижной точке или аналогичная ей теорема Кнастера-Тарского. Сохранение при этом свойства монотонности процессов не дает конструктивного приема для отыскания наименьшей неподвижной точки вычислений.
В качестве инварианта поведения программ в [44] предлагается мера вычислительной работы, учитывающая число типов команд и число команд соответствующего типа. Однако свойство аддитивности меры вычислений выполняется для CISC-процессоров и может нарушаться для RISC-процессоров, векторно-конвейерных вычислителей и VLIW- архитектур [27]. Причина заключается в конвейеризации выполнения команд, в их сцепке и в целом в высокой степени параллелизма функционирования устройств вычислительной среды. Введенное в § 2.2 понятие динамического гомоморфизма, сохраняющего длину истории — инварианта выполнения программ, аналогично понятию гомоморфизма динамических систем в [17].
Понятие события часто используется в различных сетевых моделях вычислений [30, 124], хотя трактуется оно по-разному. Например, в сетях Петри [30] и их расширениях [138] события моделируются переходами. В рассмотренных в § 2.3 потоковых моделях характер событий, связанных с формированием входных и выходных сообщений процессов, определяется метками соответствующих позиций вершин. Так, маркировка входных и выходных позиций вершин М-сети может интерпретироваться как число начальных и особых событий, наступление которых ассоциируется с формированием токенов в компонентах входных и выходных сообщений.
При написании § 2.3 использованы работы [49, 53]. Первое упоминание об М-сетях как потоковых моделях, допускающих обмен неоднородными сообщениями, приводится в статьях [48, 152]. Формализация проблемы реализуемости потоковых моделей распределенных программ, заданных М-сетями, дается в [49].
В модели Кана [113] разнородность потоков сообщений не принимается во внимание. Детерминированные модели потоковых вычислений [124, 137], в частности, SDF [122], допускают различие в числе производимых и потребляемых токенов для связанных акторов. Однако проблемы тупиков и ограниченной памяти токенов для акторных моделей в конечном счете связаны с задачей статического планирования исполнения акторов. В акторных моделях упомянутые проблемы становятся алгоритмически неразрешимыми при введении условий «выбор» (select) и «переключение» (switch), поскольку, как доказано в [81], к ним сводится проблема остановки машины Тьюринга.
Система типов, подобная приведенной на рис. 2.10, поддерживается компонентной технологией проектирования программ встроенных систем в проекте Ptolemy II [126] для обеспечения полиморфизма акторов.
Классической задачей, иллюстрирующей возможность как дедло- ка (взаимной блокировки), так и ливлока (отталкивания, голодания, или starvation) взаимодействующих процессов, является задача о пяти обедающих философах, решение которой принадлежит Э. Дийкстре [91]. Отдельные аспекты определения возможности и предотвращения дедлоков, в том числе в коммуникационных средах, рассматриваются в книгах [26, 46].
Глава 3
ОБНАруЖЕНИЕ И ПРЕДОТВРАЩЕНИЕБЛОКИРОВОК РАСПРЕДЕЛЕННЫХ ВЫЧИСЛЕНИЙ
Разметка М-сетей и анализ реализуемостираспределенных вычислений
Анализ свойств программ на размеченных графах. Для распознавания и исследования свойств моделей вычислений и программ широко используются различные графы. Метки, присваиваемые дугам или вершинам графа, представляют интересующие семантические свойства, а сама процедура сопоставления дугам и вершинам меток по заданным правилам называется разметкой графа. Разметка, определяемая иногда как анализ информационных потоков (data flow analysis), является процессом сбора информации о свойствах графа, кодируемых элементами (метками) некоторого множества L. В контексте анализа под информационными потоками понимается не только передача операндов (данных), но и управления, синхронизация параллельных процессов и т. д. Далее понятия разметки и анализа графа будут рассматриваться нами как эквивалентные.
Стандартное окружение для анализа [132] представляет собой следующий набор. Это — структурный граф G = (V, А) программы с множеством V вершин и множеством А дуг. Вершины, как правило, обозначают операторы программы, а дуги из А могут соответствовать передаче данных или управления, а также синхронизации процессов. В некоторых графовых моделях могут присутствовать «разносортные» дуги. Следующий компонент окружения — алгебраическая структура в виде решетки (L,A,V), нижней (Ь,А) или верхней (L, V) полуструктуры семантических свойств, где A, V — операции пересечения и объединения на множестве меток (свойств) из L. Третья составляющая — множество F монотонных функций /: L L, которые называют потоковыми функциями [148] или преобразователями свойств [31]. Функция / монотонна, если (Vx, у Е L) х ^ у f (ж) ^ / (у). Здесь ^ обозначает отношение частичного порядка на L. Наконец, четвертая составляющая окружения для анализа — это частичное отображение
^ х^ F сопоставляющее подмножествам вершин и дуг графа некоторую монотонную функцию /.
Потоковая функция /и может ассоциироваться с определенной вершиной и EV графа G и представлять собой отображение входной информации (меток входящих дуг) в выходную информацию (метки исходящих дуг) вершины и. Пусть /м, Ои Е L являются метками входа и выхода вершины и. Они связаны посредством потоковой функции Ом = = /и (/и). Часто эту связь представляют так называемым потоковым уравнением вида
о и = Л (4) = к Л Ри V Gu. или О и = fu и и) = кРц + Gu, (3.1)
где Ри , G и Е L.
В (3.1) Ри, Gu — параметры, интерпретируемые следующим образом. Выходная информация Ои генерируется вершиной и, что обозначается параметром Gu, или являются частью входной информации (метка /м), сохраняемой при передаче /и на выход, чему соответствует параметр Ри. Нужно заметить, что в общем случае в (3.1) параметр Gu может зависеть от метки /и входа вершины и. Информация 1и поступает на вход вершины и от вершин, принадлежащих множеству Pred (и) вершин-предшественников и, т. е.
С = Л О„ или К = у Ov.(3.2)
vEPred(u)vEPred(u)
В (3.2) фигурирует операция пересечения или объединения в зависимости от постановки задачи анализа и структуры семантических свойств. Таким образом, с графом связывается система из |V| потоковых уравнений вида
Hu:Ou = fu^ /\О„) или Я„ : Ои = fu^ \/О„).(3.3)
vEPred(u)vEPred(u)
Если параметр Gu не зависит от информации 1и на входе вершины и, то уравнения (3.3) могут быть записаны в следующем виде:
Ни"- О и = Ри^ Д Ov^ + Gn или Нп: О и = Ри (^\/ Ov^ EGu.
vGPred(w)vEPred(u)
(3.4)
Разметка графа является стационарной^ если свойства его дуг и вершин, определяемые, в частности, системой потоковых уравнений Ни, и = 1, |V| (3.3) или (3.4), не изменяются никаким применением правил разметки. Правило определяет характер замены меток на отдельных этапах анализа. Например, из двух меток некоторой дуги — ранее ей присвоенной ж и получаемой на очередном шаге анализа у — выбирается метка х Л у либо метка xV у7 где ж, у Е L.
Известны различные постановки и методы решения задач анализа размеченных графов [18, 31, 94, 114, 115, 117, 131, 132, 148]. Например, заданы стандартное окружение для анализа G = (V, Л), (L, A), F, 2У х 2Л -> F и некоторая начальная разметка графа G. Требуется найти стационарную разметку, при которой свойство любой дуги является наибольшей нижней гранью множества допустимых в соответствии с правилами разметки свойств. Задача анализа называется прямой, когда свойства любой вершины определяются свойствами ее предшественников. Если же свойства вершины зависят только от свойств ее преемников, то имеет место обратная задача анализа.
Многие методы анализа основываются на исключении переменных, однозначно соответствующих меткам [148]. Пусть имеют место два потоковых уравнения:
Hv:Ov = fv( Д Ow
wEPred(v)
Исключая переменную Оу из правой части уравнения Ни, получаем
Ни-.Ои = К^Р д ow)).
wE Pred( и)
Это равносильно тому, что в графе исключается дуга (v, и), а вместо нее вводится дуга (w, и).
Для исключения переменных из рекурсивных уравнений используется операция замыкания, позволяющая найти неподвижную точку уравнения. Пусть, например, свойство вершины и описывается уравнением Ну*. Ov = TiOy + Т2 = /у (Оу), где ц и ?2 — термы, не содержащие переменной Оу. Операция замыкания /* приводит к уравнению Нг1 : Оу = /* (Оу). Методы вычисления /* известны для различных задач анализа. Неподвижная точка Оу существует, если потоковая функция является монотонной, а решетка свойств не содержит бесконечных строго убывающих цепей [115, 117] (последовательность x,y,z, . . ., где х, у, z, . . . € L, называется строго убывающей цепью с началом в х, если х > у > z > . . ., где > обозначает отношение частичного порядка на L).
Методы анализа. Кратко рассмотрим ключевые положения, которые лежат в основе двух подходов к анализу графов на основе исключения переменных. Пусть модель вычислений представлена потоковым графом на рис. 3.1, а.
Допустим, вершины представляют операторы, а дуги — передачу управления. В графе выделяются две вершины — начальная В и конечная Е. Вершина В представляет точку входа, а вершина Е — точку выхода из программы.
Рассмотрим прямую задачу анализа, когда входная информация любой вершины определяется через объединение свойств выходов
вершин-предшественников. Метод так называемого исчерпива/кпцего (exhaustive) анализа [94, 148] позволяет получить такое решение, что
► — дуга потокового графа
_ _ _ _^ D-дуга
------ _ j-дуга
В — начальная вершина
Е — конечная вершина
Рис. 3.1. Различные формы потоковых графов
метка выхода вершины и графа полностью определяется параметрами Ри, Gu вершин, непосредственно доминирующих вершину и.
Вершина и Е Pred (и) доминирует вершину и тогда и только тогда, когда все пути от начальной вершины В к вершине и проходят через вершину и. Отношение доминирования является рефлексивным и транзитивным. Оно может быть представлено деревом доминирования,
или D-деревом. На рис. 3.1, б показано D-дерево, соответствующее исходному потоковому графу на рис. 3.1, а. Говорят, что вершина и непосредственно доминирует вершину щ если в D-дереве существует дуга (и, Ер Так, вершина В непосредственно доминирует вершины Е и 1, вершина 1 непосредственно доминирует вершины 2, 3, 4 и т. д. (см. рис. 3.1, б). Формой, занимающей промежуточное положение между потоковым графом и D-деревом, является DJ-граф (рис. 3.1, в). По сути это D-дерево, дополненное J-дугами, которые вводятся между парой вершин D-дерева, если ни одна из них непосредственно не доминирует другую. Так, на рис. 3.1, в J-дугами являются дуги (2, Е^ (2, 4), (8, ГУ) и т. д.
Основные этапы исчерпывающего анализа состоят в следующем: 1) преобразование по определенным правилам DJ-графа в D-дерево [94];
упрощение на основе исключения переменных системы потоковых уравнений, записанной для исходного потокового графа;
«распространение» решений потоковых уравнений от корня D-дерева к остальным вершинам.
После первого и второго этапов анализа информация на выходе любой вершины определяется через выходную информацию вершин, которые непосредственно доминируют рассматриваемую вершину. Поясним это на примере.
Исходная система потоковых уравнений для графа на рис. 3.1, а имеет следующий вид:
Н°: OB = G°B,
HP O4 = P?OB + GP
нр О2 = Р°О1 + СР
HP О-Л = Р3 (О7 + О8) + 0°,
Н»: О4 = Р^ (О2 + Оз + О7) + О^,
HP O5 = P®O4 + G®,
HP O6 = PgO4 + Og,
нр О7 = Р7°(О5 + О6) + О?,
нр. о8 = р»о7 + ср
Нр. ОЕ = Р°Е (Ов + О2 + О8) + GE.
В этих уравнениях используются символы, смысл которых разъяснен ранее: О — выходная информация; Р, G — параметры сохранения и генерации информации. После исключения переменных исходные потоковые уравнения трансформируются следующим образом:
#Г OB = G°B,
Hf: O1 = P®OB + G®,
Н^ : О2 = Р^Ог + G°,
Г : Оз = Р^Ог + (лллл + Р№^О4+
+ P»P»P7°G°ti + P^P^P^G® + P«P»G°7 + P»G» + G», H[: O4 = P4P',O\ + kplpsp8p7pb + ГГГР7бЬОл +
+ P^P^P^P^G^ + P^P^PsP^Gq + Рр^РЩН
+ P^P^G» + РЩ" + G4 ит.д.
Заметим, что уравнения Нд и Н4 зависимы, причем уравнение Н4 является рекурсивным. Это объясняется циклами в программе, граф которой показан на рис. 3.1, а. Наличие дуги (7, 4) при том, что вершина 4 непосредственно доминирует вершину 7, обуславливает рекурсив™ ность уравнения Hf. Наличие дуги (8, 3) при том, что вершина 7 непосредственно доминирует вершину 8, приводит к зависимости уравнения Н^ от уравнения Hf. После выполнения операции замыкания этих двух уравнений результирующие уравнения для вершин 3 и 4 в качестве переменной должны содержать информацию на выходе вершины 1, которая непосредственно доминирует вершины 3, 4 (см. рис. 3.1, б). После замыкания уравнения Н4 можно записать уравнение Нв для конечной вершины Е, которое будет содержать одну переменную О в •
Параметр G°B является решением уравнения Нв. Вершина В не имеет предшественников, информация на ее выходе генерируется самой вершиной В и является входной информацией для вершин 1 и Е. Решением уравнения Н^ является комбинация параметров P^G°B + + G^. Это решение «распространяется» по D-дереву к вершинам 2, 3, 4 и т. д.
Задача инкрементального (incremental) анализа формулируется следующим образом [94, 148]. Пусть для заданной программы получено корректное решение системы потоковых уравнений, например, методом исчерпывающего анализа. Выделим изменяемые части (параметры) этого решения, отражающие соответствующие изменения в программе, в частности, введение или удаление связей по управлению или данным, представленных дугами потокового графа. Требуется после частичных (инкрементальных) изменений параметров решения получить новое решение соответствующей системы потоковых уравнений, не производя для нее полного «пересчета». Это и определяет суть анализа как инкрементального: обновляются лишь те решения, на которые воздействуют частичные модификации потокового графа либо параметров какого-либо исходного уравнения Н^ для некоторой вершины и. Например, результирующее уравнение для вершины 7 потокового графа на рис. 3.1, а после второго этапа исчерпывающего анализа приобретает следующий вид:
Н7: О7 = P7fO4 + Gf,
где Pf = Р^Р» + Р^Р^ G7 = Р^ + P7°Gg.
Таким образом, результирующие параметры Р^ и G^ зависят от исходных параметров Р^ G^ и Р® , G^ вершин 5 и 6. Следовательно, изменение параметров этих вершин повлияет на параметры вершины 7 и вид решения потокового уравнения. Соответственно изменяются и решения других уравнений, в которые входят параметры Р^ G®, Р^ G^. Однако при этом не нужно воспроизводить всю процедуру решения исходной системы уравнений, чтобы эти изменения учесть.
До сих пор мы предполагали, что дуги потокового графа являются однотипными и представляют либо передачу управления, либо передачу операндов и т. п. В так называемом ^-кратном окружении для анализа [132] потоковый граф программы может содержать к типов дуг. На рис. 3.2 приведен пример такого графа.
Этот граф представляет программу из двух задач (линейных участков, состоящих из операторов 1, . . . , 4 и 5, . . . , 8), которые могут вы-
► — дуга управления
---► — дуга
синхронизации
- - - - ► — дуга завершения выполнения
Рис. 3.2. Потоковый граф с тремя типами дуг для анализа в 3-кратномокружении
подняться параллельно. Дуги управления упорядочивают выполнение операторов каждой задачи. Частичный порядок выполнения операторов программы устанавливается с помощью дуг синхронизации, которые вводятся между вершинами, соответствующими Р- и V-операциям над бинарными семафорами si и s2 (на рис. 3.2 — вершины 2, 5 и 8, 3).
Напомним, что для решения проблемы взаимного исключения критических интервалов Дийкстра [12] предложил специальные переменные, называемые семафорами, и две операции Р и V над ними. Семафор s принимает целые неотрицательные значения, в частности может быть бинарным. Операция V присваивает s значение s+1. Если s 0, то операция Р уменьшает s на единицу, и процесс продолжается; если s=0, то Р не изменяет значения s до тех пор, пока другой процесс не увеличит значение s с помощью операции V. Если один из процессов начинает выполнять Р- или V-операцию над семафором, то другой процесс не может
изменить значение этого семафора до тех пор, пока первый процесс не завершит Р- или V-операцию либо не будет приостановлен при попытке выполнить P-операцию над семафором s=0. Таким образом, семафоры позволяют синхронизировать действия параллельных процессов.
Так, при выполнении программы, граф которой показан на рис. 3.2, благодаря синхронизации оператор 2 всегда начинает выполняться раньше оператора 6, а оператор 8 — раньше оператора 4. Кроме того, в графе на рис. 3.2 показаны транзитивные дуги между вершинами, обозначающими операторы 2, 6 и 8, 4. С помощью этих дуг обеспечивается завершение выполнения тех операторов, которым предшествуют Р- и V-операции над семафорами. Оператор 2 устанавливает семафор si, но не может непосредственно обусловить завершение выполнения оператора 6. Поэтому вводится специальная дуга (2, 6). По аналогии дуга (8, 4) символизирует завершение выполнения оператора 4 после изменения V-операцией (оператором 8) значения семафора s2. Таким образом, граф на рис. 3.2 содержит дуги трех типов. Следовательно, для каждой его вершины могут существовать три типа источников входной информации, являющейся передачей управления, синхронизацией или завершением выполнения. Это приводит к необходимости введения А:-кратного окружения для анализа (в данном случае к = 3). В таком окружении можно ставить и решать ряд задач анализа графов параллельных программ [132], когда результат выполнения какого- либо оператора зависит от типа входной информации. В окружение для анализа вводится множество Ък семантических свойств, состоящее из ^-наборов элементов множества L. Решение задачи анализа, как правило, является неподвижной точкой А:-кратного окружения.
Постановка задачи разметки М-сетей. Рассмотрев некоторые общие подходы к анализу потоковых графов программ, конкретизируем методы анализа с учетом особенностей распределенных вычислений, характерных для масштабируемых систем. М-сеть как специальный вид потокового графа G (см. § 2.3) соответствует модели распределенных вычислений, в которой процессы взаимодействуют посредством асинхронного обмена сообщениями через буферы. Как уже говорилось, процессы могут иметь как входные, так и выходные либо только входные буферы. Семантически обе модели эквивалентны. Проблема блокировки, или реализуемости потоковых моделей, заключается в таком согласовании параметров буферов (очередей сообщений), чтобы учесть все допустимые истории процессов программы, когда ни один из них не блокируется из-за отсутствия входных сообщений. Исследование реализуемости вычислений может быть сведено к процедуре разметки М-сети. Напомним, маркировка входных и выходных позиций вершин М-сети соответствует ширине буфера (см. рис. 2.6 и рис. 2.7), а метки дуг позволяют получить число сообщений (или глубину буфера), гарантирующее отсутствие «зависаний» программы при любых допустимых историях процессов.
Стационарную разметку будем называть неизбыточной^ если метки дуг и вершин являются наименьшими из возможных.
Пусть Ev — подмножество информационных дуг множества А дуг М-сети, инцидентных вершине и Е V М-сети, где е^ЕЕ^ eout Е Ev — соответственно входящая и исходящая дуги, или вход и выход, вершины и. При этом | У | = К, где К — число операторов программы. Обозначим через ц (е;пД число аргументов в г-м буфере — метку входа Cjni, инцидентного г-й входной позиции с маркировкой 1щ. Глубина г-го буфера входных сообщений процесса, которому соответствует вершина и^ равна d (v) = р, (е^Д /in^ (Ми Е V) (Mi Е {1, . . . , 6}), где b — количество входных буферов. Пусть р (eoutj) — число результатов в j-м выходном буфере (метка выхода eoutj., инцидентного J-й выходной позиции вершины и Е V с маркировкой out^ (и)). Тогда глубина j-ro выходного буфера равна d (и) = р (eoutj) /outy (и) (Ми Е V) (Mj Е {1, . . . , с}), где с — количество выходных буферов. Наличие альтернатив в развитии вычислений (на рис. 2.6, а — передача сообщения либо у^ либо (xi,.. . , Х4), а также альтернативная передача управления от и 5) обуславливает более одной метки дуги. Информационные дуги, инцидентные точке входа в цикл (дуги ж, а. на рис. 2.6, а), размечаются после эквивалентного преобразования М-сети (обсуждаемого ниже в этом же параграфе).
Рассмотрим два маркированных потоковых графа ОД и G^. Пусть Уъ У2 — множества вершин, Л1, Л2 — множества дуг графов Gi, G^ соответственно, a g — однозначное отображение У1 в V^ причем (V («1, 6Д Е ЛД 3 (g (0,1) , g (61)) Е Л2. Таким образом, g — гомоморфизм [43] ОД в G2.
Определение 3.1. Допустим, g есть гомоморфизм Gx в G^. При этом Gx и G2 имеют одинаковую маркировку соответствующих дуг («1,61) Е Л1 и (g (аД , g (61)) Е Л2, задаваемую функциями разметки (Т1 : Л1 Lout х Lin, сг2 : Л2 Lout х Ljn. Тогда графы Gx и G2 называются равносильными.
Пусть G' — бесконтурный маркированный потоковый граф с множеством V вершин и семейством Е С У2 дуг. (Заметим, что G' в общем случае является мультиграфом, в котором различным позициям одной и той же вершины соответствуют различные входящие либо исходящие дуги.) Определим порядковую функцию О (ж), и Е У, графа G\ задающую разбиение множества V вершин по L уровням [32]. Обозначим через Г (жД = ^Uj \uj Е У, (и^ и^ Е Е} образ вершины щ Е Е У. Ее прообраз обозначим через Г™1 (жД = ^и^ \^k Е У, (и k, и^ Е Е]. Образ Г (жД и прообраз Г™1 (жД образуют окрестность вершины и^, единичного радиуса.
гис Дк,к=1гис Дк,к=1VkcvVkcvУровень есть множество вершин вида
гис Дк,к=1
гис Дк,к=1
Vkcv
Vkcv
Vt = и Е У \ U Vb
1/с = 1
где / = !,...,£, причем Vi = {v | и Е V^ Г (v) = 0 }, a Vl = |^| v €
€ V \ IJ И, Г (v) С IJ VA. Здесь L — наименьшее целое число такое, i=ii=i J
что множество прообразов вершин уровня L является пустым.
При этом О (и (/)) = I и (I) Е V[.
Разумеется, можно задать другой порядок уровней:
И =€ У \ У Vkl Г™1 (г;) С У Vk. VkCV
I k=1k=1
где / = !,...,£, причем Vi = {v | v E V^ Г™1 (v) = 0}, a Vl = .L — XL — X x
= < v | v E V \ |J Vi^ Г™1 (v) C |J И L Будем считать, что при этом 1=Х1=Х
определена порядковая функция О (и), обратная О ^и\
Определение 3.2. Бесконтурный маркированный потоковый граф G' = (V, Х\¥^ Е р\ а1^ где Е С Y х X' — множество дуг, |£7| = = |Л|, А — множество дуг равносильного G' потокового графа G, X С С X', р'; (Xf UK) 0 V, ст': Е Lout х L,n, с заданной посредством порядковой функции нумерацией уровней / = !,...,£ будем называть L™уровневой сетью.
В графе G\ равносильном графу G, сохраняется та же маркировка начал и концов дуг, что и в G, а контуры размыкаются в slt-позициях вершин. Так, М-сети на рис. 2.6, б соответствует трехуровневая сеть, получающаяся при размыкании контура по дуге а, инцидентной позиции slti (рис. 3.3). Уровни сети — это подмножества вершин {mi, m2},
Рис. 3.3. Трехуровневая сеть
{fs}, {m3, тд}. Исходная М-сеть (см. рис. 2.6, б) и трехуровневая сеть на рис. 3.3 являются равносильными согласно определениям 3.1, 3.2.
Если уровни нумеруются от выходов ко входам G\ то считается заданной прямая порядковая функция О (v), при нумерации от входов
к выходам Gf — обратная функция О (v). Понятно, что для любого потокового графа G существует равносильная ему L-уровневая сеть G'. Бесконтурный граф G превращается в сеть G' при задании соответствующей порядковой функции. Положим, G содержит контуры. Раскроем все контуры графа G в slt-позициях вершин. Вновь полученный бесконтурный граф является гомоморфным образом графа G. При сохранении той же маркировки концов дуг, что и в G, полученный граф по определению 3.1 является равносильным G. При задании соответствующей порядковой функции получаем L-уровневую сеть G\ равносильную графу G.
Теперь поясним, почему равносильное преобразование исходного потокового графа G, в том числе М-сети, в бесконтурную сеть G\ яв-
б
Рис. 3.4. Эквивалентные преобразования М-сети
ляется семантически корректным. Рассмотрим М-сеть с циклическим выполнением метаоператора т и теста t (рис. 3.4, а).
Раскроем цикл, проитерировав N раз пару (m,t) и сохранив маркировку всех позиций вершин т и t, в том числе и метку in входной позиции метаоператора т (рис. 3.4, б). Интересующие нас свойства М-сети мы описываем метками дуг и вершин, которые должны быть выявлены в процессе разметки и которые зависят от маркировки входных и выходных позиций вершин (концов и начал дуг). Очевидно, что метки вершин т, t и соответствующих дуг в 2 TV-уровневой М-сети на рис. 3.4, 5 и в двухуровневой М-сети на рис. 3.4, в будут кратными. Поэтому допустимо сведение разметки исходной М-сети (см. рис. 3.4, а) к разметке равносильной ей бесконтурной сети (см. рис. 3.4, в). Из этого примера также должно быть понятным различие между циклическим, Ж кратным выполнением операторов и возможным d- кратным «участием» некоторого оператора в выполнении программы, где d — глубина буферов соответствующего процесса, или метка вершины М-сети (см. рис. 2.11). Итак, разметка любой М-сети может быть сведена к разметке равносильной бесконтурной L-уровневой сети.
Пусть (L^,^) — частично упорядоченное множество меток дуг (число операндов в буферах), на котором определена операция объединения V, обладающая свойствами идемпотентности, коммутативности
и ассоциативности. Отношение порядка ^ таково, что (Уж, у Е LB) ж ^ ^ у О х V у = ж, причем ж > у О (х V у = ж) & (ж ф у). Метки вершин (Lv, ^), каждая из которых суть глубина буферов соответствующего процесса, также частичны упорядочены и однозначно определяют™ ся свойствами смежных дуг. По аналогии с верхней полуструктурой свойств дуг (LB, V) определяется верхняя полуструктура приведенных свойств вершин (Lv, V)-
Пара монотонных функций приведения свойств фп: LB х Lin
-л Lv, SOut: Ije х Lout ^ Lv сопоставляет смежным входам либо вы™ ходам одно и то же свойство вершины (глубину буферов). Для смеж™ ных входов либо выходов определена монотонная функция разметки fin: Lv х Lin LB либо /out: Lv x Lout ЪЕ.
Рассмотрим конкретный вид функций приведения и разметки для М-сети. Пусть г [•] обозначает наименьшее общее кратное. Если iny — метка входной позиции, где j = 1, . . . , В, которой инцидентен ветвя™ щийся выход метаоператора т (mi на рис. 3.3), a out (m) — метка его выходной позиции, то все выходы, инцидентные frk-позиции, имеют метку
Г (eOut) Г [г [out (m,), ini] , г [out (т), inB]] •
Функция приведения свойств по выходам — это глубина буферов 5out (д (eout) , out (ж)) = d (ж) процесса, которому соответствует верши™ на и. Эта функция обобщается и на случай, когда у метаоператора больше одной выходной позиции. Для теста эта функция определяется для каждого из альтернативных выходов. Пусть оиП, где г = 1, . . . , В\ является меткой выходной позиции вершины и^ которой инцидентен вход в{ вершины г). Глубина буферов процесса, которому соответствует вершина ж, есть
d (ж) ^ г [г [outi, ini] / ini, . . . , г [outB/, inB/] /inB/] .
Метка любого из входов вершины г) есть у (еД = d (ж) 1щ, а функция приведения свойств по входам — фп (д (еД, 1пД = d (ж) ф/г Е {1, . . .
Функции разметки по входам и выходам имеют вид Дп (д(ж), 1пД = = d (ж) in^ /out (д (ж) , out (ж)) = d (у) out (ж).
В М-сети функции приведения определяют глубину буферов, с учетом которой функции разметки «переносят» свойства выходов на входы или наоборот. Это позволяет построить правила разметки, учитывающие свойства всех достижимых из вершины и (I) вершин, а также свойства вершин, из которых достижима вершина г) (/). Через приведение свойств дуг учитывается взаимное влияние вершин, находящихся в отношениях прямого или обратного транзитивного замыкания с вершиной г) (/), но не находящихся в этих отношениях друг с другом, что обеспечивает глобальный анализ сети.
Зададим правила замены меток дуг из Ev и вершины ж, учитывая, что на верхней полуструктуре свойств р-е применение любого правила
разметки приводит к замене метки дуги или вершины ^р ^ (•) на не меньшую метку ц^ (•):
Л1:(eOut), out) V (и) =(v)
/тЩр) (У in) V (ein) = Ц^ (ein) ,
«2: Щ^”1) (ein), in) уЩ"1’ (У) =
=> /оДУ91 (0, out) V Щ-1) (eOut) = Щ1 (eOut),
где ein, eout € £y, in € Lin, out € Lout, p ^ 1, q ^ 1, p + q.
Стационарной является такая разметка, когда д (е) gL^ (Ve G Е^ и д (v) G Ly (W G V) не изменяются никаким применением правил R1, R2, причем
(Vv G V)(Vein,eout G Ev) 5in (д (ein), in) = 5out (д (eout), out) = d^v).
Стационарная разметка является неизбыточной, если свойство любых дуги или вершины есть наименьшая верхняя грань множества их допустимых свойств.
Пусть заданы верхние полуструктуры свойств дуг (L^V) и вершин (Ly, V), функции приведения и разметки, правила RI, R2 замены меток, а также некоторая начальная разметка дуг М^ и вершин Му . Задача анализа реализуемости потоковой модели распределенной программы, заданной М-сетью G, сводится к установлению существования стационарной и нахождению неизбыточной разметки L-уровневой сети G’, равносильной G.
Стационарность и неизбыточность разметки. Свойство уровня Vi, такого что | V/1 = п представим вектором М (/) = = (Ml,..., М^, где Mj = (^ (Щ М (EV])}, j = 1,... ,п; ц (vj) — метка вершины vj, а М (EVj^ — множество меток ее входов и выходов Ev ; I = 1, . . . , L. Разметка сети — это набор свойств уровней М = (М (1) , . . . , М (ЬУ). Начальное свойство уровня обозначим М^ (/) = (М-^, . . . , М^У причем (Vj G {1, . . . , ?г}) мр = V0) b’jV (у)), А‘(0) (ч) е МС м№ (£«J МЕ0)-
Схемой посдедователиного анализа свойств сети (ПАСС) назовем определение свойств уровней в соответствии со следующими процедурами:
анализ свойств (проход) начинается с уровня, у которого отсутствуют либо преемники, либо предшественники;
если задана функция О (v), то реализуется первый проход от уровня 1 к уровню L, определение свойств в уровне I по правилу R1, возвращение к уровню I от предшественников в уровнях I + 1, . . . , L и приведение свойств в /-м уровне по правилу R2;
после достижения уровня L реализуется второй проход от предшественников к преемникам, определение свойств в уровне I по правилу R2, возвращение к уровню I от преемников в уровнях / — 1, . . . , 1 и приведение свойств в уровне I по правилу R1.
Шагом ПАСС будем называть определение свойства уровня по правилам R1 или R2.
Теорема 3.1. Достигнутая разметка сети G' является стационарной тогда и только тогда, когда свойство любого уровня не изменяется после L + 1 шагов ПАСС при любой начальной разметке.
Доказательство. Пусть определена функция О (Д. Пусть достигнутая разметка является стационарной. При первом проходе свойство уровня I может измениться однажды в соответствии с правилом R1 и L-1 раз по правилу R2 из-за приведения свойств предшественников. При втором проходе свойство уровня I может измениться однажды по правилу R2 и / — 1 раз по правилу R1 из-за приведения свойств в уровнях / — !,...,!. Следовательно, при любой начальной разметке свойство /-го уровня не должно изменяться после (1 + £ — ™ /) + (1 + / — 1) = L + 1 шагов.
Докажем, что если после L + 1 шага ПАСС свойство какого-либо уровня изменяется, то стационарная разметка вообще не достигается. Пусть реализуется второй проход. Допустим, вершина v (/), где / > 1, имеет преемников в уровнях 1, ...,/ — 1. Метку любой из инцидентных ей дуг, полученную при первом проходе, обозначим ц^ (е), где е Е Е Ещр а после разметки при втором проходе без возвращений к /-му уровню — Ц^ (е). В силу МОНОТОННОСТИ функций Sin,Sout И /in, /out при р-й разметке уровня ^(р-1) (е) ГдС 2 < р / — — 1. Предположим, что после приведения свойств преемников уровня ls 1 найдется такая вершина v (/), что рАЕ ^ > рДШ (е), где р обозначает переразметку из-за преемников по правилу R1. Зафиксируем р и проведем переразметку уровней с (/ — 1)-го по /5-й по правилу R2. В силу монотонности функций Sin, ^out,/in,/out в уровне ls найдется вершина v (ls) такая, что р^ (es) > р^ (es), где es Е Ev(isp Тогда если после возвращения от уровня ls к уровню / с применением правила R1 д<Т+1) (е) > рАЕ ^е^ то процесс разметки никогда не может закончиться. Значит, если после / шагов при втором проходе с возвращениями свойства уровня / изменяются, то стационарная разметка не достигается. Поскольку число разметок уровня / при первом проходе с возвращениями не превышает 1 + £ — /, то стационарная разметка недостижима, если свойство /-го уровня изменяется после £ + 1 шагов ПАСС. _
При задании порядковой функции О (v) доказательство теоремы проводится аналогично. Изменяется лишь на противоположную последовательность применения правил RI, R2. Теорема доказана.
Таким образом, теорема 3.1 устанавливает критерий стационарности разметки. Стационарной разметки может и не существовать,
т. е. потоковая модель является нереализуемой, что означает возможность блокировки вычислений. Соответствующие примеры приводятся в § 3.2.
Поскольку функции 5jn, 5Out? /in? /out монотонны, то множество разметок уровня /, достижимых из начальной разметки М^ (/), образует цепь, длина которой конечна, если стационарная разметка существует:
ЛТО) (Z) < Mw (Z) < М^ (/)<...< Mw (Z),
где t ^ L + 1.
При этом М^ (/) — верхняя грань этого линейно упорядоченного множества. Пусть in(e), out(e) — метки входной и выходной позиций, которым инцидентна дуга е Е Е М-сети. Если начальная разметка каждого уровня минимальна, т. е. (Ve G Е) д (е) = г [in (е) , out (е)], (Vu Е V) р (u) = d (и) = 1, за исключением процессов, не участвующих в альтернативах вычислений, то стационарная разметка М-сети является неизбыточной.
Временную сложность алгоритмов ПАСС определим как функцию от числа шагов разметки уровней. Пусть задана порядковая функция О (и). Поскольку число шагов разметки уровня I при первом проходе составляет ! + £ — /, то для разметки сети достаточно числа шагов, не превышающего суммы членов арифметической прогрессии £(£ + 1)/2. Для разметки сети при втором проходе — это та же величина, поскольку для разметки /-го уровня достаточно / шагов.
Если при повторной переразметке любого из уровней Vi его свойство строго возрастает, так что (Зи (/) € И) р^ (и (/)) > рА8™1^ (и (/)), где индекс s — 1 учитывает приведение свойств преемников или предшественников, то стационарной разметки не существует. Таким образом, для установления достижимости стационарной разметки необходимы третий и четвертый проходы. Поэтому общее число шагов разметки не превышает 2£ (£ + 1). Следовательно, алгоритмы ПАСС обладают квадратичной асимптотической временной сложностью.
§3.2. Примеры разметки М-сетей
Разметка элементарных фрагментов. На рис. 3.5 приведены примеры разметки элементарных фрагментов М-сетей по схеме ПАСС: последовательной ветви (рис. 3.5, а), ветвления в frk-позиции (рис. 3.5, б), альтернативного слияния в slt-позиции (рис. 3.5, в) и условного ветвления в swh-позиции (рис. 3.5, г).
На рис. 3.5, а под шагом понимается получение метки дуги соответствующего уровня. В значках □ показаны последовательно получаемые метки дуг, которые кратны числам передаваемых и принимаемых метаоператорами mi, m2 токенов. В итоге на шаге 5 достигаются стационарные и неизбыточные свойства вершин, а именно значения глубины буферов процессов: di = 1,(/2 = 2. При разметке ветвления (см. рис. 3.5, б) все дуги, инцидентные frk-позиции, получают одну
ааda — X, db—^da — X, db—^
а
а
da — X, db—^
da — X, db—^
Рис. 3.5. Разметка фрагментов М-сети
и ту же метку 6. При разметке фрагментов с sit- и swh-позициями (см. рис. 3.5, в, а) получаются альтернативные варианты (а, 6, с, е на рис. 3.5, 6, г обозначают альтернативные дуги для передачи токенов).
Разметка параллельных ветвей. На рис. 3.6 даны примеры разметки дуг сетей с параллельными ветвями в соответствии со схемой ПАСС. Так же, как и на рис. 3.5, а, шаг ассоциируется с присвоением метки дуге, а в значках □ приведены стационарные метки дуг.
Разметка является фронтальной, поскольку позволяет получать свойства дуг и вершин в пределах целого уровня. Рассмотрим подробнее процедуру разметки сети на рис. 3.6, а. Исходная маркировка позиций вершин: in (mi) = 3, outi (mi) = 1, out2 (mi) = 2, in (m2) = 3, out (m2) = 1, in (m3) = 2, out (m3) = 2. Обозначим метки начала дуги е и концов дуг а, b соответственно через out (ж) = 3 и in (^/1) = 1, in (7/2) = = 2. Начальная разметка дуг отсутствует (символ -).
Ш аг 1. Метки дуг а, Ь:
дС) (а) = г [in ^уТ^ out (m2)] = г [1,1] = 1;
= Т [in (у2), out (m3)] = г [2, 2] = 2.
(пи)] = г [1-3/1,1] =3;(пи)] = г [1-3/1,1] =3;Шаг 2. Метки дуг с, d:
(пи)] = г [1-3/1,1] =3;
(пи)] = г [1-3/1,1] =3;
= г (а) • in (m2) /out (m2), outi
Шаг 1Шаг 1ШагДугаа b c d е112---21 2 3 2 -31 2 3 6 -41 6 3 6 -51 6 3 6 961 6 3 6 971 6 3 6 9ШагДугаа b c d е112---21 2 3 2 -31 2 3 6 -41 6 3 6 -51 6 3 6 961 6 3 6 971 6 3 6 9Шаг 6 Шаг 3 Шаг 2Шаг 6 Шаг 3 Шаг 2Шаги 4, 5 Шаг 7 —►бШаги 4, 5 Шаг 7 —►бШагДугаа b с d е13 - - - -23 2 3 --33 2 3 2 243 2 3 2 253 6 3 2 263 6 3 6 279 6 3 6 2ШагДугаа b с d е13 - - - -23 2 3 --33 2 3 2 243 2 3 2 253 6 3 2 263 6 3 6 279 6 3 6 2Рис. 3.6. Разметка параллельных ветвей с процедурой приведенияРис. 3.6. Разметка параллельных ветвей с процедурой приведенияШагДугаа Ъс d е13 ----23 23 - -33 63 - -49 63 - -59 63 6 269 63 6 279 63 6 2ШагДугаа Ъс d е13 ----23 23 - -33 63 - -49 63 - -59 63 6 269 63 6 279 63 6 2
Шаг 1
Шаг 1
Шаг
Дуга
а b c d е
1
12---
2
1 2 3 2 -
3
1 2 3 6 -
4
1 6 3 6 -
5
1 6 3 6 9
6
1 6 3 6 9
7
1 6 3 6 9
Шаг
Дуга
а b c d е
1
12---
2
1 2 3 2 -
3
1 2 3 6 -
4
1 6 3 6 -
5
1 6 3 6 9
6
1 6 3 6 9
7
1 6 3 6 9
Шаг 6 Шаг 3 Шаг 2
Шаг 6 Шаг 3 Шаг 2
Шаги 4, 5 Шаг 7 —►
б
Шаги 4, 5 Шаг 7 —►
б
Шаг
Дуга
а b с d е
1
3 - - - -
2
3 2 3 --
3
3 2 3 2 2
4
3 2 3 2 2
5
3 6 3 2 2
6
3 6 3 6 2
7
9 6 3 6 2
Шаг
Дуга
а b с d е
1
3 - - - -
2
3 2 3 --
3
3 2 3 2 2
4
3 2 3 2 2
5
3 6 3 2 2
6
3 6 3 6 2
7
9 6 3 6 2
Рис. 3.6. Разметка параллельных ветвей с процедурой приведения
Рис. 3.6. Разметка параллельных ветвей с процедурой приведения
Шаг
Дуга
а Ъ
с d е
1
3 -
---
2
3 2
3 - -
3
3 6
3 - -
4
9 6
3 - -
5
9 6
3 6 2
6
9 6
3 6 2
7
9 6
3 6 2
Шаг
Дуга
а Ъ
с d е
1
3 -
---
2
3 2
3 - -
3
3 6
3 - -
4
9 6
3 - -
5
9 6
3 6 2
6
9 6
3 6 2
7
9 6
3 6 2
д^ ((/) = г [д^ (6) • in (m3) /оиДтз), out2 (mi)] = г [2 • 2/2, 2] = 2.
Ш аг 3. Для согласования глубины выходных буферов метаоператора mi выполняется процедура приведения по выходам
d (mi) = г р) (с) /outi(mi), ц^ (d) /out2 (mi)] = г [3/1, 2/2] = 3
и переразмечаются дуги с, d:
ц^ (с) = d (mi) - outi (mi) = 3-1 = 3;
д(2) (с) = d (mi) • out2 (mi) = 3-2 = 6.
Ш аг 4. Переразмечаются выходы преемников mi:
р^ (а) = р^ (с) • out (m2) /in (m2) = 3 • 1/3 = 1;
д(2) (6) = ц^ (d) • out (m3) /in (m3) = 6 • 2/2 = 6.
Ш ar 5. Метка дуги e:
p^ (e) = r ^p^ (c) • in (mi) /outi(mi), out (ж)] = r [3 • 3/1, 3] =
= r ^p^ (d) • in (mi) /out2(m2), out (ж)] = r [6 • 3/2, 3] = 9.
Далее осуществляется переразметка дуг от входов к выходам сети. Шаг6.р^(с)=р^ (е) • outi (mi) /in (mi) = 9• 1/3 = 3;
p^(d)=p^ (e) • out2 (mi) /in (mi) = 9• 2/3 = 6.
Шаг7.p^(a)=p^ (c) • out (m2) /in (m2) = 3 •1/3 = 1;
p^(b)=p^ (d) • out (m3) /in (m3) = 6 •2/2 = 6.
В общем случае при проходе от входов к выходам сети метки дуг могут изменяться (см. рис. 3.6, б-). Для согласования глубины вход™ ных буферов метаоператора т3 на рис. 3.6, б выполняется процедура приведения по входам на шаге 5, переразмечаются входы предшественников mi, m2 (шаг 6). Заметим, что процедура приведения по входам может быть выполнена и сразу после шага 2 (см. рис. 3.6, в). Тогда на шаге 4 необходимо переразметить дугу а. Несмотря на такую перестановку шагов, достигается та же стационарная разметка, что и для случая, показанного на рис. 3.6, б. Таким образом, возможны различные варианты (алгоритмы) реализации схемы ПАСС, учитывающие особенности структуры сети, но стационарная и неизбыточная разметка единственна. Значения глубины буферов, соответствующие стационарной разметке в рассмотренных примерах: d(mi) = 3, (/(m2) = = 1, d (m3) = 3 (см. рис. 3.6, a); d (mi) = 6, d (m2) = 1, d (m3) = 3 (cm. рис. 3.6, б, в).
Альтернативные разметки. Наличие альтернатив в вычислениях приводит к различным разметкам М-сети. Альтернативы в М-сетях реализуются с помощью sit™ и swh-позиций вершин, причем последние ассоциируются только с тестами. Точкой входа в цикл яв™ ляется slt-позиция (на рис. 2.6, б, рис. 3.3 — позиция slti). Напомним, что семантика slt-позиций для организации циклов и альтернативно™ го выбора в развитии вычислений различна. Альтернативные выбор sit и переключение swh являются аналогом булевой функции исклю™ чаюи^ее ИЛИ. Смысл введения slt-позиции для организации циклов иной: соответствующий процесс может быть инициирован данными,
передаваемыми по обоим альтернативным входам. Таким образом, здесь имеет место аналог булевой функции ИЛИ. Это и объясняет допустимость эквивалентного преобразования М-сети с циклами путем перехода к равносильной ей бесконтурной L-уровневой сети, о чем шла речь в § 3.1. Следовательно, альтернативные разметки М-сети обусловлены в общем случае наличием slt-позиций для альтернативного выбора и swh-позиций для альтернативного переключения потоков данных. Так, существуют четыре различных разметки М-сети, показанной на рис. 3.3. Результаты даны в табл. 3.1. Альтернативы
Таблица 3.1
Примеры альтернативных разметок М-сети
Альтернатива вычислений
Глубина буферов
mi
m2
Ш3
Ш4
^5
у’1’
2
6
3
-
6
4
12
6
-
12
у’О’
1
3
-
3
3
г’О’
4
12
-
12
12
развития процессов обозначены комбинацией соответствующих дуг для передачи токенов y,z^ ’1’, ’О’. Символ - в табл. 3.1 означает, что процессы, которым соответствуют метаоператоры m3, тд, не участвуют в соответствующей альтернативе вычислений.
Рассмотрим более подробно процедуры получения двух альтернативных разметок y^V и Л(У по схеме ПАСС для М-сети на рис. 3.3. Будем считать, что задана прямая порядковая функция, т. е. уровни нумеруются от выходов ко входам сети. В табл. 3.2 и табл. 3.3 приве-
Таблица 3.2
Пошаговая разметка для альтернативы у'!'
Шаг ПАСС
Уровень М-сети
Глубина буферов
Шх
Ш2
т^
Ш4
^5
1
1
1
1
1
1
2
2
1
1
1
-
2
3
1
1
1
3
2
4
3
2
2
3
2
5
3
2
2
3
-
2
6
2
2
2
3
6
7
3
2
6
3
-
6
8
1
2
6
3
-
6
дены значения глубины буферов соответствующих процессов, последовательно получаемые на шагах ПАСС. Для процессов, участвующих в вычислениях, начальная глубина буферов полагается равной 1.
Шаги ПАСС 1-4 (см. табл. 3.2. и табл. 3.3) представляют процедуру первого прохода от уровня 1 к уровню 3 с применением правила R1, когда глубина буферов определяется по меткам исходящих дуг. На шаге 3 осуществляется возврат от уровня 2 (теста t^) к уровню 1 и про™ изводится приведение свойств в соответствии с правилом R2 по входам
Таблица 3.3
Пошаговая разметка для альтернативы z'O'
Шаг ПАСС
Уровень М-сети
Глубина буферов
mi
Ш2
Ш3
т 4
^5
1
1
1
1
1
1
2
2
1
1
1
1
3
1
1
1
1
1
4
3
2
1
1
1
5
3
2
4
1
1
6
2
2
4
1
12
7
3
4
12
-
1
12
8
1
4
12
-
12
12
метаоператора т^ (см. табл. 3.2) или метаоператора т< (см. табл. 3.3). Процедура первого прохода завершается на шаге 4 разметкой уровня 3 — определением глубины буферов mi и т^ по меткам их выходов.
С шага 5 начинается процедура второго прохода от уровня 3 к уровню 1 с применением правила R2, т. е. приведение свойств вершин реализуется по входам. На шаге 5 определяется глубина буферов метаоператоров mi, m2, причем в альтернативе 2’0’ (см. табл. 3.3) свойства m2 изменяются. На шаге 6 выполняется приведение свойств по входам ^5 и затем происходит возвращение к уровню 3 с приведением свойств mi, m2 по правилу R1. Наконец, на шаге 8 определяются свойства уровня 1, и на этом процедура разметки заканчивается.
Легко убедиться, что полученные альтернативные разметки являются стационарными и неизбыточными. Таким образом, применение схемы ПАСС сводится к возвратно-поступательным проходам по уровням М-сети и определению их свойств по соответствующим правилам. Практически алгоритмы разметки могут быть реализованы «экономичнее», чем формальная схема. Действительно, если после приведения свойств по входам или выходам вершины ее метка не изменяется, как в случае разметки z’0’ на шаге 2 (см. табл. 3.3), то нет необходимости возвращаться к предшественникам или преемникам (например, на шаге 3), поскольку их свойства измениться также не могут. В общем же случае необходимо выполнять все возвраты к уровням предшественников или преемников, как, например, при разметке ^/’1’ (см. табл. 3.2).
Недостижимость стационарной разметки. В рассмотренных выше примерах стационарная разметка достижима, т. е. соответствующие модели являются реализуемыми и невозможны бло-
кировки вычислений. Теперь рассмотрим примеры противоположной ситуации, когда, несмотря на отсутствие ориентированных циклов в М-сетях, блокировка вычислений может возникать. Заметим, что воз
никновение дедлоков, как правило, связывается с наличием контуров в соответствующих графовых моделях обработки. Примером такой модели может служить граф, вершины которого представляют ресурсные семафоры, а дуги соответствуют последовательности выполнения операций над семафорами [26]. Наличие контура в таком графе свидетельствует о возможности возникновения дедлока. Однако блокировки вычислений могут быть обусловлены и другими причинами, например взаимозависимостью параллельных путей передачи данных от одного процесса-производителя. Этот эффект был замечен при изучении некоторых акторных моделей, в частности SDF. Пример такого несогласованного SDF-графа рассматривается в § 2.3 и приведен на рис. 2.5, в.
Рассмотрим бесконтурные М-сети, показанные на рис. 3.7, а, б.
Легко убедиться, что стационарной разметки для этих М-сетей не существует. Действительно, на рис. 3.7, а при втором проходе по схеме
Рис. 3.7. Примеры гамаков в М-сетяхРис. 3.7. Примеры гамаков в М-сетях
Рис. 3.7. Примеры гамаков в М-сетях
Рис. 3.7. Примеры гамаков в М-сетях
ПАСС (от mi к т2 и далее к m3, т^ необходимо выполнить приведение по входам метаоператора т4. Дуги а, b до приведения имеют метки д W (а) = 6 и д^ (6) = 2. После процедуры приведения их метки приобретают значения
(а) = d (тД • ini ('^n) = 6 • 2 = 12,
д(2) ^ _ ^ (ШД • in2 (mi) = 6-1 = 6,
где d (тД = г [д^ (а) /тДтД, д^ (6) /in2 ('тД] = г [6/2, 2/1] = 6, ini (^4) = 2, in2 Д4) = 1.
Тогда дуги, исходящие из позиции frki метаоператора mi (одна из них — дуга 6), получают общую метку 12. Следовательно, дуга а должна получить новую метку 36. Снова необходимо приведение свойств по входам а, b вершины т<. Понятно, что процедура разметки никогда не может закончиться, т. е. стационарная разметка недостижима. Причина заключается во взаимозависимости разметки путей (mi, m2, 'тД и (mi, тД: результат процесса, которому соответствует метаоператор mi, распространяясь по различным путям, дает аргументы для
одного и того же процесса, обозначенного метаоператором т.4. Так же можно установить, что не достигается стационарная разметка в М-сети на рис. 3.7, б: взаимозависимыми являются процедуры приведения свойств по входам метаоператоров mi и т^. Любое новое приведенное свойство вершины mi (глубина буферов) требует изменения свойства вершины m2, и наоборот.
Подграфы М-сетей, подобные приведенным на рис. 3.7, будем называть гамаками. Вершину, соответствующую процессу-производителю, назовем входом (mi на рис. 3.7, а), а вершину, обозначающую процесс- потребитель, выходом гамака (тд на рис. 3.7, а). Гамак с одним входом и выходом является простейшим. Пример простейшего гамака приведен на рис. 3.7, а. Гамак может быть и составным, когда при одном входе имеется несколько выходов. При этом, разумеется, предполагается, что для каждого из выходов имеются по крайней мере два различных пути от входа. М-сеть, показанную на рис. 3.7, б, будем называть связанным гамаком: позиции frki, frk2 и вершины mi, m2 представляют соответственно связанные входы и выходы. Связанный гамак может, конечно же, содержать и более двух входов и выходов. В общем случае могут встречаться подграфы М-сети, представляющие собой сочетания простейших, составных и связанных гамаков.
Таким образом, наличие гамаков может препятствовать достижимости стационарной разметки и соответственно реализуемости соответствующих моделей вычислений. Однако это вовсе не означает, что гамаки всегда приводят к блокировке вычислений. Так, М-сеть на рис. 3.3 содержит два гамака, образованных соответственно вершинами mi, ^5, m3 и m2, ts, т^ а также инцидентными им дугами. Тем не менее стационарная разметка достижима для любой из четырех альтернатив развития процессов (см. табл. 3.1).
Каким образом, можно установить возможность блокировки вычислений из-за наличия гамаков? В § 3.1 уже отмечалось, что достаточно повторной переразметки любого из уровней М-сети, чтобы убедиться в достижимости стационарной разметки. Если его свойство при переразметке строго возрастает, то стационарной разметки не существует. Поэтому можно построить конструктивный прием, который следует использовать для проверки существования стационарной разметки М-сети с гамаками.
Пусть задана прямая порядковая функция и выполнена процедура приведения по входам для вершин-выходов гамака (mi на рис. 3.7, а). Затем осуществляется разметка дуг гамака обратным фронтом, т. е. по направлению к вершинам-входам гамака (mi на рис. 3.7, а). Следующий этап — переразметка дуг прямым фронтом от вершин-входов к вершинам-выходам (дуг (mi,m2), а и b на рис. 3.7, а). Достаточным признаком того, что гамак не препятствует достижимости разметки, является неизменность меток вершин-выходов, или глубины буферов процессов. Процедура «отражения» обратного (прямого) фронта от входов (выходов) гамака может использоваться в практических алго-
ритмах обнаружения возможности блокировок вычислений в моделях буферного обмена сообщениями.
Другой вопрос, который возникает при наличии гамаков, блокирующих вычисления, заключается в следующем. Каким образом, следует преобразовать М-сеть, чтобы стационарная разметка стала достижимой? Ясно, что для этого каким-то способом нужно устранить взаимозависимость путей, ведущих от входов к выходам гамака. Этого можно добиться за счет репликации, т. е. «тиражирования», вер-
Рис. 3.8. Репликация входов гамаковРис. 3.8. Репликация входов гамаков
Рис. 3.8. Репликация входов гамаков
Рис. 3.8. Репликация входов гамаков
шин-входов или позиций-входов гамаков и инцидентных им дуг. На рис. 3.8, а, б приведены результаты репликации входов гамаков, показанных на рис. 3.7, а, б.
Метаоператор mi на рис. 3.7, а заменяется двумя метаоператорами, mJ и mJ, причем соответствующие mi, mJ и mJ процессы должны быть функционально эквивалентными (см. § 2.1). При этом исчезает позиция frki и устраняется взаимозависимость разметки путей от mJ, mJ к m4. На рис. 3.8, б показана репликация позиции frk2. При этом по дугам у1 и у2 должны передаваться одинаковые данные для метаоператоров mi и m2 соответственно.
Разумеется, нет необходимости реплицировать входы всех гамаков. Эта процедура применяется лишь к тем гамакам, которые препятствуют достижимости разметки, а для установления этого факта можно использовать «отражение» прямого или обратного фронтов разметки от входов или выходов гамака.
Таким образом, основные процедуры алгоритмов разметки М-сетей заключаются в следующем.
Раскрытие циклов, задание порядковой функции, обнаружение гамаков (последнее может быть выполнено построением транзитивного замыкания на графе).
Применение схемы ПАСС.
Переразметка уровней гамака «отражением» фронта.
Если гамак не препятствует достижимости разметки, то переход к этапу 2, иначе — к этапу 5.
Репликация входов гамака. Переход к этапу 2.
. Разрешимость задачи анализапотоковых моделей распределенных программ
Формализация схемы анализа. В§3.1и§3.2 проблема реализуемости недетерминированной модели потоковых вычислений сводится к поиску стационарной и неизбыточной разметки М-сети на верхней полуструктуре ее свойств, не убывающих в процессе решения задачи разметки. Стационарной разметки может и не существовать. Достигнутая стационарная разметка охватывает все допустимые истории процессов, обусловленные информационной структурой программы. М-сеть адекватно представляет особенности недетерминизма потоковых моделей программ в условиях распределенности процессов, которые обмениваются разнородными сообщениями.
Теперь обобщим задачу анализа следующим образом. Объектом анализа будет маркированный потоковый граф с метками дуг и вершин, вид (семантику) которых мы не конкретизируем. Заметим, что в вводном пункте §3.1, посвященном основным понятиям разметки и анализа, мы не определяли точно, что представляет собой информация на входе 1п и выходе Ои вершины и графа и каковы параметры Ри, Gu. Далее положим, что допускаются произвольные функции приведения свойств по входам и выходам, а также функции разметки входов и выходов, т. е. их конкретный вид не задается и не предъявляется требование монотонности, как это было в случае анализа М-сетей. Из прежней постановки задачи сохраним лишь правила Pl, Р2 разметки, которые допускают обобщение для произвольных меток, и будем считать, что заданы верхние полуструктуры меток дуг и вершин (см. §3.1). Возникает следующий вопрос. Можно ли в таких условиях в результате анализа обобщенного маркированного потокового графа установить, достижима ли стационарная разметка?
Здесь мы сталкиваемся с проблемой разрешимости, относящейся к так называемым массовым проблемам [20]. Как известно, общим в постановке таких проблем является поиск ответа на вопрос, обладает ли исследуемый объект интересующим нас свойством, определяющим его принадлежность к множеству всех объектов, этим свойством обладающих. Известен ряд классических неразрешимых проблем. Это, в частности, проблемы остановки и пустой ленты в машине Тьюринга [31], проблема тождества слов Маркова-Поста [20]. Так, неразрешимость проблемы остановки означает, что нельзя построить алгоритм, который устанавливал бы, остановится ли машина Тьюринга, начав работать над любым словом в заданном алфавите. Неразрешима и более частная проблема: остановится ли машина Тьюринга, работающая с пустой лентой, не содержащей никаких символов, кроме пустого? Для дальнейшего чтения этого параграфа желательно предварительно ознакомиться с основными разделами теории алгоритмов, в частности с рекурсивными функциями [20, 40].
Итак, исследование алгоритмической разрешимости задачи анализа потоковых моделей требует обобщения семантической природы меток дуг и вершин потокового графа G программы (см. § 2.3), а также формализации самой схемы анализа. Цель анализа таких моделей — установление существования наименьшей верхней грани свойств дуг и вершин потокового графа G^ которая полно, но не избыточно представляет структурный аспект поведения программ.
Пусть G' суть L-уровневая сеть, равносильная графу G. Заданы верхние полуструктуры свойств дуг (L^, V) и вершин (Ly, V), функции приведения и разметки, правила ЛИ, R2 замены меток произвольной семантической природы, а также некоторая начальная разметка вершин Л/'0' = иЛЧ<Ь ^Ч^к^, r№vkeV, k = l,...,K,K = I V|. Задача анализа потокового графа G сводится к установлению существования стационарной и нахождению неизбыточной разметки сети G'.
В схеме ПАСС текущая разметка G' — это набор свойств ее уровней М (/), / = !,...,£, где свойство уровня I представлено метками соответствующих вершин V/ и инцидентных им дуг. Неформально схема ПАСС представляет собой комбинацию двух проходов по уровням сети, определение свойств уровня I по правилу RI (R2Y возвращение к уровню I от предшественников (преемников) и приведение свойств в /-м уровне по правилу R2 (Я1).
Вектору Му^ поставим в соответствие вектор натуральных чисел (Ц°) = (o"i°\ • • • , ^к^) таким образом, что если д^ (vkY Y^vY то сг^ а^н , где к\ к” G {1, . . . , К^. Следовательно, с помощью вектора а^0^ кодируются исходные свойства сети с учетом отношения частичного порядка ^ на множестве меток вершин. Каждой из начальных разметок сети, представленной набором свойств уровней, сопоставим набор частичных числовых функций (тп^\ . . . , m^Y определенных на множестве векторов а^°\ Пусть на множестве наборов вида ^т^\ - - - , т^) задана функция ф(т^\ - - - , m^Y любому значению которой соответствует начальная разметка М^ сети. Положим, нумерация уровней определяется прямой порядковой функцией О (v).
Для формального задания процедуры первого прохода от уровня 1 к уровню L с применением правила R1 и процедуры второго прохода от уровня L к уровню 1 с применением правила R2 введем следующую схему примитивной рекурсии [40]:
f g(mi°\ .. ., т^\ 0) = Дт^, . . ., т^), (3.5) g(m^\ .. . , т^\ / + 1) = ф^тр • • •, т<р 1 S'(7ni°'1, • • • , mL^ 0)’
С помощью схемы (3.5) функция g получается из функций ф и ^, и при этом однозначно определяется последовательность изменения значений свойств уровней.
., m7,o) = g'(mi ’ • • ■ ’ ть\. . ., . . . ,, 71 (/' + 1)), • • •., m7,o) = g'(mi ’ • • ■ ’ ть\. . ., . . . ,, 71 (/' + 1)), • • •Для формального определения возвращений к уровню I от предшественников в уровнях I + 1, . . . , L и приведения свойств в /-м уровне по правилу Я2 в первом проходе, а также возвращений к уровню I от преемников в уровнях / — !,...,! и приведения свойств уровня I по правилу R1 понадобится схема возвратной рекурсии. Пусть ^V + 1), где V = 1, . . . , L, являются всюду определенными функциями, причем 7ц (V + 1) ^ I'. Это вспомогательные функции, вводимые по определению в возвратную рекурсию [40]:
., m7,o) = g'(mi ’ • • ■ ’ ть\
. . ., . . . ,, 71 (/' + 1)), • • •
., m7,o) = g'(mi ’ • • ■ ’ ть\
. . ., . . . ,, 71 (/' + 1)), • • •
/г(т^°\ . .
С помощью (3.6) функция h получается из функций gf ^т^\ . . . . . . , т^) = g^m^ . . . , т^ L^ 3 и 71, . . . ,7ц. Заметим, что при V = = 0 значение функции Н равно значению функции g^ полученному при I = L. Смысл (3.6) заключается в том, что «возврат» реализуется от уровня V, при этом свойства уровней с меньшими номерами сохраняются, что определяется условиями 71 (/' + 1) ^ I', . . . , 7ц (V + 1) ^ ^ Г, а свойства уровней V + 1, • • • , L изменяются, т. е., строго говоря, 7^+1 (^ + 1) = . . . = 7l (^ + 1) = V.
Для того чтобы схемы (3.5), (3.6) формально представляли процедуры ПАСС как при первом, так и втором проходе, достаточно следующего допущения. При первом проходе с «применением» (3.5) вводится прямая порядковая функция О (v), а для (3.6) — обратная О (v), т. е. изменяется на противоположную нумерация уровней. При втором проходе «применение» (3.5), (3.6) предполагает задание функций O(v), О (v) соответственно.
Далее, необходимо формальное представление изменяемости свойств вершин. Напомним, если они не изменяются никаким применением правил Rl^ R2, то достигнутая разметка является стационарной. Введем функцию стационарности с помощью следующей схемы примитивной рекурсии:
Mai0)’ • • -ГиГ = ^s77, ■.. ГкГ
< /Щ70),...,а7,/" + 1) = (3.7)
- ,/, /Л°> J0) ,„ , / (0) (0) ,„п
где 925, ips — функции, значения которых отличны от 0, если достигнутая разметка не является стационарной; Iм > I и Iм > V поскольку переменная Iм должна учитывать все комбинации проходов по уровням сети и возвращений.
Заметим, что функция стационарности hg (3.7), в отличие от функций g, h в (3.5), (3.6), определяется на аргументах сг^, . . . , а^, поскольку различные свойства смежных дуг приводятся к свойству соответствующей вершины.
Важно, чтобы схема ПАСС была как можно «экономичнее» в смысле поиска стационарной разметки или установления факта ее недостижимости. С этой целью при помощи функции стационарности hg и оператора минимизации (//-оператора) вводится функция сложности
he («Р,..., 40)) = 111" [hs,...,, I") = 0].(3.8)
Уравнением (3.8) определяется наименьшее /", при котором hg обращается в 0, что свидетельствует о том, что из исходных свойств сети, закодированных вектором а^°\ достигнута стационарная разметка. При этом должно соблюдаться условие ее неизбыточности. Для фиксации этого факта зададим соответствующую функцию неизбыточности
hN(p“\. ■ • pp)=fN(g(mP,.. . ,h^m^,.. ., m^0), /'))•
(3-9)
Функция h^ в (3.9) получается из функций /^, g и h с помощью оператора подстановки.
Формально схемой ПАСС будем называть систему функциональных уравнений (3.5)-(3.9). При этом если существует решение уравнений (3.7), (3.8), то функция h^ должна быть наименьшим из решений уравнения (3.9).
Интерпретация схемы анализа. Введем понятия функций и функционала, интерпретирующих формально заданную схему ПАСС (3.5)-(3.9). Обозначим через 52 множество наборов а = (од, . . . , а к) натуральных чисел, кодирующих свойства вершин на основе отношения частичного порядка, т. е. а^ ^ а^м О //(v/g^) ^
Р^км)^ гДе рЛ^к'У Р^к") — метки вершин и^, и^". Через 52 обозначим естественное расширение [41], включающее элемент ш для обозначения величины не определено, т.е. ^2^ = 52 С {ш}. Пусть G: 5252 и 77: 52 “^52 частично определенные функции, а
77 (G (а)) — суперпозиция [41] G и 77. Положим, установлено взаимно однозначное соответствие между процессом вычисления g по (3.5) и последовательностью
G1 = G(ct^0)), G2 = G(Gi),Gi = G(Gi_1),
где г — номер шага ПАСС.
Пусть также имеет место взаимно однозначное соответствие между процессом вычисления h по (3.6) и последовательностью
н2 = н ^g^ ,н2 = н ^g^ ,Hi = H(Gi),Hi = H(Gi),
н2 = н ^g^ ,
н2 = н ^g^ ,
Hi = H(Gi),
Hi = H(Gi),
Тогда будем говорить, что функции G и Н интерпретируют соответственно схемы (3.5) и (3.6) на области
На основании результатов, изложенных в § 3.1, можно задать функции Hg и //<7, которые интерпретируют функции стационарности hg в (3.7) и сложности he в (3.8) на подмножестве целых неотрицательных чисел, расширенном элементом ш. Для установления достижимости стационарной разметки достаточно 2£ (£ + 1) шагов ПАСС. Тогда на г-м шаге
J 2£ (£ + 1) — г, если 1 г 2£ (£ + 1), ( ш, если г > 2£ (£ + 1) .
При этом
Г 2£ (£ + 1) если Hg О, Нс = <
[ ш, если Hg = ш.
Теперь рассмотрим, как интерпретируется функция неизбыточно- сти разметки h^ в уравнении (3.9). Пусть функционал F]g (Н (G (^))) устанавливает соответствие между интерпретирующими функциями G, Н на множестве [ ]Р+ S+ ] • Тем самым определяется взаимно однозначное соответствие между процессом вычисления функции f^ в (3.9) и последовательностью значений Е^, представляющих собой суперпозиции функций G и Н. Содержательный смысл введения функционала FN заключается в «синхронизации» вычислений g, h по схемам (3.5), (3.6), ^n по (3.9) с последовательностями Ci, G^, . . . . . . , G^, . . .; Hi, H^, . . ., Нг, . . . и последовательностями функций из [ J2+ J2+ ]. Будем говорить, что функционал Е^ интерпретирует функцию f]g (3.9) на множестве функций [ ^+ .
Известно, что каждая естественно расширенная функция является монотонной [41]. Следовательно, функционал Fn, определенный на суперпозициях монотонных функций G и Н, является непрерывным. На основании первой теоремы Клини о рекурсии можно утверждать, что такой функционал имеет наименьшую неподвижную точку Hn (G (а)). Поскольку hjv (<т^) должно быть наименьшим решением уравнения (3.9), то Hn (G (а)) = h^ (^°))-
Этот результат позволяет использовать конструктивный прием для поиска стационарной неизбыточной разметки по схеме ПАСС (3.5)(3.9) на основе определенных требований к функции, которая интерпретирует схему на множестве разметок с произвольными семантическими свойствами.
Решение задачи ПАСС. Пусть М — множество разметок сети G’, представленных наборами свойств уровней М = = (М(1),...,М(£)), г - шаг ПАСС, а М^(/)/ М^+1>(/) - последовательно получаемые свойства уровня I. Будем считать, что М^ (/) М^ ^у если на (г + 1)-м шаге приведенное свойство любой
из вершин уровня не меньше, чем на г-м шаге. Если М^г\ М^+1^ — разметки сети, представляющие совокупность свойств ее уровней, то М^ мЬ^Р тогда и только тогда, когда (V/ G {1, . . . , £}) М^(/)
М^+1^(/). Положим, М^п — минимальная начальная разметка. Наименьшая верхняя грань V М^ множества Ж, где М^ = М^п, г=0
есть неизбыточная разметка сети.
Зададим функцию разметки Л: М ™э Ж, которая интерпретирует схему ПАСС на семействе свойств уровней сети Gf. Так, для М-се- ти функция Л определяется конкретным видом функций приведения свойств вершин и разметки дуг (см. § 3.1 и § 3.2), а также порядком применения правил ЕП, Я2. По сути значение Л (Ж) представляет собой разметку, достижимую из разметки М G Ж по схеме ПАСС. Любая из стационарных разметок Mg G Ж является неподвижной точкой функции разметки сети: Л (Ms) = Mg. Решением задачи ПАСС является наименьшая неподвижная точка функции Л: Ж -G Ж.
В последовательном анализе на каждом шаге изменяется свойство одного и только одного уровня. Это определяет пошаговое, поступательное и возвратно-поступательное изменение разметки сети. Продемонстрируем общий прием задания функции Л. Если уровень I препятствует достижимости Ms, то будем считать, что функция Л не определена на свойстве М(/), и обозначать это Л ((..., М(/) ,...)) = = ш. Наоборот, если изначально задана порядковая функция О (v) (или О (v)) и уровень I не препятствует достижимости Ms, то Л определена на уровнях /,...,£ (или 1,...,/): Л ((... , М(/) , . . . , М(£))) ^ из (или Л ((М(1) , . . . , М(/)
Построим функциональные определения свойства уровня M(/,MW), где начальная разметка М^ является параметром, тем самым определим и функцию разметки. Пусть изначально задана функция О(Е^ обозначим через М^(Еои^ начальную разметку выходов сети E^ut ^ Е, т. е. исходящих дуг для вершин, не имеющих преемников.
Введем вспомогательные функции:
x^m^j, м^)= если I = 0 то M^^E^t) иначе М(/ + 1, M^Y
Л2(М(/), /, М(о)) = если Ь£ то (М(£ - 1), £ - 1, М^)
иначе М(/ — 1, M^Y
Во избежание излишней громоздкости приведем функциональные определения для поступательного изменения свойств уровней в первом проходе и возвратно-поступательного во втором. Эти определения могут быть обобщены и на случай возвращений в первом проходе. Пусть лСД/,лЛ°)) — свойство уровня I после г-го шага ПАСС, Mg У) — свойство уровня, соответствующее стационарной разметке Mg. Тогда функциональные определения имеют вид
М^ М^^ = если I = 1,2,... , £ то
м^ц mW) = м^р, mW) = А1(м(/ -1), I -1, mW) иначе M2Q, MW),
М^1,М®)=если I = L, L — 1,... ,1 to Mp,MW) иначе (VZ € {1,, L}) M(l) = Mg(l),
M3Q,MW) = если ^l,M№) = mWQ,mW) = = X^MQ + 1),Z + 1, MW)) & Q^L)
то МЩ,М№) иначе M^M^) = Ai (M (L - 1), L - 1, M№\
M4Q,MW)=ecmt 1 = 1,2,TO M^MW)
иначе M^Q, MW),
M5Q,mW) = если ^M(1,mW) = mWQ,mw) =
= x2(M(i + i),z + i,mW)) ^mWq,mW) > mW^i,mW)) to A((..., M (I) , ■ ■ ■)) = w иначе Л((..., M (Z),..., M (L))) w.
Функциональное определение M^Q, MW) построено на результате, обсуждавшемся в § 3.1: если при повторной переразметке уровня его свойство строго возрастает, то стационарной разметки сети не существует.
Проблема разрешимости задачи анализа. Алгоритмическая разрешимость задачи ПАСС, естественно, зависит от свойств функции разметки.
Утверждение. Задача ПАСС с произвольной функцией Л раз™ метки сети G' алгоритмически неразрешима.
Приведем здесь лишь основные этапы доказательства.
Пусть Ьр^ (^°)) — частично рекурсивная числовая функция, представляющая словарную функцию ©n в нумерации а [40]:
бДасг,0), ... ,аЛр) = ahN(aP, • • • Гк)-
Положим, функция ©n (Еф . . . ^к) задана в алфавите А = = {di, . . . , ат^ a Ei, . . . , Нк — слова в алфавите А. Тогда Оn является частично рекурсивной словарной функцией.
Согласно теореме Тьюринга [40] для функции О ^ существует машина Тьюринга с символами а0, «1, . . . , ат и подходящими внутренними состояниями, где «о — пустое состояние, которая вычисляет функцию ew (=1, • ■ • ,2k).
Таким образом, проблема остановки машины Тьюринга может быть сведена к поиску решения задачи ПАСС, которому однозначно соответствует наименьшая неподвижная точка Ь^(сР0^ функционала FN(H(G(Fyy Здесь используется так называемый метод сведения, когда известная неразрешимая проблема сводится к изучаемой [20]. На этом основании делается вывод, что исследуемая проблема также алгоритмически неразрешима. Если бы существовало решение задачи ПАСС с произвольной функцией Л разметки, то данное сведение позволило бы решить проблему остановки машины Тьюринга, которая, как известно, является алгоритмически неразрешимой.
Пусть свойство любого из уровней не убывает в процессе разметки. Значит, если М' — разметка сети, достижимая из М, а Мн достижима из М', то М М' М", откуда следует, что М' = Л (М) Л (М') = = М". Такая функция разметки Л является монотонной. Так, если свойства М (l + 1, М^, М (1-1, М^) во вспомогательных функциях Л1,Л2 для М-сети определяются по правилам Я1, Я2 соответственно, то согласно вышеприведенным функциональным определениям функция Л монотонна.
Теорема 3.2. Если функция Л разметки монотонна, то неизбыточная разметка М^ сети G' и есть решение задачи ПАСС, т.е. MN=\KW(M^y где К^(М^ = М^, К^ум^ = НО
= Л(Л^) (М)), М еМ.
Доказательство. Функция Л: МИ Мявляется непрерывной: Л( \/ М^г^ = \/ А^М^У Действительно, рассмотрим произвольноНО
ную цепь MW ^ И+1) < . . . , где г 0. Ясно, что для любого г 0 mW <: у mW. в силу монотонности Л справедливо: но1
л ( mw ) < л ( v (mw^ для каждого г 0. Поэтому у А ^М^У ноно
< Л( V MWy
но
Зафиксируем некоторое значение ij ^ 0. Тогда
у mW < Цм^с^ = у x(mw^
НОно
г3Ъ+1Ъ+2
Л(у mW^ л( у Х(М^ = у \(MWy нононо
Так как ij выбиралось произвольно, то Л( \/ М^) V Л(М^). ноно
Отсюда и следует, что Л( V М^) = V А^М^у.
{параметры L, 1;
{для /:= 1 шаг 1 до L цикл 7?1(/)};
{параметры Г, I; для /:= 0 шаг 1 до (X—1) цикл i:=L™i; R2(l);
{если /^£то {для /':=/+1 шаг 1 до L цикл М(Г)};
{параметр j; для j:= 0 шаг 1 до (X—1) цикл Г’-= L —j\ R2Q3 }
};
{если (3v(/)gFz) дХ(у(/)) > дС/-1)^/)) то стационарная разметка не достижима иначе уровень / не препятствует достижимости стационарной разметки}
}
}
Рис. 3.9. Алгоритм распознавания недостижимости стационарной разметки
Поскольку А непрерывна, то на основании теоремы о неподвижной точке [40] V ^^ (^miL) — наименьшая неподвижная точка. При этом г=о
^М^^ = M^V Значит, V М^ = V А^ЦЖ}^) = М^. Теорема г=0z=0
доказана.
Монотонность функции А позволяет распознавать недостижимость стационарной разметки, не дожидаясь завершения прохода с возвращениями по всем уровням сети. Пусть р^^и ^у р^™Г^у ^^ — свойства вершины и (/) 6 14, где индекс J — 1 уже учитывает приведение свойств преемников или предшественников, и (Eh (/) G 14) р^ (с (/)) > > р^™1^ (и (l)). Тогда уровень I препятствует достижимости стационарной разметки.
На рис. 3.9 приведен пример алгоритма распознавания существования стационарной разметки для изначально заданной порядковой функции О (v). Здесь процедуры получения разметок уровня I по правилам Я1, R2 обозначены R1 (/) , R2 (/), фигурными скобками {, } — начало, конец.
При первом проходе применяется лишь правило Rl^ т. е. нет необходимости возвращений к преемникам для приведения их свойств по правилу R2. Этот случай соответствует М-сети, все метаоператоры которой имеют одну выходную позицию (см. рис. 3.6, б).
Таким образом, алгоритм распознавания представляет собой последовательность первого прохода от уровня 1 к уровню L с применением правила R1 и второго прохода от уровня L к уровню 1 с возвращениями от текущего уровня I к уровню L и обратно (рис. 3.10). При этом проверяется, возрастают ли приведенные свойства вершин уровня. Если нет уровней, препятствующих достижимости стационарной разметки, то она и является результатом работы алгоритма.
Итак, мы рассмотрели проблему алгоритмической разрешимости задачи анализа обобщенных потоковых графов программ. Уравнения (3.5)-(3.9) представляют собой формализацию схемы последовательного анализа свойств сети, соответствующей исходному графу.
Рис. ЗЛО. Диаграмма проходов по алгоритму распознаванияРис. ЗЛО. Диаграмма проходов по алгоритму распознавания
Рис. ЗЛО. Диаграмма проходов по алгоритму распознавания
Рис. ЗЛО. Диаграмма проходов по алгоритму распознавания
Функция неизбыточности разметки сети — наименьшее из решений системы функциональных уравнений, задающих схему ПАСС. Задача анализа с произвольной функцией разметки является алгоритмически неразрешимой. В случае монотонности функции разметки задача ПАСС разрешима (теорема 3.2).
. Комментарий и краткий обзор к главе 3
Задача семантического анализа свойств моделей вычислений, например, с целью обнаружения блокировок, относится к числу фундаментальных проблем теории программирования. Результаты анализа могут быть использованы для формальной верификации, оптимизации и специализации программ. Во многих случаях задача анализа моделей программ невысокого уровня абстракции оказывается алгоритмически неразрешимой.
В данной главе объектом анализа являются маркированные потоковые графы с произвольной семантической природой свойств дуг и вершин, отражающей характер обработки и взаимодействия процессов распределенных программ. Обобщение семантической природы меток дуг и вершин потокового графа программы требует исследования разрешимости как самих моделей вычислений, так и задач их анализа. Основной методологический прием в решении задачи анализа потоковых моделей программ — установление существования стационарной разметки на заданной алгебраической структуре свойств дуг и вершин потокового графа.
Вводный пункт к § 3.1, в котором объясняются основные понятия и терминология анализа информационных потоков, написан с использо-
ванием работ [132, 148]. Весь остальной материал этой главы является оригинальным и основывается на работах [48, 49, 53, 59, 152].
Метод разметки используется в ряде работ по схематологии [14, 15, 18, 31, 115, 117]. Как правило, стационарность разметки обеспечивается структурой (полуструктурой) семантических свойств дуг и вершин графа программы, которые не увеличиваются в процессе разметки [18, 31, 115, 117], либо свойствами самой модели программы, как в случае исследования достижимости и продуктивности вершин графа переходов схем Янова [14, 15].
В задаче анализа реализуемости потоковых моделей исходные условия принципиально иные: с одной стороны, для того чтобы разметка охватывала все развития процессов, обусловленные структурой программы, семантические свойства дуг и вершин М-сети не должны убывать в ходе разметки, а с другой — необходимое условие реализуемости потоковых вычислений — существование ста™ ционарной неизбыточной разметки, определяемой информационными связями между процессами.
Методы анализа потоковых графов программ ориентированы на свойства дуг и вершин вполне определенной семантической природы либо допускают ее обобщение. Примером первых могут служить мето™ ды анализа акторных моделей типа SDF [122], BDF, IDF [123, 137] на основе решения уравнений баланса. Маркировка начал и концов дуг соответствует числу потребляемых и производимых токенов (значений данных) для информационно связанных акторов. Нетривиальное ре™ шение уравнения баланса дает число повторений каждого из акторов в циклическом расписании. Необходимо заметить, что при введении в акторные модели Денниса [90] условных ветвлений и альтернативных слияний потоков данных проблемы тупиков и ограниченной памяти токенов становятся алгоритмически неразрешимыми [81, 123].
Во второй группе методов [94, 132] осуществляется алгебраизация свойств объектов анализа. Окружение для анализа - четверка, включа™ ющая структурный граф программы, решетку [131] или полурешетку [31] свойств, монотонное функциональное пространство и частичное отображение, сопоставляющее компонентам графа монотонную функ™ цию. Это отображение называют иногда семантической функцией [31]. В ^-кратном окружении [132] допускаются разнородные дуги, напри™ мер для управления и синхронизации процессов. Задача анализа разре™ шима, если функциональное пространство дистрибутивно и монотонно [114, 115, 132]. Известно, что всякая дистрибутивная функция являет™ ся монотонной [31]. Решение представляет собой неподвижную точку системы потоковых уравнений [148] либо /г-кратного окружения [132]. Вышеупомянутые работы посвящены анализу детерминированных мо™ делей программ, при этом точным решением задачи анализа является наибольшая нижняя грань свойств дуг и вершин, а стационарная раз™ метка существует для любой задачи анализа [31].
Недетерминированная модель потоковых вычислений, вопрос о реализуемости которой сводится к поиску стационарной разметки М-сети, предложена и исследована в работах [48, 49, 53, 152]. Вопрос о разрешимости задачи анализа рассматривается в [59]. Из теоремы 3.2 следует, что проблема реализуемости недетерминированных потоковых моделей программ, представимых М-сетями, является алгоритмически разрешимой. Этот факт представляется неожиданным, если сопоставить его с результатами, касающимися неразрешимости акторных моделей с sit- и swh-позициями [52, 53, 123]. Однако в акторных моделях это означает невозможность статического планирования процессов для потоковых графов общего вида. В М-сетях наличие вершин с sit™ и swh-позициями приводит к альтернативным стационарным разметкам, если таковые существуют (см. § 3.2).
Здесь напрашиваются определенные сопоставления с разрешимостью проблемы точного решения задачи глобального анализа на нижней полуструктуре свойств [31]. Известно, что в случае дистрибутивности преобразователей свойств стационарная разметка дает точное решение задачи анализа, или наибольшую нижнюю грань свойств (известный результат Килделла [117]). Для задачи ПАСС стационарность разметки обеспечивается непрерывностью функции разметки, интерпретирующей схему анализа. Однако, как уже подчеркивалось, задачи анализа на верхней и нижней полуструктурах свойств графа программы принципиально различны.
Рассмотренный метод анализа на основе разметки бесконтурных маркированных сетей, соответствующих обобщенным потоковым графам, применим к исследованию широкого класса моделей распределенных программ.
Глава 4
ПРОГНОЗИРОВАНИЕ врЕМЕНИ выполнения
ПРОГРАММ
. Статический и динамический анализпрограмм
Уровни и этапы анализа. Получение адекватных оценок времени выполнения программ или их выделенных фрагментов важно для эффективного распараллеливания, планирования вычислительных процессов и распределения ресурсов масштабируемых систем, а также для оптимизации программ. Довольно часто временные характеристики программы исследуются на инструментальной системе, а затем делается прогноз динамики программы на целевой вычислительной платформе. Как правило, инструментальные средства для такого рода анализа представляют собой сложные программные комплексы, позволяющие выявлять узкие места в работе пользовательских программ и добиваться ускорения их выполнения за счет оптимизации, в том числе и путем структурных преобразований программ. Арсенал таких средств включает в себя оптимизирующие компиляторы, профилировщики, отладчики и т. п. В основе их создания и применения лежат различные методы.
В этом параграфе мы рассмотрим суть так называемого статикодинамического анализа, предполагающего двухуровневое исследование программы — на языке высокого уровня и в коде ассемблера целевого процессора (рис. 4.1). Статико-динамический анализ включает: фрагментацию программы; однократный статический анализ выделенных фрагментов с учетом архитектуры целевого процессора; использование результатов, полученных в статике, в процессе прогона программы путем подсчета числа исполнений соответствующего фрагмента.
Динамический анализ, т. е. исследование фрагментированных программ в реальных прогонах, выполняется на языке высокого уровня. Для этого может быть использован метод частотных счетчиков [23]. Основная идея этого метода состоит в том, что в программу вводятся средства для подсчета числа и, если требуется, для запоминания
Рис. 4.1. Общая схема статико-динамического анализа программ
последовательности выполнений (профилирования) выделенных фрагментов программы. Пусть, например, необходимо построить профиль прогона программы для вычисления п! и подсчитать, сколько раз выполняется каждая из строк кода на языке С:
1 static unsigned long fact (unsigned long n) {
2if (n > 1){
3return n * fact(n - 1);
} else {
return 1;
}
}
Положим, n = 4. Профиль программы в данном случае может быть представлен ее операционной историей (рис. 4.2, а) и содержимым
Строка
Число выполнений строки
1
4
2
3
3
3
4
1
5
1
6
1
7
4
б
Рис. 4.2. Профилирование программы вычисления п! (п = 4)
частотных счетчиков — переменных, значения, которых накапливают число выполнений соответствующих строк (рис. 4.2, б).
Для реализации метода частотных счетчиков в программу, записанную на языке высокого уровня, как правило, вводятся средства на том же языке. Эти средства можно разделить на три типа:
операторы присваивания, инкрементирующие соответствующий счетчик при каждом выполнении того или иного фрагмента;
операторы вывода данных о выполнении исследуемых частей про™ граммы;
операторы обращения к специальным измерительным програм™ мам или подпрограммам, например профилировщикам и анализа™ торам.
При этом введение в исходный текст программы операторов при™ сваивания для подсчета числа выполнений интересующих пользовате™ ля фрагментов сопровождается весьма незначительными накладными расходами, связанными с дополнительной нагрузкой на вычислитель™ ные ресурсы. Операторы вывода и вызова измерительных программ или подпрограмм позволяют визуализировать и обобщить результаты профилирования: построить трассу выполнения исследуемой програм™ мы, различного рода диаграммы и т. п. Рассмотренный выше пример с вычислением п! (см. рис. 4.2) довольно тривиален. Практика же требу™ ет, как правило, сложных программных систем для профилирования прикладных программ. При этом структура исследуемого приложения, как правило, представляется различного рода графами. Здесь можно упомянуть профилировщик GNU gprof, использующий граф вызова функций [101]. К этому же классу относится отечественная система V-Ray (НИВЦ МГУ им. М.В. Ломоносова), позволяющая на основе различных модификаций графа вызова процедур детально исследовать структуру параллельной программы [9].
Помимо использования метода частотных счетчиков динамический анализ может быть осуществлен посредством прерываний выполнения или интерпретации объектной программы. В первом случае выполнение программы прерывается через выбранные некоторым образом интервалы времени, запоминается адрес прерывания, а иногда и свя™ занная с ним контекстная информация. Эта идея очень часто закла™ дывается в основу различных средств профилирования. В другом слу™ чае измерительные интерпретаторы позволяют выявить и подсчитать используемые команды, операнды и т. д. Измерения, основанные на прерываниях и интерпретации, в отличие от метода частотных счет™ чиков, практически всегда вызывают замедление работы исследуемой программы.
Цель статического анализа — получение времени однократного исполнения фрагмента на целевом процессоре. Учесть особенности его архитектуры команд, а также избыточность, вносимую штатными ком™ пиляторами на этапах получения объектного и исполняемого кодов после компоновки, можно лишь на уровне языка ассемблера.
Когда речь идет об избыточности, констатируется известный факт, заключающийся в том, что без некоторой дополнительной информации штатный компилятор вычислительной системы скорее всего не сможет обеспечить эффективной реализации прикладной программы. Извест™ но также, что зачастую оптимизация программы вручную на языке ассемблера позволяет значительно ускорить ее выполнение. Кроме это™ го, существует взаимно однозначное соответствие между операторами
языка ассемблера и машинными командами, что, безусловно, важно для получения адекватных оценок времени исполнения машинного кода. Однако необходимо учитывать и то, что исходный код на языке высокого уровня сначала компилируется в код ассемблера инструментального процессора (см. рис. 4.1). Временные оценки же необходимо получать для конкретного компилятора и языка ассемблера целевого процессора. Этим объясняется необходимость моделирования процесса компиляции, ассемблирования и функционирования процессоров целевой вычислительной системы. В этом и состоит основная трудность реализации статического анализа фрагментов программы. Современные компиляторы поддерживают развитые механизмы оптимизации кода, например, выделение и исключение общих подвыражений, продвижение констант, распределение регистров. Кроме того, и компиляторы, и ассемблеры отдельно транслируют каждую единицу исходного кода. Так, сначала создаются объектные модули (в операционных системах Windows и UNIX они имеют расширения .obj и .о соответственно), а после компоновки получается исполняемый двоичный код (в Windows ему соответствует расширение . ехе, в UNIX расширения нет). Все это может привести к тому, что моделирование компиляции отдельных фрагментов кода станет неадекватным реальному процессу компиляции всей программы. Конечно же, задача упрощается при наличии кросс™компилятора для целевой системы, который далеко не всегда доступен.
Код, получаемый в результате отображения языка ассемблера инструментального процессора на язык ассемблера целевого процессора, будем называть модельным кодом. Последующий его анализ (см. рис. 4.1) представляет собой по сути моделирование работы целевого процессора — организации конвейера команд, кэш-памяти и т. д. Сложность такого рода моделирования объясняется высокой степенью внутреннего параллелизма современных процессоров с сокращенным набором команд (RISC — Reduced Instruction Set Computer) и процессоров co сверхдлинным командным словом (VLIW — Very Long Instruction Word). Правда, это не означает, что моделировать работу процессоров Pentium или Celeron с 32-разрядной архитектурой команд IA-32 намного проще. Это машины с полным набором команд (CISC — Complete Instruction Set Computer ), хотя хорошо известно, что их ядро реализует сильно конвейеризованную систему RISC. CISC-команды архитектуры IA-32 внутри ядра разбиваются на операции RISC.
Далее в этой главе мы еще вернемся к влиянию различий и особенностей архитектуры команд процессоров на адекватность анализа времени выполнения программ. А сейчас попытаемся оценить еще один вариант проведения статического анализа — эмуляцию системы команд целевого процессора, позволяющую получить динамические характеристики программы на уровне языка ассемблера с высокой точностью. Однако эмуляция требует значительных временных затрат и, естественно, доступности эмулятора. Кроме того, использование
эмуляции как метода имитационного моделирования работы процессоров целесообразно тогда, когда необходимо получать гарантированные оценки времени выполнения программ или их критических участков, в частности в системах реального времени. Однако вряд ли оправданным является использование этого подхода для прогнозирования динамики сложных комплексов программ в масштабируемых вычислительных системах.
Итак, прибегать к статико-динамическому анализу целесообразно, когда недоступна целевая платформа или же осуществляется ее выбор. Основное достоинство статико-динамического анализа — гораздо более высокое быстродействие по сравнению с эмуляцией и практически та же точность оценок. Недостатки — необходимость детального моделирования процесса компиляции, аппаратуры и наличия подробнейшего описания архитектурных решений, чаще всего недоступного в условиях жесточайшей конкуренции между производителями современных процессоров. В частности, можно сослаться на практику компании Intel, скрывающей организацию RISC-ядра в процессорах Pentium. Кроме того, однократный статический анализ не позволяет учесть зависимость динамики программы от вида исходных данных. Теперь подробнее рассмотрим, какие факторы влияют на степень соответствия кода целевого ассемблера и модельного кода.
Погрешность оценок модельного кода. Степень адекватности модельного кода коду ассемблера целевого процессора определяется долей неотображаемых операций в коде инструментальной системы. Для отображаемых операций существуют некоторые методы или эвристики получения и сопоставления временных оценок фрагментов кода целевого и инструментального процессоров. Для неотображаемых операций таких приемов нет. Причины могут быть обусловлены разными архитектурами команд и особенностями соответствующих компиляторов.
Архитектуры команд различных процессоров могут иметь весьма существенные различия. В качестве примера сравним архитектуры IA-32 и Version 9 SPARC. Первая реализуется в таких процессорах фирмы Intel, как 8086, 8088, Pentium, Celeron и др. Вторая архитектура используется в процессорах SPARC. Набор команд IA-32 характерен для CISC-процессоров, хотя, как уже отмечалось, начиная с семейства процессоров Pentium, внутри ядра команды CISC разбиваются на операции RISC. А это все оборачивается дополнительными аппаратными затратами и в итоге — увеличением площади кристалла. Архитектура IA-32 поддерживает двухадресные команды и небольшой файл регистров. CISC-команды имеют разную длину, большое количество различных форматов, и, следовательно, их сложно декодировать. Способы адресации весьма нерегулярны. Архитектура Version 9 SPARC — это набор команд для 64-разрядных RISC-процессоров, в частности UltraSPARC II. Набор RISC-команд довольно компактен, реализуются
всего два способа адресации, преобладают трехрегистровые операции, поддерживается большой файл регистров (в процессоре UltraSPARC II имеется 32 регистра общего назначения и 32 регистра с плавающей точкой). Все команды имеют фиксированную длину, по сравнению с CISC-командами и их проще декодировать «на лету».
Безусловно, принципиально новый качественный уровень — это архитектура IA-64, реализованная в RISC-процессорах Itanium [110]. Это архитектура типа «загрузка/сохранение» с 64-разрядными регистрами и адресами. Непосредственно к памяти обращаются лишь команды загрузки и сохранения. Операнды для остальных команд хранятся только в регистрах либо содержатся в самих командах. Для программ IA-64 доступны 64 регистра общего назначения и дополнительные регистры для программ IA-32. Принципиальным отличием от других архитектур RISC-команд является концепция связанных команд. В 128-битовой связке (bundle) содержатся три 41-битовых команды и 5-битовый шаблон, с помощью которого могут образовываться группы из связок команд. Шаблон указывает, какие команды в связке и группах связок могут выполняться параллельно. При этом основная работа по выявлению таких команд и их переупорядочиванию возлагается на компилятор.
По сути архитектура IA-64 позволяет реализовать новую вычислительную парадигму, которая получила название Explicitly Parallel Instruction Computing (EPIC), что означает явный параллелизм в обработке команд. Парадигма EPIC строится на опыте, полученном из разработок RISC™ и VLIW-компьютеров. Так, подобно VLIW- компьютерам, архитектура IA-64 группирует команды, которые могут выполняться параллельно, в связки. То, что при этом каждая команда относительно проста и имеет фиксированную длину, характерно для RISC-процессоров.
Следующая отличительная особенность архитектуры IA-64 — наличие в команде поля предикации, которое указывает, какой из 64 однобитных регистров предиката определяет, нужно ли выполнять соответствующую инструкцию. Это позволяет реализовать новый способ организации условных переходов и от многих их них избавиться: выполнение каждой команды условно, хотя при этом команда действительно выполняется. Однако когда приходит время загрузки в выходной регистр, проверяется истинность предиката. Если его значение истинно, то запись в выходной регистр производится, если значение ложно, то нет.
Наконец, третья характерная для архитектуры IA-64 особенность — это спекулятивная загрузка, позволяющая выполнять вызовы операндов заранее, до того как они потребуются. Если же операнд не нужен, то команда загрузки просто объявляет регистр, с которым она связана, недействительным. В традиционных архитектурах команд такая ситуация невозможна и вызывает так называемое исключение (exception). Спекулятивная загрузка преодолевает негативное влияние эффекта
«узкого горлышка», возникающего при обмене процессора с памятью и замедляющего выполнение программ.
Данное отступление от основной линии изложения нам понадобилось для того, чтобы вкратце рассказать об источниках погрешности при получении модельного кода в инструментальной системе. Теперь посмотрим, как эту погрешность оценить и на какие параметры кода целевой системы она влияет.
Пусть 5И4 — код линейного участка (фрагмента) программы, а Si — длина кода в некоторых приведенных операциях, исполнение каждой из которых требует одного цикла инструментального процессора. Внутри фрагмента могут быть и циклы, и условные ветвления. Далее Si будем называть сложностью фрагмента S'ИД который в общем случае является мультимножеством, т. е. может содержать одинаковые операции. При этом SWi = SW.^ U SWf, SW.^ П SW^ = 0, где SW^ — множество некоторых базовых операций, отображаемых на множество SWtM операций целевого процессора, a SWS — множество неотображаемых операций инструментального процессора.
Под базовыми понимаются операции, выполняющие большую часть вычислений в исследуемой прикладной программе. Для отображаемых операций определена некоторая функция SW^4 SWtM. Под SW^1 понимается совокупность базовых операций, для которых существуют правила и приемы оценки сложности S^ кода SWtM на основе знания сложности S^ кода SW-M. С другой стороны, для операций множества SWS = 5ЖД5ЖД1 правила перехода к соответствующему коду SW^ целевого процессора не известны и, следовательно, не известна сложность S^ этого кода. Операции множества SWS могут не иметь прямых аналогов на множестве базовых операций целевого процессора. Кроме того, операции из SWS могут принадлежать неисполняемым фрагментам кода при реальном прогоне программы на инструментальной системе и поэтому не известно время исполнения операций из SWtN. Базовые операции целевого процессора, как правило, входят в множество SWtM. Опять-таки полагаем, что SWtM П SW^ = = 0, через 5Ж^ = SWtM U SWtN обозначим модельный код фрагмента (также мультимножество операций) для целевого процессора. Пусть St — его сложность. Таким образом, Si = S^ + SSSt = S^ + S^. Поскольку коды 5Жг, 5Ж^ могут содержать и одинаковые операции, то при подсчете S^ St. учитываются все экземпляры операций.
Предположим, коэффициент Ci = S^ / (S^ + S^ равный доле неотображаемых операций в коде инструментального процессора, известен. В то же время для целевого процессора аналогичный коэффициент ct = s^ / (s^ + s^ является неизвестным. При этом будем считать, что доля неотображаемых операций для целевого процессора удовлетворяет ограничению
0 Д ад Д0 Д ад ДД а2 Д 1.Д а2 Д 1.(4-1)(4-1)
0 Д ад Д
0 Д ад Д
Д а2 Д 1.
Д а2 Д 1.
(4-1)
(4-1)
Дальнейшее изложение можно было бы построить исходя из ограничения на отношение Ci/Ct. По сути это ничего не меняет. Главное то, что здесь Ci полагается известным, a Ct — нет. Сложность 8^ будем оценивать средним значением St = pSp с помощью некоторого коэффициента р. О том, как он выбирается, речь пойдет ниже.
Необходимо ответить на следующие вопросы. Какова погрешность оценки сложности St и соответственно времени исполнения линейного участка SWC Каково минимально возможное значение сложности S^ Это своего рода контрольная граница, показывающая насколько программа целевой вычислительной системы приближается к оптимальной.
Относительная погрешность оценки St составляет
+ sn - (s^ + sp |+ sn - (s^ + sp |qMqM
+ sn - (s^ + sp |
+ sn - (s^ + sp |
qM
qM
где St — среднее значение сложности кода SWtM (здесь Д выражается в долях единицы, а не в %, как это обычно принято).
Будем полагать St ~ S^ и считать, что погрешность Д обуславливается главным образом усредненной оценкой сложности S^ кода SWtN:
\stN~S*\ \ctStM ^(l^Ct)S^ StM + S?^i-Ct^StM + St)
= /4ct^ == /4ct^ =x^ps^si*x^ps^si*(4.2)(4.2)
= /4ct^ =
= /4ct^ =
x^ps^si*
x^ps^si*
(4.2)
(4.2)
где Ct удовлетворяет (4.1).
Поскольку p — некоторым образом выбираемый коэффициент, а коэффициент Ct не известен, то нас интересуют, во-первых, погрешность вида
5 = min max Д (Ctl р)(4.3)
3 ct''
и, во-вторых, минимальная сложность кода для целевого процессора, оцениваемая с погрешностью 5,
Si = min (StM +.(4.4)
Минимальное значение сложности (4.4) кода целевого процессора, оцениваемое с погрешностью (4.3), равной нулю, будем называть оптимальным.
Рассмотрим два случая для (4.2):
= CtHi^CtWsnsr,ct sr .
1 + 08^8“' Д P 1 - ct s? ’
_ 3sr/stM -Ct/3-Ct)Ct
А2"i + 3sr/stM’ где ^Т^с;^Т
При этом, напомним, коэффициент удовлетворяет неравенству (4.1).
Функция Ai является монотонно возрастающей для Ct € [адС^, «2^]- Поэтому, полагая Ct = o^Ci и, согласно (4.3), считая ф = = min max Ai = 0, получаем
Д = й =Д = й =a2Ct StM1 - а^С» S^ 'a2Ct StM1 - а^С» S^ '(4-5)(4-5)
Д = й =
Д = й =
a2Ct StM
1 - а^С» S^ '
a2Ct StM
1 - а^С» S^ '
(4-5)
(4-5)
Рис. 4.3. Границы относительного прироста оптимальной сложности модельного кодаРис. 4.3. Границы относительного прироста оптимальной сложности модельного кода
Рис. 4.3. Границы относительного прироста оптимальной сложности модельного кода
Рис. 4.3. Границы относительного прироста оптимальной сложности модельного кода
Функция Аг монотонно убывает для Ct & [aiCt, агЩ. Полагая Ct = aiCi и 62 = min max Д2 = 0, получаем
=(4-6)
При этом с учетом (4.1)
Д1 а^ 1 — oiCi ^ ^
Д2 oi 1 — a^Ci
Тогда если S^1 = Si , то оптимальное значение сложности (4.4) кода целевого процессора равно
Sf = StM + StN = StM + В^ = StM (1 + -^У
X 1 — QiCj
Таким образом, оптимальная сложность фрагмента кода для целе
вого процессора тем меньше, чем меньше доля неотображаемых опе
раций в сложности St кода инструментальной системы, чем меньше нижняя граница «1 отношения Ct/Ci и, естественно, чем меньше сложность кода SW^1. На рис. 4.3 приведены зависимости относительного прироста KS^ оптимальной сложности, когда сложность S^ отображенного кода для целевого процессора условно принимается равной единице.
Теперь рассмотрим вопрос о том, как связаны погреш-
ность оценки модельного кода и некоторые параметры фрагментов кода инструмен-
тального и целевого процессоров. Если (3 ^ /31 в (4.5), то относительная погрешность составляет (3 = ф, если же /3 ^ /32 в (4.6), то (3 = (32 в (4.3). Минимальная сложность (4.4) определяется с погрешностью ф или ф. Положим, необходимо выбрать коэффициент /3, с помощью которого определяется сложность кода с неотображенными операциями, так, чтобы относительная погрешность оценки сложности модельного кода не превышала некоторого заданного значения. Здесь возможны два случая определения относительной погрешности:
srcpiSV^rsr м8Г^М. /31 .
1 S3 +’ д р 1 + Д1 1 + дг
А _ з"8Г - stM - 3^? R„ _ sr 1 + д2 32
sr + 3"sr ’ д p sr 1 - Д2 1 - д2
При этом, полагая p' = /3'При этом, полагая p' = /3'поскольку /31 ^ /32.поскольку /31 ^ /32.о^= p, имеем -—A2о^= p, имеем -—A2S^ (/3i - /3) + sr sr (/3 ™ /З2) - srS^ (/3i - /3) + sr sr (/3 ™ /З2) - sr> 1,> 1,Следовательно, для того чтобы относительная погрешность оценки сложности модельного кода не превышала значения ф, коэффициент /3Следовательно, для того чтобы относительная погрешность оценки сложности модельного кода не превышала значения ф, коэффициент /3
При этом, полагая p' = /3'
При этом, полагая p' = /3'
поскольку /31 ^ /32.
поскольку /31 ^ /32.
о^
= p, имеем -—
A2
о^
= p, имеем -—
A2
S^ (/3i - /3) + sr sr (/3 ™ /З2) - sr
S^ (/3i - /3) + sr sr (/3 ™ /З2) - sr
> 1,
> 1,
Следовательно, для того чтобы относительная погрешность оценки сложности модельного кода не превышала значения ф, коэффициент /3
Следовательно, для того чтобы относительная погрешность оценки сложности модельного кода не превышала значения ф, коэффициент /3
Рис. 4.4. Взаимосвязь параметров кодов инструментального, целевого процессоров и погрешность оценки модельного кодаРис. 4.4. Взаимосвязь параметров кодов инструментального, целевого процессоров и погрешность оценки модельного кода
Рис. 4.4. Взаимосвязь параметров кодов инструментального, целевого процессоров и погрешность оценки модельного кода
Рис. 4.4. Взаимосвязь параметров кодов инструментального, целевого процессоров и погрешность оценки модельного кода
должен иметь следующее значение:
R =/31
Р1 +1 + di ’
Здесь значения 8Г 8Г и /31 являются известными (ф определяется по (4.5)). По сути коэффициент /3 отражает такое соотношение параметров кодов инструментального и целевого процессоров, а именно 8Гй 8^ Ci И О2 В (4.1), При КОТОРОЙ ПО™ грешность оценки сложности St модельного кода 8 Wt не превышает ф. Если параметры кодов не связаны подобным образом, то гарантий того, что погрешность не превышает значения ф, дать нельзя. На рис. 4.4 приведены примеры таких зависимостей для 8Г / ЗГ = 5 и Ci = 0,8. Положим, необходимо получить оценку St с погрешно-
стью, не превышающей ф = 0,2. При заданной верхней границе а2 отношения Ct f Ci это возможно лишь тогда, когда 8Г /8^ 5. Максимальные значения коэффициента /3 отмечены горизонтальными стрел-
ками на рис. 4.4. Напомним, что сложность S^ оценивается через усреднение pS^. При этом, чем больше степень соответствия между кодами целевого и инструментального процессоров, выраженная через параметр «2? тем больше допустимое значение /3. Параметр «2 (4.1) отражает соотношение долей неотображаемых и отображаемых опера™ ций в кодах SWi и 5 ИД.
В общем случае сложность кода и соответственно время исполнения фрагмента программы являются случайными величинами. Их значения могут зависеть, например, от вида исходных данных. Поэтому под St нужно понимать соответствующую числовую характеристику, в частности, оценку математического ожидания сложности St = R
= J2 ^tj ) R4 получаемую из R процедур статического анализа (прого
нов модельного кода). Здесь R должно быть достаточно велико, чтобы считать применимой центральную предельную теорему для сложности Stj, получаемой в j-м прогоне. При этом вводятся классические оценки доверительного интервала /7 для заданной доверительной вероятности 7:
— R / — \ 2
где D = ^ (Stj — St) ( (R — 1) — несмещенная оценка дисперсии; £7 = argФ* ^ ^ ^ ) ’ Ф* (') нормальная функция распределения, argФ* (•) — функция, обратная Ф* (•).
Влияние вида целевой архитектуры на оценки сложности кода. При оценке общей сложности St модельного кода мы предполагаем, что известна сложность S^1 отображенного кода. Разумеется, она зависит не только от конкретного типа целевого процессора, но и, в целом, от вида целевой архитектуры, что требует анализа выбранной модели обработки. Поясним это на следующем примере. Пусть вычислительный модуль, показанный на рис. 4.5, содержит: блок обработки (ВО) на основе универсального микропроцессора; локальную оперативную память (ЛОП); блок прямого доступа к памяти (ПДП); буферный регистр (БР).
Пусть в вычислительный модуль через буферный регистр поступает d бит, обрабатываемых порциями по К бит. При этом полагаем, что К ^ L, где L — разрядность процессора. Во избежание К/ L прерываний процессора вводится блок прямого доступа к локальной памяти. Таким образом, если К ^ L^ то добавляется некоторое число процессорных циклов для подготовки и завершения собственно процедуры обработки, требующей St = S^1 + S^ циклов, если L = К. Здесь
УправлениеУправлениеРис. 4.5. Структура вычислительного модуляРис. 4.5. Структура вычислительного модуля
Управление
Управление
Рис. 4.5. Структура вычислительного модуля
Рис. 4.5. Структура вычислительного модуля
StM, 8^ — оценки средних значений сложности. Сложность возрастает за счет операций препроцессорной и постпроцессорной обработки: разбиение АГ-разрядного слова на K/L частей; пересылки, запоминание в локальной оперативной памяти и вызовы их из нее; формирование целого слова из К бит после окончания обработки К/ L слов (рис. 4.6).
Будем считать, что операции препроцессорной и постпроцессорной обработки принадлежат множеству SWtM и требуют 4X8^ процессорных циклов. Таким образом, сложность отображенного кода равна StM = S^1 + ^S^1 а общая сложность St = S^1 + 8^ = St + А^м.
Время обработки d бит составляет Т (d) = (^ + А^м)т, где т — длительность цикла целевого процессора. Пусть, а = (^[ d^L ™ среднее число циклов для обработки L-битового слова, а Аа — среднее число циклов для L-битовой препроцессорной и постпроцессорной обработки.
Тогда среднее время выполнения фрагмента 5И4 равно
dd-1-1
d
d
-1
-1
Ч5< + fc X (т " О Ч т’ (4-7)
где к — коэффициент, определяющий способ обработки (см. рис. 4.6).
Время исполнения фрагмента определяется сложностью St и временем цикла процессора. Предположим, что задано ограничение на среднее время выполнения фрагмента кода: Т (d) Т* (d). Значение К в (4.7) зависит от вида целевой архитектуры. В простейшем случае оно должно быть по крайней мере кратно разрядностям процессора в блоке
— препроцессорная обработка— препроцессорная обработка^у — постпроцессорнаяобработка^у — постпроцессорнаяобработка[■——^ — обработка[■——^ — обработка
— препроцессорная обработка
— препроцессорная обработка
^у — постпроцессорнаяобработка
^у — постпроцессорнаяобработка
[■——^ — обработка
[■——^ — обработка
Рис. 4.6. Модели последовательной (а) и конвейерной (б) обработки обработки, локальной оперативной памяти, входных/выходных слов и равняться разрядности буферного регистра (см. рис. 4.5).
Положим, в (4.7) 1 ^ Да ^ а. Тогда можно получить огрубленные оценки максимально допустимого времени цикла процессора в блоке обработки:
а) т+ = Т* (d) К/ [(5/С/L — 4) 5^Т] для последовательной обработки (см. рис. 4.6, а);
б-) тр = Т* (d) К/ [(ЗК/L — 2) StL] для конвейерной обработки (см. рис. 4.6, б).
Значения коэффициента к при этом соответственно равны ks = 4 и кр = 2. Очевидно, что т+ = т+, если К = L. Коэффициенты (5K/L — 4) и (3K/L — 2) в выражениях для т+ и т+ можно рассматривать как множители, определяющие увеличение сложности St модельного кода в зависимости от выбираемого способа обработки. Конечно, оценки т^т^ являются весьма грубыми, однако они могут использоваться на ранних этапах анализа эффективности той или иной целевой архитектуры. Так, пусть т™ — минимально возможное время цикла процессора, а т^-, т^ — оценки максимально допустимого времени цикла при выполнении j-ro фрагмента кода SЖ/ на целевой вычислительной системе. Предположим, что т^ < т™ и, следовательно, т^ < т™. Тогда можно заключить, что j-й фрагмент не может быть реализован на процессоре со временем цикла т™ при
заданных параметрах целевой архитектуры (см. рис. 4.5), например К^ L и к. В общем же случае увеличение сложности, а значит, и времени реализации (4.7) участка программы зависит от принятой модели обработки и набора базовых операций целевого процессора.
Таким образом, основной источник погрешности оценок модельного кода — наличие неотображаемых операций в коде ассемблера для инструментальной системы. Выше были приведены соотношения для погрешности в оценке сложности кода, а также значение оптимальной сложности кода целевого процессора. В ходе статического анализа необходимо учитывать не только особенности процессора, но и вид архитектуры целевой вычислительной системы.
Еще раз подчеркнем, что к статико-динамическому анализу приходится прибегать тогда, когда по каким-либо причинам не удается осуществить реальные прогоны программы на целевой платформе.
§4.2. Прямые измерения временивыполнения программ
Средства измерений. В качестве альтернативы статикодинамическому анализу может рассматриваться методика прямых измерений времени выполнения выделенных фрагментов программ. Основная прагматическая посылка для применения этого подхода заключается в предположении, что отдельные процессоры или процессорные узлы, используемые при создании масштабируемых вычислительных платформ, заранее известны и доступны. Далее, современные процессоры обладают развитым набором специальных средств для оценки временных характеристик программ. Так, начиная с семейства Pentium в процессорах фирмы Intel имеется счетчик Time Stamp-Counter (TSC), содержимое которого инкрементируется в каждом цикле работы процессора. Вводя для каждого из фрагментов программы переменную- счетчик и обращаясь к регистру TSC в определенных для фрагмента контрольных точках входа и выхода, можно получить время его выполнения (сложность). Кроме счетчика TSC, особенности работы с которым мы рассмотрим чуть позже, в процессорах Pentium предусмотрен еще целый ряд контрольных счетчиков для оценки таких динамических характеристик программ, как число декодируемых команд, прерываний и обращений к кэш-памяти.
Чтобы пояснить общие принципы работы с такого рода средствами измерений, нам необходимо напомнить читателю некоторые сведения по архитектуре команд IA-32. Это тем более важно, что функции измерений временных характеристик воспроизведены и в новой архитектуре IA-64, реализованной в процессорах Itanium. В соответствии с терминологией, принятой в руководстве [110] по архитектуре команд IA-64, мы будем использовать понятия среды IA-32 и среды Itanium. Первая из них поддерживает и 16-разрядные процессоры (8086, 8088, 80286), и
32-разрядные машины (80386, 80486, семейство Pentium, Celeron, Xeon и т. д.). Вторая среда обеспечивает выполнение команд архитектур IA-32 и IA-64.
Основными режимами функционирования процессоров Pentium являются:
защищенный режим;
режим реальной (16-разрядной) адресации;
виртуальный режим процессора 8086.
В защищенном режиме выполняются функции, присущие только процессору Pentium и отсутствующие, в частности, в процессорах 8086, 8088. В этом режиме предусмотрены четыре уровня привилегий (CPL — current privilege level): уровень 0 используется операционной системой, уровень 3 присваивается пользовательским программам. В режиме реальной адресации Pentium работает как процессор 8086 или 8088. Виртуальный режим делает возможным исполнение программ для 8088 в специальной среде с защитой, создаваемой операционной системой. При этом, в отличие от режима реальной адресации, в случае возникновения сбоя программы ее не нужно снова перезапускать, а информация о сбое передается операционной системе.
Обычно к регистрам общего назначения в процессоре Pentium относят регистры EAX, ЕВХ, ЕСХ, EDX. Более специализированные регистры — ESI, EDI, ЕВР и ESP. В работе со счетчиками для измерений различных временных характеристик, как правило, используются следующие три регистра: ЕАХ — основной арифметический регистр; ЕСХ — регистр для организации циклов и хранения адресов модельных (виртуальных) регистров и счетчиков; EDX — регистр для умножения и деления.
Этой краткой сводки данных по среде IA-32 будет вполне достаточно, чтобы пояснить, как можно использовать средства измерений и соответствующие команды. В качестве примера рассмотрим команду RDPMC (Read Performance-Monitoring Counters). В шестнадцатеричной системе счисления она имеет код OF 33. Эта команда позволяет загрузить содержимое ^-разрядного контрольного счетчика, адрес которого определяется содержимым [ЕСХ] регистра ЕСХ, в регистры EDX:EAX. В регистр EDX помещаются старшие N — 32 разряда, а в регистр ЕАХ — младшие 32 разряда контрольного счетчика. Он может быть запрограммирован для подсчета различных событий (прерываний, декодирования команд соответствующего типа, числа обращений к кэш-памяти и т. д.). Команда RDPMC позволяет осуществлять контроль за временными характеристиками без вызовов операционной системы, что, естественно, исключает дополнительные затраты времени и вычислительных ресурсов. Кроме того, она не линеаризует исследуемый код. Иными словами, это означает, что события, наступление которых обусловлено командами, предшествующими RDPMC, не обязательно должны произойти до начала выполнения команды RDPMC. По аналогии события, обусловленные командами, следующи-
ми за RDPMC, не обязательно должны наступить после завершения выполнения этой команды.
В среде IA-32 команда RDPMC доступна программам, исполняемым на уровнях привилегий 1, 2 и 3, если в контрольном регистре CR4 установлен флаг РСЕ. Если в защищенном режиме флаг РСЕ не установлен, а уровень привилегий (CPL) не равен 0, то происходит исключение (exception), называемое общей защитой (General Protection). Мнемонически оно обозначается как #GP(0), в скобках указывается код ошибки. В виртуальном режиме и режиме реальной адресации исключение #GP наступает в случае, если не установлен флаг РСЕ в регистре CR4. В среде Itanium при работе с командой RDPMC используются регистры PMC (performance monitor configuration registers) и PMD (performance monitor data registers). Адрес регистра PMD определяется содержимым регистра ЕСХ со смещением 4. Исключение #GP(0) происходит всякий раз, когда уровень привилегий отличен от О, а бит РМ регистра PMD равен 1 либо установлен флаг PSR.sp. Кроме того, и в среде IA-32, и в среде Itanium всегда наступает исключение, если содержимое регистра ЕСХ не соответствует задействованным счетчикам (Implemented Counters), т.е. делается попытка чтения из нереализованных счетчиков.
Для описания действия команд в архитектуре IA-32 принят псевдокод, подобный языку Pascal (в архитектуре IA-64 нотации действия команд основаны на языке С). Описание выполнения команды RDPMC может быть представлено следующим образом:
IF (ECX!=Implemented Counters) THEN #GP(O) /♦ исключение ♦/ IF (Itanium System Environment) /♦ среда Itanium ♦/ THEN
SECURED = PSR. sp| |CR4. pce==0;
IF((PSR.cpl==0) 11 (PSR.cpl!=0&& - PMC[ECX].pm&& - SECURED)))
THEN
EDX:EAX PMC [ECX+4]; /♦ чтение содержимого счетчика*/ ELSE
#GP(O) /♦ исключение */
FI;
ELSE /*среда IA-32*/
IF ((CR4.PCE=1 OR ((CR4.PCE=0) AND (CPL=O)))
THEN
EDX:EAX PMD[ECX+4] ; /♦ чтение содержимого счетчика*/ ELSE (*CR4.PCE is 0 and CPL is 1, 2, or 3*)
#GP(O) /♦ исключение ♦/}
FI;
FI;
Средства, подобные контрольным счетчикам и счетчику TSC в семействе Pentium, есть и в процессорах Alpha. Они позволяют подсчитывать число промахов при обращении к кэш-памяти, число ошибочных
предсказаний условных переходов и т. д. Прокомментируем пример, приведенный в работе [136]. В архитектуре команд процессоров Alpha имеется инструкция rpcc (read processor cycle count), осуществляю™ щая доступ к 64-разрядному регистру, 32 младших разряда которого образуют счетчик процессорных циклов. К слову, доступность для измерений лишь 32 разрядов — весьма серьезное ограничение, поскольку, например, на частоте 500 МГц счетчик переполняется примерно каждые 8,6 с. При наличии компилятора gcc в операционной системе LINUX обращение к счетчику циклов в семействе процессоров Aplha может быть реализовано следующим образом:
static inline u_int realcc (void) {
u_long cc; /* чтение содержимого 64 разрядов счетчика в переменную сс */
asm volatile ("rpccXO”: ” = г” (сс) ::’’memory”);
return сс; /* возвращение 32 младших разрядов */
}
Чтобы обеспечить корректность результатов измерений при возможном переполнении счетчика, необходимо вызывать функцию get time и определять, сколько раз имело место переполнение. Заме™ тим, что 32 старших разряда счетчика, возвращаемых командой rpcc, системно зависимы. Это позволяет учесть «чистое» время выполнения того или иного фрагмента программы, когда подсчет процессорных циклов осуществляется лишь после инициализации процесса, который вызывает функцию virtcc (в отличие от функции realcc):
static inline unsigned int virtcc (void) {
u_long cc;
asm volatile ("rpcc %0":"= r"(cc)::"memory”);
return (cc+(cc<<32))»32; /* увеличить
содержимое счетчика после возобновления процесса */
}
Заметим, что некоторые операционные системы поддерживают работу с процессорными средствами измерений с помощью специальных программ. Так, в Digital UNIX доступ к различным измерительным счетчикам в процессорах Alpha может быть осуществлен на основе обращений к профилирующим программам uprof ile и kprofile.
Итак, общая идея прямых измерений заключается в том, чтобы: выделить в программе интересующие пользователя фрагменты; определить для них точки входа и выхода; обращаясь к соответствующим счетчикам в этих точках, получить требуемые динамические характеристики программы. Однако практическая реализация этой идеи требует преодоления следующих трудностей.
Во-первых, фрагментация и соответствующая модификация кода программы не должны нарушать ее логической структуры. Во-вторых, основные источники погрешности прямых измерений — побочные эф™
фекты, обусловленные следующими факторами: особенности конкретной операционной системы, в частности, многозадачность, характерная для UNIX и LINUX, а также влияние архитектурных решений процессоров. Смысл, вкладываемый в термин «многозадачность», будет пояснен в § 4.3. Например, разброс оценок времени выполнения одной и той же программы в различных прогонах на одинаковых исходных данных может быть вызван такими механизмами, как динамическое предсказание переходов или загрузка кэш-памяти команд.
Необходимо заметить, что имеющиеся в операционных системах средства измерения, подобные утилите gettimeof day ( ) в UNIX, обладают довольно низкой разрешающей способностью, неприемлемой в ряде приложений. Например, упомянутая утилита для процессора Alpha 21164А с частотой 500 МГц обеспечивает разрешение всего 1 мс, что соответствует 500 000 процессорных циклов [136]. Кроме того, обращение к gettimeofday( ) предполагает медленный системный вызов, который может приводить к проблемам с памятью, в частности, могут иметь место многочисленные промахи при обращении к кэш-памяти, когда пользовательская программа возобновляет работу.
Основные этапы методики прямых измерений сложности для программ на языке высокого уровня включают в себя:
фрагментацию кода по специальным правилам;
динамический анализ программы в серии прогонов;
обработку экспериментальных результатов для нейтрализации побочных эффектов.
Далее в этом параграфе мы рассмотрим первый и второй этапы методики. Третьему этапу посвящен следующий параграф.
Фрагментация исходного кода программы. Рассмотрим основные правила фрагментации текста на языке C++. Коды, соответствующие началу и окончанию фрагмента, будем обозначать как <старт> и <стоп>. Простейший случай фрагментации — разбиение всей программы на линейные участки. Модификация текста, заключающаяся в расстановке контрольных точек <старт>, <стоп>, при этом не нарушает логики работы программы. В действительности же часто заголовки циклов и операторов выбора относятся к одним фрагментам, а последующие блоки — к другим. Тривиальная расстановка точек начала и окончания приведет в этом случае к нарушению логической структуры программы, например:
<старт41> /♦ начало фрагмента fl ♦/
fscanf(f,"Xc",&ar[i]);in++;
while(ar[i]!=’ ’)
{
<CTonfl> /♦ окончание фрагмента fl ♦/
<CTaprf2> /♦ начало фрагмента f2 ♦/
ina[ink] [2]=in-l;
ink++;
fscanf(f,"%c",&ar[i]);
<CTonf2> /♦ окончание фрагмента f2 ♦/ }
ar [i] = ’\0J;
Очевидно, что при такой расстановке контрольных точек будут получены неверные данные о сложности фрагмента fl. Чтобы избежать некорректных оценок, вводятся специальные правила фрагментации и используются алгоритмы оценки сложности для так называемых особых случаев, которые разбираются ниже.
Правило 1. Фрагмент должен начинаться и заканчиваться на одном и том же структурном уровне:
if ((strcmp(ar,"unsigned short") ==0) ||
(strcmp(ar,"signed short")==0))
{
<старт> ar[i] = ’ ’;
fscanf(f,"%c",&ar[i]);
flag=l;
<стоп1> /♦ допустимая точка окончания фрагмента ♦/
}
ch=ar[i] ;
ar [i] = ’\0J
<стоп2> /♦ неверно! Если условие перехода ложно,
то начало фрагмента не выполнится,
а окончание выполнится ♦/
Правило 2. Фрагменты не должны перекрываться. Исключения составляют особые случаи, например оценка заголовков циклов (см. далее случай 2).
Правило 3. Каждый новый структурный уровень должен быть заключен в конфигураторные скобки {}, даже если он содержит лишь один оператор:
if(name[j] ==’ = ’)
{
<старт>
fscanf(f,"%c",&ar[i]);
<стоп>
}
Ясно, что без конфигураторных скобок функция fscanf выпадает из области действия оператора выбора.
Правило 4. Каждый новый структурный уровень блоков необходимо начинать с новой строки.
Рассмотрим четыре особых случая фрагментации и оценки сложности.
Случай 1. Если фрагмент оканчивается заголовком оператора выбора if, то следующая строка кода не является однозначно определяемым выходом фрагмента.
Тогда необходимо поставить две точки выхода: первую — непосредственно после if в случае истинности условия выбора, вторую — на альтернативной ветви:
<старт1>
if(Num == (OPR - 2))
{
<стоп1> /♦ первая точка выхода ♦/
TAB [Num] [3] [i] = min(cfl, cf2);
TAB[Num][3] [i] = OptValue ((OPR-1), TAB[Num][1] [i]);
TAB [Num] [4] [i] = TAB [Num] [3] [i] + TAB [Num] [2] [i] ;
}
<стоп2> /♦ вторая точка выхода ♦/ или
<старт1>
if(Num == (OPR - 2))
{
<стоп1> /♦ первая точка выхода ♦/
TAB [Num] [3] [i] = min(cfl, cf2);
TAB [Num] [3] [i] = OptValue ((OPR-1), TAB[Num][1] [i]);
TAB [Num] [4] [i] = TAB [Num] [3] [i] + TAB [Num] [2] [i] ;
}
else
{
<стоп2> /♦ вторая точка выхода ♦/
TAB [Num] [3] [i] = table (TAB, TAB [Num] [1] [i] , (Num+1) , a) ;
TAB [Num] [4] [i] = TAB [Num] [3] [i] + TAB [Num] [2] [i] ;
}
Случай 2. Если фрагмент содержит заголовок цикла for, while, то нельзя ставит/ь точку окончания фрагмента сразу после объявления цикла, поскольку количество выходов из фрагмента превысит количество входов.
Для оценки сложности таких фрагментов можно использовать следующий алгоритм. Включить в оцениваемый фрагмент весь цикл, затем вычесть суммарную сложность выполнения тела цикла. При этом допускается перекрытие фрагментов:
<старт fl> /♦ начало фрагмента fl ♦/
fscanf(f,"Xc",&ar[i]);in++;
while(ar[i]!=’ ’) /♦ заголовок цикла ♦/
<старт f2> /♦ начало тела цикла ♦/
ina[ink] [2]=in-l;
ink++;
<стоп f2> /♦ окончание фрагмента f2 ♦/
<старт f3> /♦ начало фрагмента f3 ♦/ fscanf(f,”%c”,&ar[i]);
<стоп f3> /* окончание тела цикла */
}
<стоп fl> /♦ окончание фрагмента fl ♦/
ar [i] = ’ \ 0 ’;
Истинная сложность S(fl)HCT фрагмента fl при этом составляет
S (f 1)ист = S (fl) - £ (Si (f2) + Si (f3)),
где S(fl) — суммарная сложность фрагмента fl и цикла; Si (f2), Si (f 3) — значения сложности фрагментов f 2 и f 3, составляющих тело цикла в г-й итерации; п — число итераций.
Случай 3. Если во фрагменте сети операторы break, continue, goto, return, то резко изменяется трасса выполнения программы.
Пусть фрагмент содержит оператор return. Тогда фрагментация выполняется следующим образом. Если начало фрагмента лежит вне тела функции, то выполнение return не приведет к выходу за пределы фрагмента. В противном случае, если фрагмент начинается внутри тела функции, он не может закончиться вне ее (на более высоком структурном уровне). Поэтому перед return ставится точка окончания текущего фрагмента. Рассмотрим примеры.
Начало фрагмента вне тела функции:
<старт>
table (МТ[1] ,МТЕО] [1] [i], а);
<стоп>
float table (MYTABLE far &TAB, float z, float М3)
TAB[0][l]=z-M3;
TAB[1] [1]=M3;
if (MT[O][1][i]<(z+M3))
Начало фрагмента внутри тела функции:
float table (MYTABLE far &TAB, float z, float М3)
<старт>
TAB[O] [l]=z-M3;
TAB[1] LU =M3;
if (MT EO]El]Ei]<(z+M3))
<СТОП1>
return (TAB El]El]);
else
return (ТАВ[1][1]);
<стоп2>
return (ТАВ[О][1]);
else
return (TAB[0][1]);
Оператор break прекращает выполнение цикла for, while. Возможны следующие варианты фрагментации. Один вариант — выполнение цикла осуществляется в рамках текущего фрагмента:
<старт>
fprintf (res,’’First Граф \n");
for (int j=0;j<NV;j++) /♦ заголовок цикла ♦/ {
fprintf (res,"%d",tree_new[i][j]);
if (tree_new[i][j] ==0)
{
break;
}
fprintf (res,"\n");
}
<стоп>
Второй вариант — происходит переход к другому фрагменту. В этом случае заголовок и тело цикла принадлежат разным фрагментам, и выход из текущего фрагмента ведет к началу нового фрагмента:
<старт fl>
fprintf (res,"First Граф \n");
for (int j=0;j<NV;j++) /* заголовок цикла ♦/
{
<старт f2> /♦ начало тела цикла ♦/ fprintf (res,"%d",tree_new[i] [j]);
if (tree_new[i][j] ==0)
{
<стоп f2>
break;
}
fprintf (res,"\n");
<стоп f2>
}
<стоп fl>
Оператор continue приводит к следующей итерации цикла. При этом опять-таки возможно выполнение цикла в рамках текущего фраг-
мента либо переход к другому фрагменту. После continue выполняется заголовок, затем первая строка тела цикла. Граница фрагмента не может проходить сразу после заголовка — в этом случае она переносится за пределы цикла. Поэтому если оператор continue приводит к выходу за пределы фрагмента, то заголовок и тело принадлежат различным фрагментам. Приведем соответствующие примеры.
Случай без выхода из фрагмента:
<старт>
fprintf (res,"First Граф \n") ;
for (int j=0;j<NV;j++)
fprintf
(res,"Zd",tree_new[i] [j]);
if (tree_new[i][j] ==0)
continue;
}
fprintf (res,"\n");
}
<стоп>
Случай с выходом из фрагмента:
<старт fl>
fprintf (res,"First Граф \n");
for (int j=0;j<NV;j++)
<старт f2>
fprintf
(res,"%d",tree_new[i] [j]);
if (tree_new[i][j] ==0)
<стоп f2>
continue;
}
fprintf (res,"\n");
<стоп f2>
}
<стоп fl>
Оператор goto — безусловный переход к метке. После метки, на которую осуществляется переход, ставится точка входа в соответствующий фрагмент. При этом могут возникнуть следующие ситуации.
Нет выхода за пределы фрагмента:
<старт>
for (i=0;i<k;i++)
Dsk = seal (D, n[i]);
Wsk = seal (w[i] , n[i]);
t = -Wsk/Dsk;
tv = min(t,tv);
if (t>l)
goto 14;
}
}
Выход за пределы текущего фрагмента:
<старт fl>
for (i=0;i<k;i++)
{
<старт f2>
Dsk = seal (D, n[i]) ;
Wsk = seal (w[i] , n[i]);
t = -Wsk/Dsk;
tv = min(t,tv);
if (t>l)
<стоп f2>
goto 14;
}
<стоп f2>
}
14: RI.Init(-10000,-10000);
<стоп>
<стоп fl>
<старт f3> /♦ начало фрагмента, содержащего метку 14 ♦/
14: <старт f3>
RI.Init(-10000,-10000);
Случай 4. Если фрагмент включает часть конструкции switchcase, то необходимо особо оговорить допустимую расстановку границ фрагментов. Кроме того, как и в случае с циклами, заголовок switch мозюет быть включен в один фрагмент, а альтернативы case — в другие.
Рассмотрим примеры.
Вся конструкция включена в один фрагмент:
<старт fl>
switch (TYP){
case 0:
bi_one(tree_old,n); break;
}
case 1:
bi_two(tree_old,n); break;
}
case 2:
bi_three(tree_old,n);
break;
}
default:
printf("Wrong TYP!"); break;
}
}
<стоп fl>
Заголовок и альтернативы принадлежат разным фрагментам: <старт fl> switch (TYP){
<стоп fl> /♦ недопустимая точка окончания ♦/
case 0:
<старт f2> bi_one(tree_old,n); break;
<стоп f2>
case 1:
<старт f3> bi_two(tree_old,n) ; break;
<стоп f3>
}
case 2:
<старт f4>
bi_three(tree_old,n); break;
<стоп f4>
}
default:
<старт f5>
printf("Wrong TYP!"); break;
<стоп f5>
}
}
При этом нельзя поставить точку окончания фрагмента сразу после заголовка switch. Компилятор это допускает, однако точка никогда не будет исполнена при любом значении выражения выбора. Такие фрагменты оцениваются аналогично заголовкам циклов: включить в оцениваемый фрагмент весь switch, затем вычесть суммарную сложность выполненных case-ветвей.
Здесь допускается перекрытие фрагментов:
<старт fl>
switch (TYP) {
case 0:
{
сстарт f2> bi_one(tree_old,n); break;
<стоп f2>
}
{
<старт f3> bi_two(tree_old,n); break;
<стоп f3>
}
{
<старт f4> bi_three(tree_old,n); break;
<стоп f4>
}
default:
{
<старт f5>
printf("Wrong TYP!"); break;
<стоп f5>
}
}
<стоп fl> /♦ допустимая точка окончания ♦/
Каждой альтернативе должен соответствовать свой фрагмент. Нельзя объединить несколько альтернатив в одном фрагменте, поскольку в соответствии с синтаксисом языка C++ точки начала и окончания фрагмента просто не будут выполнены:
switch (TYP) {
Сстарт f2>
case 0:
{
bi_one(tree_old,n); break;
}
§ 4-2. Прямые измерения времени выполнения программ 159 case 1:
bi_two(tree_old,n); break;
}
<стоп f2>
}
При реальном прогоне некоторые участки кода могут не исполняться из-за наличия условных ветвлений, циклов, зависящих от данных, и т. д. Использование стандартных отладчиков операционных систем, подобных gdb в LINUX и позволяющих принудительно изменять ход выполнения программы, имеет следующий недостаток. Трудно, если вообще возможно, подобрать такие значения исходных данных, при которых оценка сложности выделенного фрагмента будет близка к реальной, получаемой в результате прогона программы. Для корректной оценки сложности таких участков кода должны быть реализованы соответствующая фрагментация текста программы согласно сформулированным правилам и разобранным особым случаям, а также статистическая обработка результатов эксперимента.
4.2.3. Эксперименты с фрагментированной программой. После фрагментации реализуется эксперимент — серия прогонов программы на одних и тех же исходных данных. Под прогоном понимается однократное выполнение программы. Для каждого фрагмента вводится переменная-счетчик, в которой накапливается суммарная сложность в процессорных циклах. Сложность однократного исполнения определяется как разность моментов окончания и начала выполнения фрагмента. Для этого в экспериментах на Pentium-совместимых процессорах осуществляется обращение к 64-разрядному счетчику TSC в контрольных точках каждого из выделенных фрагментов. Как уже говорилось, в процессорах семейства Alpha имеется аналог счетчика TSC и соответствующая команда доступа к нему грсс. Для чтения содержимого счетчика TSC в средах IA-32 и Itanium используется специальная команда RDTSC (Read Time-Stamp Counter), имеющая код OF 31 [110].
Аналогичный счетчик имеется и в процессорах SPARC. Кроме того, в операционную систему Solaris начиная с версии 2.4 введена функция высокоточного измерения времени gethrtime ( ), ориентированная на архитектуру SPARC. Эта функция, подобная команде RDTSC для процессора Pentium, возвращает абсолютное значение времени и использует «быстрый» системный вызов.
Содержимое счетчика TSC накапливается в 64-разрядном модельном специализированном регистре MSR (model specific register). Старшие 32 разряда регистра MSR загружаются в регистр EDX, а младшие 32 разряда в регистр ЕАХ. Процессор инкрементирует содержимое регистра MSR в каждом цикле и обнуляет его при перезагрузке. Использование 64 разрядов позволяет измерять сложность довольно больших фрагментов программ: так, переполнение счетчика в процессоре
Itanium на частоте 800 МГц может наступить лишь через 6 405 119 ч. Важно, что команда RDTSC доступна программам с пользовательским приоритетом. В среде IA-32 действие этой команды ограничивается флагом TSD (time stamp disable), устанавливаемым в регистре CR4. Если флаг TSD не установлен, то инструкция RDTSC может выполняться на любом уровне привилегий. В случае его установки для обращения к TSC необходим привилегированный уровень (CPL=0). В среде Itanium ограничения на использование команды RDTSC определяются флагами PSR.si и CR4.TSD в регистрах PSR и CR4 соответственно. Когда эти флаги сброшены, доступ к счетчику может быть осуществлен на любом уровне привилегий. Когда же один из них либо оба установлены, необходим уровень операционной системы.
Подобно инструкции RDPMC, команда обращения к счетчику TSC не линеаризует анализируемый код. Нет необходимости ожидать, пока будут выполнены все инструкции, предшествующие чтению содержимого счетчика. Также не нужно требовать, чтобы все инструкции, следующие за командой RDTSC, выполнялись после завершения обращения к счетчику. Команда, о которой идет речь, впервые была введена в процессоры Pentium. В защищенном режиме исключение #GP(0) вызывается лишь тогда, когда установлен флаг TSD и уровень привилегий CPL больше 0. В режиме реальной адресации и виртуальном режиме наступает исключение #GP и ^GP(O) соответственно всегда, когда в регистре CR4 установлен флаг TSD. В среде Itanium происходит исключение ^GP(O) в случае, когда установлены флаги PSR.si или CR4.TSD, а уровень привилегий больше 0.
На псевдокоде выполнение команды RDTSC может быть записано так:
IF (IA-32 System Environment) /♦ среда IA-32 ♦/ IF (CR4.TSD=0) OR ((CR4.TSD=1) AND (CPL=O))
THEN
EDX:EAX TimeStampCounter; /♦ загрузка содержимого TSC */
ELSE (*CR4 is 1 and CPL is 1, 2, or 3*)
#GP(O) /♦ исключение ♦/
FI;
ELSE (Itanium System Environment) /♦ среда Itanium ♦/ SECURED=PSR.si || CR4.TSD;
IF (!SECURED) OR (SECURED AND (CPL=O))
THEN
EDX:EAX TimeStampCounter; /♦ загрузка содержимого TSC */
ELSE (*CR4 is 1 and CPL is 1, 2, or 3*)
#GP(O) /♦ исключение ♦/
FI;
FI;
Заметим, что содержимое счетчика TSC может считываться и с помощью команды RDMSR (Read from Model Specific Register) [110]. Она имеет код OF 32 и загружает содержимое регистра MSR, адрес которого хранится в регистре ЕСХ, в регистры общего назначения EDX:EAX. Если не все 64 разряда в регистре MSR задействованы под счетчик, то содержимое соответствующих разрядов в EDX:EAX никак не определяется. Инструкция RDMSR должна выполняться только операционной системой (CPL=0) либо в режиме реальной адресации (в виртуальном режиме эта команда не распознается). В противном случае всегда генерируется исключение #GP(0) в защищенном режиме либо #GP в режиме реальной адресации. Указание на зарезервированный либо незадействованный регистр MSR всегда вызывает исключение общей защиты. Команда RDMSR была введена в семейство процессоров Pentium. Попытка ее использования в более ранних моделях процессоров вызывает исключение #UD (Undefined Opcode) — неправильный, недостоверный код. Рассматриваемая команда выполняется и в среде Itanium:
IF Itanium System Environment
THEN IA^32^Intercept (INST,RDMSR); EDX:EAX MSR[ECX];
Теперь рассмотрим, как использовать команду чтения счетчика RDTSC для динамического исследования программы на языке высокого уровня.
Обращение к счетчику TSC в операционной системе LINUX осуществляется следующим образом:
_asm_volatile (".byte OxOf, 0x31":=
"А"(<имя переменной>));
Необходимо также внести изменения в исходный код программы. Точка начала фрагмента обозначается кодом вида:
unsigned long longf9;
_asm_volatile (".byte OxOf, 0x31" : "=A" (f9));
Здесь f 9 — имя фрагмента.
В точке окончания фрагмента вставляется код
unsigned long longf9end;
_asm_volatile (".byte OxOf, 0x31" : "=A"(f9end)); printf("\n00000000 f9: %d\n",f9end™f9);
Здесь 00000000 — последовательность символов, отделяющая результаты прямых измерений от другой информации.
Конечно, подобные модификации текста программы не грозят большими накладными расходами, существенно влияющими на достоверность измерений. Это затраты порядка одного™двух процессорных циклов для вызова команды RDTSC. Главная проблема заключается в другом: как из результатов динамического анализа выявить информацию,
относящуюся к исследуемой программе и отбросить ненужные, посторонние эффекты, никак не связанные со свойствами самой прикладной программы? Этой проблеме и посвящен следующий параграф.
Побочные эффекты
в экспериментальных исследованиях программ
Влияние особенностей операционной системы и архитектуры процессора. В предыдущем параграфе уже говорилось, что на результаты прямых измерений очень сильно влияет операционная система, оптимизирующее влияние компилятора и архитектура процессора (в понятие архитектуры мы включаем и микроархитектур- ный уровень, и уровень архитектуры команд [46]).
Далее мы сосредоточим внимание на программах, выполняемых в операционной системе LINUX на Pentium-совместимых процессорах. Однако для того чтобы проиллюстрировать общность проблемы побочных эффектов, еще раз обратимся к [136], где исследуется динамика программ для процессоров Alpha, исполняемых в среде LINUX. Как показано в упоминаемой работе, с помощью функций realcc( ) и virtcc( ) можно подсчитать число циклов процессора, затрачиваемых на прогон исследуемых участков программы. Так, программа на языке С, которая позволяет подсчитать число циклов при 10 вызовах функции вычисления квадратного корня sqrt(2.0), выглядит следующим образом:
void measure_sqrt (void){
u_int start, stop, time[10]; int i; double x =2.0;
for (i=0; i<10; ++i) {
start=realcc();sqrt (x) ; stop=realcc(); time[i]=stop - start;
}
for (i=0; i<10; ++i) printf("Xu", time[i]);
printf("W);
}
Заметим, что вывод результатов (printf) осуществляется в отдельном цикле, поскольку требует системных вызовов. Если бы функция printf была включена в основной цикл, результаты эксперимента были бы менее достоверными из-за влияния ОС.
При выполнении этой программы на процессоре Alpha 21164 число циклов, затрачиваемых на каждый из 10 вызовов функции sqrt(2.0), соответственно равно:
123456789 10 (вызовы);
120 101 101 101 101 101 101 101 101 101 (число циклов).
Из этих данных видно, что первый вызов выполняется медленнее, чем остальные девять. Очевидно, это обусловлено тем, что перед пер™
вым вызовом кэш-память команд первого уровня еще не загружена (эффект «холодного» кэша). Функция же sqrt( ) достаточно компактна, чтобы разместиться в кэше первого уровня процессора Alpha 21164. Поэтому все последующие вызовы этой функции требуют одинакового количества циклов. Есть еще одна особенность в этом характерном примере — использование функции realccO, а не virtcc( ) (напомним, последняя возвращает «чистое» время прогона). Функция realcc( ) позволяет выявить такой побочный эффект, как влияние переключения контекстов. Здесь важно различать системные вызовы, обусловленные самой исследуемой программой (как было бы в случае, если бы функция вызова printf находилась в основном цикле), и обращения к операционной системе, никак не связанные с выполнением приложения.
Примером такого побочного влияния на результаты измерений и является переключение контекстов, значительно замедляющее исполнение прикладной программы. Попытаемся разобраться, в чем тут дело. В современных RISC-процессорах таких, как Itanium, семейства Alpha и SPARC, особым образом организовано виртуальное адресное пространство. В контроллере памяти имеется буфер быстрого преобразования адреса TLB (translation lookaside buffer). По своей сути это таблица, отображающая адреса виртуальных страниц в адреса физических страниц [46]. Число виртуальных страниц огромно. Поэтому TLB содержит адреса последних используемых виртуальных страниц. Когда процесс вызывает контекст, виртуальный адрес в этом контексте, обозначенном некоторым кодом, передается в контроллер памяти. Там происходит сравнение адреса виртуальной страницы со всеми элементами буфера TLB для данного контекста. При совпадении формируется адрес физической страницы. В противном случае имеет место промах в TLB, который вызывает срабатывание ловушки (trap) в операционной системе. При этом вызывается специальная процедура — обработчик системных прерываний. Выполнение приложения, разумеется, приостанавливается до окончания обработки ловушки. Таким образом, переключение контекста может быть вызвано срабатыванием ловушек в операционной системе. Другое проявление этого механизма, не связанное с конкретными архитектурными особенностями RISC- процессоров, — это прерывания. В отличие от срабатывания ловушек, прерывания вызываются косвенно, асинхронно по отношению к выполняемой программе. Обычно прерывания связаны с процессами ввода/вывода.
Примеры исследования сложности программ. Итак, в основном нас будут интересовать побочные эффекты измерения сложности фрагментов программ, обусловленные особенностями архитектуры процессоров и операционной системы. Для анализа влияния на погрешность оценки сложности операционной системы LINUX [129] мы проведем сравнительный анализ экспериментальных результатов,
полученных и в MS DOS. Нужно заметить, что в общем случае необходима серия экспериментов с различными исходными данными, если время выполнения программы зависит от их вида.
Рассмотрим результаты измерения сложности четырех фрагментов теста Linpack из источника [128] при числе линейных уравнений, равном 100. Чтобы исключить влияние исходных данных, коэффициенты системы линейных уравнений во всех прогонах эксперимента берутся одинаковыми. Первый фрагмент (fl) представляет собой вычисление коэффициентов, второй (f2) вычисление множителей для метода последовательных исключений Гаусса, которым решается система уравнений, третий (f3) и четвертый (f4) фрагменты соответствуют процедуре решения системы уравнений. В табл. 4.1 показаны результаты эксперимента из пяти прогонов в ОС LINUX [129] на участке трассы программы из 25 шагов на платформе Pentium MMX с частотой 200 МГЦ, оперативной памятью (DIMM) 128 Мбайт и частотой системной шины 83 МГц. Здесь ММХ означает расширение системы команд для мультимедиа-задач (multimedia extensions), a DIMM — модуль памяти с двухсторонними выводами (dual inline memory module). Под шагом понимается однократное исполнение фрагмента.
Как видно из результатов одного и того же прогона, имеют место разбросы сложности двух типов. Разбросы первого типа — это увеличение сложности на 0,3-39 % относительно минимального значения. Другой тип — это приращения порядка 107 процессорных циклов, причем эти «выбросы» наблюдаются на различных шагах прогона фрагмента при одних и тех же исходных данных; в табл. 4.1 — это шаги г + 18, г + 5 и г, г + 11 в прогонах 1, 3 и 4 соответственно. Причина заключается в переключении контекстов операционной системы на другие (в данном случае внутренние) задачи, никак не связанные с исследуемой программой. В частности, это может быть обработка аппаратного прерывания таймера. Разбросы первого типа также носят случайный характер и, очевидно, обусловлены влиянием архитектуры процессора: использованием кэш-регистров, конвейеризацией и сцепкой команд, а в целом — высоким уровнем внутреннего параллелизма процессора.
Итак, «выбросы» сложности объясняются многозадачной природой ОС LINUX. Здесь необходимо сделать несколько пояснений. Термин «многозадачность» нами используется для обозначения целого комплекса понятий, характерных для таких сложно организованных операционных систем, как UNIX, LINUX, Windows NT. Прежде всего, это виртуальная память, виртуальные команды ввода/вывода и средства параллельной обработки. На одном процессоре путем разделения времени может моделироваться несколько процессов, системы поддерживают несколько потоков управления (threads) в пределах одного процесса. Такая сложная организация ОС не может не проявляться в виде некоторых побочных эффектов, подобных рассматриваемым в этом параграфе, даже если процессор занят выполнением единственной программы. Чтобы убедиться в этом, сравним результаты эксперимен-
Таблица 4.1
Сложность фрагментов теста Linpack на участке трассы в разных прогонах
Шаг
Фрагмент
Прогон
1
2
3
4
5
г
fl
260 181
259 801
260 434
259 826
г + 1
f2
1 876 015
1 882 509
1 876 037
1 882 268
1 876 038
i + 2
fl
260 536
259 714
259 908
260 241
260 025
г + 3
f2
1 881 737
1 881 833
1 875 827
1 875 925
1 881 306
г + 4
fl
259 779
259 829
259 725
259 725
259 794
г + 5
f2
1 875 908
1 876 112
1 882 379
1 876 070
г + 6
fl
259 706
273 009
261 092
259 872
259 713
i + 7
f2
1 881 765
1 876 049
1 893 307
1 881 607
1 881 835
i + 8
fl
259 764
259 710
259 959
259 781
259 755
г + 9
f2
1 883 881
1 905 222
1 884 391
1 875 923
1 875 860
г 4- 10
fl
260 107
260 403
259 810
259 710
266 053
г 4- П
f2
1 875 903
1 875 895
1 875 792
1 876 064
г 4- 12
fl
259 707
268 264
259 706
261 287
259 697
г + 13
f2
1 882 161
1 876 529
1 881 698
1 893 474
1 881 350
г + 14
fl
259 877
259 704
259 724
259 885
259 784
г + 15
f2
1 875 752
1 881 517
1 881 342
1 907 391
1 875 762
г + 16
fl
272 672
259 764
259 764
260 396
259 704
г + 17
f2
1 876 829
1 888 189
1 875 771
1 875 942
1 881 587
г + 18
fl
259 716
259 746
270 871
259 810
г + 19
f2
1 881 983
1 885 407
1 876 831
1 884 537
1 888 576
г + 20
f3
6 775
6 788
7 249
6 870
6 539
г + 21
f4
5 951
5 889
7 791
6 000
5 849
г + 22
f3
6 233
6 286
6 233
6 301
6 233
г + 23
f4
5 603
5 603
5 603
5 603
5 603
г+ 24
f3
6 248
6 248
6 248
6 248
6 248
та для одного и того же фрагмента f2 теста Linpack на процессоре Pentium, а также на платформе Celeron с частотой 333 МГЦ, оперативной памятью 128 Мбайт (DIMM) и частотой системной шины 66 МГц в разных операционных системах — LINUX (рис. 4.7, а, в) и MS DOS (рис. 4.7, б, г). Из-за ограничений на размер памяти в MS DOS число линейных уравнений в тесте Linpack было сокращено со 100 до 40. MS DOS не позволяет непосредственно обращаться к регистрам общего назначения ЕАХ и EDX. Поэтому нужно изменить коды начала и окончания фрагментов, следующим образом.
аб
ггУсредненная суммарнаясложность f 2 (MS DOS, Celeron)
г
г
в
Рис. 4.7. Результаты экспериментов в различных ОС на процессоре Pen
tium (а, б) и Celeron (в, г)
Код начала фрагмента:
asm { db OxOf; db 0x31; } /* загрузка содержимого TSC в регистры EAX:EDX */
asm movfl,DX;/*чтениемладших16разрядовEDX*/
asm { db 0x66;dbOxcl; db Oxea;db0x10; } /* сдвиг
содержимого регистра EDX вправо на 16 разрядов */
asm movf2,DX;/*чтениестарших16разрядовEDX*/
asm movf3,AX;/*чтениемладших16разрядовEAX*/
asm { db 0x66; db Oxcl; db 0xe8; db 0x10; } /* сдвиг
содержимого регистра EAX вправо на 16 разрядов */
asm mov f4,AX; /* чтение старших 16 разрядов ЕАХ */
Соответствующие изменения по аналогии вносятся и в код окончания фрагмента:
asm { db OxOf; db 0x31; }
asm mov f11,DX;
asm { db 0x66; db Oxcl; db Oxea; db 0x10; }
asm mov f2,DX;
asm mov f3,AX;
asm { db 0x66; db Oxcl; db 0xe8; db 0x10; }
asm mov f4,AX;
f5=f3+f4*pow(2,16)+fl*pow(2,32)+f2*pow(2,48);
f5end=f13+f14*pow(2,16)+fll*pow(2,32)+f12*pow(2,48);
printf("\n 00000000 f5 : %10.Of\n",f5end-f5);
Разброс среднего по прогонам значения суммарной сложности в MS DOS практически отсутствует, что подтверждает гипотезу происхождения «выбросов», вызванных многозадачностью LINUX.
Погрешность прямых измерений. Оценим относительную погрешность прямых измерений, вызванную побочными эффектами. Пусть выполняется эксперимент, состоящий из R прогонов программы. Рассмотрим любой из них. Обозначим через t максимальное относительно минимума Smin приращение сложности выделенного фрагмента, г — число шагов прогона этого фрагмента, р — количество «выбросов» в данном прогоне фрагмента, S — суммарную сложность фрагмента без учета «выбросов». Сложность любого из »выбросов» оценим величиной (1 + t) Sm-m.
Относительная погрешность измерения сложности фрагмента в одном прогоне не превышает величины
е _ (5 + р (1 + t) Smin) - (S + pSmin)S + р (1 + t) Sminе _ (5 + р (1 + t) Smin) - (S + pSmin)S + р (1 + t) Smin100 % =100 % =pt SminS + p(l + t) Smipt SminS + p(l + t) Smi100%.100%.
е _ (5 + р (1 + t) Smin) - (S + pSmin)
S + р (1 + t) Smin
е _ (5 + р (1 + t) Smin) - (S + pSmin)
S + р (1 + t) Smin
100 % =
100 % =
pt Smin
S + p(l + t) Smi
pt Smin
S + p(l + t) Smi
100%.
100%.
В свою очередь
d и A =d и A =pt Sminpt Smin(г - р) Smin + р (1 + t) Smi(г - р) Smin + р (1 + t) Smi100% = -4— ■ 100%.T/p + t100% = -4— ■ 100%.T/p + t
d и A =
d и A =
pt Smin
pt Smin
(г - р) Smin + р (1 + t) Smi
(г - р) Smin + р (1 + t) Smi
100% = -4— ■ 100%.
T/p + t
100% = -4— ■ 100%.
T/p + t
Относительная погрешность эксперимента по измерению сложности любого фрагмента не превышает максимального из значений А по всем R прогонам. Так, для эксперимента, результаты которого приведены в табл. 4.1, ее значения не превышают 0,5% для фрагмента fin 0,2% - для f2.
Если фрагмент исполняется однажды, то берется максимальное приращение t* относительно минимальной сложности по R прогонам программы. Тогда верхняя граница относительной погрешности равна А = ? гДе — число «выбросов» в эксперименте. При этом коэффициент I* учитывает и компонент погрешности, обусловленный влиянием архитектуры процессора.
На рис. 4.8 показаны результаты экспериментов в ОС LINUX на процессоре Pentium для четырех выделенных фрагментов теста Lin- pack. Приведены значения непосредственно измеряемой сложности и результаты ее обработки с учетом «выбросов».
Как правило, практически приемлемая оценка сложности получается уже после трех прогонов, поскольку вероятность «выброса»
Усредненная суммарная сложность f 2Усредненная суммарная сложность f 2Усредненная суммарная сложность f 1Усредненная суммарная сложность f 1Число прогонов бЧисло прогонов бУсредненная суммарная сложность f 4Усредненная суммарная сложность f 4
Усредненная суммарная сложность f 2
Усредненная суммарная сложность f 2
Усредненная суммарная сложность f 1
Усредненная суммарная сложность f 1
Число прогонов б
Число прогонов б
Усредненная суммарная сложность f 4
Усредненная суммарная сложность f 4
| измерения обработка
Рис. 4.8. Результаты экспериментов на четырех фрагментах теста Linpackв ОС LINUX
сложности фрагмента на одном и том же шаге в разных прогонах ничтожно мала (см. табл. 4.1 и рис. 4.8). Так, при однократном выполнении фрагмента, если t* = 0,5, R = 3, Р = 1, то А = 11%. Как уже отмечалось, если сложность зависит от исходных данных, то необходима серия экспериментов с различными их значениями.
Таким образом, методика прямых измерений времени выполнения программ не требует детального моделирования аппаратуры и ориентирована на доступность процессорных узлов, из которых строится целевая вычислительная платформа. Выше рассмотрены правила фрагментации исходного текста на языке высокого уровня, не нарушающие структуру программы. Реализация методики измерений рассчитана на архитектурные решения современных RISC-процессоров, а также процессоров, имеющих черты VLIW-компьютеров, например Itanium. Побочные эффекты измерений заключаются во влиянии операционной системы и аппаратуры. Выше рассмотрен подход для динамического анализа программ и обработки его результатов с учетом побочных эффектов.
Комментарий и краткий обзор к главе 4
Необходимость оценивания времени выполнения программ или их выделенных фрагментов возникает в ряде задач. Их примеры: планирование и динамическое управление параллельными процессами в реальном времени [16, 109], прогнозирование динамики программ целевого вычислителя на основе моделирования в инструментальной среде [5, 66], масштабирование модели обработки при выборе архитектурных решений вычислительных систем [50, 51].
В [5, 66] рассматривается статико-динамический подход к исследованию программ с однократно выполняемым статическим анализом модельного кода. Если время выполнения программы зависит от исходных данных, то погрешность оценки сложности фрагментов в статике может быть весьма велика. Однако в таких приложениях, как цифровая обработка сигналов, точность получаемых оценок практически не уступает точности эмуляции на уровне системы команд процессора. При этом, правда, необходимо заметить, что моделирование процессоров цифровой обработки сигналов оказывается значительно проще моделирования суперскалярных процессоров и VLIW-процессоров. Это объясняется, в частности, отсутствием иногда кэш-памяти и несложной организацией конвейера команд.
Описание метода частотных счетчиков и его модификаций, которые могут использоваться в динамическом анализе программ, дается в работе [23].
В работах [69, 80] были предложены модели и алгоритмы генерации оптимального кода для стековых [80] и регистровых [69] машин. Однако рассматриваемые в этих работах модели вычислителей, в которых время выполнения кода пропорционально его длине, неприменимы к современных процессорам с высокой степенью внутреннего параллелизма.
Возможности параллельного выполнения команд и генерации параллельно выполняемых фрагментов кода могут быть реализованы динамически или статически, например в процессе компиляции. Последнее характерно для VLIW-архитектур [63], оптимизирующие компиляторы которых позволяют преобразовывать структуру программ и осуществлять оптимальное статическое планирование команд. Поскольку в таких вычислительных системах компилятор управляем со стороны описания архитектуры процессора, то условным становится и разделение моделирования процесса компиляции и функционирования аппаратуры в ходе анализа кода ассемблера (см. рис. 4.1). Разумеется, при этом нет необходимости в кросс™компиляторе, а потенциальная точность оценок статического анализа модельного кода становится выше.
Подход к оценке влияния целевой архитектуры систем реального времени на оценки сложности кода предложен в статье [154].
Методика прямых измерений сложности фрагментирования программ для RISC-процессоров описана в [56]. Анализ архитектурных особенностей современных RISC-процессоров фирм Intel, DEC, Sun, позволяющих реализовать прямые измерения, можно найти в [46, 110, 136].
Экспериментальные результаты, обсуждаемые в § 4.3, получены для платформ с ОС LINUX [129], компилятора gcc на тесте Linpack, доступном из источника [128].
Подробный анализ архитектуры команд процессоров Pentium II, UltraSPARC И, а также особенностей организации операционных систем Windows NT, UNIX и их работы на упомянутых процессорах приводятся в монографии [46].
ЧАСТЬ II
МОДЕЛИ РАСПРЕДЕЛЕНИЯ РЕСУРСОВ
Глава 5
ВЫБОР ЦЕЛЕВОЙ АРХИТЕКТУРЫ
§ 5Л. Отображение программы на ресурсы
Спецификация программы и ее представление целевой архитектурой. В предисловии и гл. 1 мы уже говорили о том, что масштабирование архитектуры может пониматься не только как наращивание вычислительных ресурсов, но и как их конфигурирование под конкретные приложения с целью повышения эффективности выполнения программ. Разумеется, здесь идет речь о сложных приложениях, состав которых априори известен, не изменяется в течение длительного времени функционирования системы и для выполнения которых необходимо эффективное использование дорогостоящих аппаратных платформ.
Нужно сказать, что существуют различные взгляды на то, что считать компьютерной архитектурой. Так, в свое время Г. фон Блаау, один из разработчиков вычислительной системы IBM 360, определил архитектуру как функциональное проявление свойств системы с точки зрения пользователя. В этой книге под архитектурой мы понимаем те аспекты компьютерной организации, которые видны программисту. По сути это очень близко к основным положениям книги [46].
В данном параграфе рассматривается задача отображения модели прикладной программы на -целевую архижекжуру — обобщенное представление структуры доступных вычислительных ресурсов и способа их функционирования. Окончательный вид целевой архитектуры, как правило, является результатом итеративного процесса, в значительной степени опирающегося на экспертные знания. Основная проблема выбора архитектуры как раз и связана с неполнотой знаний о возможной реализации функций системы для выполнения программы, ограничения на действия которой задаются спецификацией. Спецификация некоторая модель программы, а не готовый к исполнению код, позволяющая учесть наиболее существенные особенности структуры программы для выбора реализующей ее целевой архитектуры. Известно [9], что наличие формальных описаний целевой архитектуры компьютера и алгоритма создает конструктивную основу для автоматизации отображения программ на архитектуру и синтеза оптималь™
ных программ. Часто формальное описание архитектуры используется для классификации вычислительных систем и позволяет определить направление поиска новых архитектур. Для конечного пользователя классификация помогает понять особенности программирования и найти пути повышения реальной производительности той или иной вычислительной системы.
Пусть Ф — множество объектов спецификации, например, фрагментов кода на некотором языке, a G — число функций, которые должны быть реализованы целевой архитектурой^ля выполнения программы, специфицируемой Ф. Обозначим через X = (Xi,X2, . . . , Xg) упорядоченное семейство таких множеств, что элемент Xg С ^g^ g = = 1, . . . , G, определяет способ реализации соответствующей функции. Назовем Xg архитектурным признаком. Определим описание целевой архитектуры как систему различных представителей (трансверсаль) X = (хь • • • ? Xg) семействаХ. Напомним читателю, что трансверсалью [36, 38] семейства (Xi, Х2, . . . , Xg) подмножеств некоторого множества Е называется подмножество Т С Е, если существует биективное (взаимно однозначное) отображение -ф: Т -Э {1,2, . . . , G}, при котором для каждого у Е Т выполняется условие у Е Х^^у Другими словами, возможна такая нумерация элементов множества Т, при которой Xg С ЕХ^, где g = 1, . . . , G. Итак, трансверсаль — это произвольная пос™ ледовательность (xi, Х2, • • •, Ха), в которой xg € ^g и xg + Xh для g ^ h. Говорят, что элемент Xg представляет множество Xg. Подмножество Т С Е называется частичной трансверсалью семейства X, если существует инъективное отображение -ф: Т -Е {1,2, . . . , G}, при котором для каждого у Е Т имеет место у Е Ху^у Таким образом, описание архитектуры обеспечивает ортогональность и полноту ее представления набором соответствующих признаков. Частичное описание архитектуры — частичная трансверсаль вида ур = (у^, . . . , Хгк\ гДе 1 О ^ • • • ^ 1 ig G.
Формально задача представления спецификации целевой архитектурой сводится к отысканию отображения Ф X, которое задает
Спецификация Ф (|Ф|=5) Решетка процессоров (G = 4)
Рис. 5.1. Отображение спецификации на целевую архитектуру
разбиение множества Ф объектов спецификации на G блоков, соответствующих функциям архитектуры из семейства X (рис. 5.1).
Рассмотрим некоторые примеры описаний архитектуры. Положим, семейство X = (Х/,Хр) образовано признаками, являющимися способами организации потока команд и потока данных, а именно X/ = = {5/, М/}, Xd = {Sd, MdY Здесь Si и Mi обозначают одиночный и множественный потоки команд, a Sd^ Md — соответственно одиночный и множественный потоки данных. Тогда классификация архитектур вычислительных систем по Флинну может быть охарактеризована следующими наборами архитектурных признаков: ^S^Sd)-, (Sd Md^ (M^Sd\ ^цМр). В свою очередь набор (S'/, Md) частичное описание архитектур класса Multiple SIMD(MSIMD). Сюда относят нейрокомпьютеры и некоторые векторные системы типа Cray Y-MP, состоящие из нескольких векторных процессоров, которые часто причисляют к SIMD-компьютерам. (Следует, правда, заметить, что некоторые исследователи располагают векторно-конвейерные компьютеры, в частности, упомянутый Cray Y-MP, в другом классе — MIMD.)
По аналогии можно описать и другие известные классификации. Так, по Фенгу, описание архитектуры может быть задано парой признаков: числом разрядов машинного слова и числом одновременно обрабатываемых слов. Классификация Хендлера предполагает описание архитектуры тройкой признаков, обозначающих количество устройств управления, число арифметико-логических устройств в каждом из устройств управления и число групп элементарных логических схем в арифметико-логическом устройстве. Подобным же образом на основе семейства архитектурных признаков и их наборов возможно представить классификации Шнайдера и Скилликорна [9].
Однако поиск соответствующего описания целевой архитектуры — лишь часть дела. Необходимо увязать этот процесс с отображением на архитектуру важных особенностей реализуемых программ, содержащихся в их спецификациях. На начальных этапах выбора целевой архитектуры вряд ли целесообразно каждый раз переписывать программу под конкретную вычислительную систему. Наиболее существенные структурные характеристики программы могут быть выражены в ее спецификации, выбор адекватных средств для задания которой зависит от назначения и класса программных приложений. Некоторые из этих средств создаются как расширения стандартных языков, например, синтаксически близкий к С язык M2SPEC для спецификации поведения распределенных программ [72] (МГУ им. М.В. Ломоносова, факультет ВМиК). Выбор языка и создание систем спецификаций — это вопросы, требующие отдельного рассмотрения и выходящие за рамки данной книги. Наша задача заключается в согласовании процедур синтеза описания целевой архитектуры и отображения на нее структурных особенностей программы.
Приведем простой пример. Пусть необходимо выбрать структуру устройства для вычисления квадратного корня у = д/х по методу Ньютона и построить соответствующее разбиение шестиэлементного множества строк спецификации (рис. 5.2, а).
1 F™0.2 + 0.8*X
2 /:=0;
3 DO UNTIL/> 3 LOOP
4F:= 0.5 * (F+XX):
5/™/+1;
Рис. 5.2. Спецификация (а) и различные способы ее представления (б, в)Рис. 5.2. Спецификация (а) и различные способы ее представления (б, в)6 ENDDO
Рис. 5.2. Спецификация (а) и различные способы ее представления (б, в)
Рис. 5.2. Спецификация (а) и различные способы ее представления (б, в)
В соответствии со спецификацией Ф на рис. 5.2, а должны быть реализованы следующие функции: вычисление начального приближения у о = 0,2 + 0,8ж как линейной интерполяции на отрезке [1/16,1], определение текущего значения y^+i = 0,5 (yi + х (у^ и подсчет числа итераций г = 0, . . . , 3. Пусть эти функции могут быть выполнены на следующем семействе архитектурных признаков:
™ Хю Хо — вычисление уо соответственно на отдельном или том же вычислительном блоке, что И УгХ1б
- Ху — вычисление каждого из значений yipi на отдельном блоке; Ху — повторное использование блока для вычисления yi^-i;
- xi — подсчет числа итераций на отдельном блоке; у? — подсчет итераций на блоке для вычислений уо и y^+i; yf — вычисление индекса г после вычисления уо^ yi^i] Xi — отсутствие подсчета числа итераций.
Наборам (хо? Х^ Xi) и (ХюХ^Х^) могут быть сопоставлены различные разбиения строк спецификации тгх (Ф) = ({1} , {4} , {2, 3, 5, 6}) и 7Г2 (Ф) = ({!}, {2, 3, 4, 5, 6} , 0), которые в свою очередь характеризуют различные способы вычисления у = л/х— циклический (рис. 5.2, б) и конвейерный (рис. 5.2, в). Заметим, что при втором способе вычислений подсчет числа итераций отсутствует, а значения X на соседних стадиях вычислений с нулевой по четвертую могут различаться (поэтому на рис. 5.2, в показано пять различных дуг, обозначенных X). Далее,
Арифметико-логические блокиАрифметико-логические блокиX X X X XX X X X Xс — константау _ сдвиг вправо на разряд• — мультиплексорIJ\Y — регистры+ — сложение* — умножениес — константау _ сдвиг вправо на разряд• — мультиплексорIJ\Y — регистры+ — сложение* — умножениес — константа^ — сдвиг вправо на разряд+ — сложение* — умножение/ — делениес — константа^ — сдвиг вправо на разряд+ — сложение* — умножение/ — делениеАрифметико- Двухразрядный логическое счетчик устройство
Арифметико-логические блоки
Арифметико-логические блоки
X X X X X
X X X X X
с — константа
у _ сдвиг вправо на разряд
• — мультиплексор
IJ\Y — регистры
+ — сложение
* — умножение
с — константа
у _ сдвиг вправо на разряд
• — мультиплексор
IJ\Y — регистры
+ — сложение
* — умножение
с — константа
^ — сдвиг вправо на разряд
+ — сложение
* — умножение
/ — деление
с — константа
^ — сдвиг вправо на разряд
+ — сложение
* — умножение
/ — деление
/ — деление
ааб
а
а
Рис. 5.3. Реализация вычисления у = ^/х различными структурами
вышеприведенные наборы признаков описывают различные структуры — с повторным использованием вычислительных блоков (рис. 5.3, а) и конвейерную (рис. 5.3, б).
В первую из структур для инкрементирования индекса г вводится двухразрядный счетчик, который предварительно обнуляется. Во второй структуре имеются отдельный блок для вычисления начального приближения, обозначенный на рис. 5.3, б как блок 0, и четыре блока для определения текущего значения yipi. В обеих структурах умножение на 0,5 реализуется посредством сдвига числа вправо на один разряд при передаче результата в соответствующий блок.
Множества Xi, . . . , Xg архитектурных признаков необязательно не пересекаются. Так, множества, соответствующие функциям у^ Унъ Л могут иметь следующий вид: Хо = {хо, Хо, X?}, Ху = Оу' Ху, Xi }, Xj = {х5 X?, Xi, Xi }• Здесь, признак %?, задающий последовательность вычисления г, у^ и yt^i^ включается в каждое из трех множеств семейства X = (Хо, Ху, Х^).
Будем считать целевую архитектуру выбранной, если найдено ее описание у и соответствующее ему разбиение спецификации Ф на блоки тг (Ф) = {Ф1,..., Фе}-
Локализация области поиска целевой архитектуры. Некоторое начальное разбиение спецификации может осуществляться разработчиком неформально, «вручную». При этом приходится рассматривать не один, а несколько вариантов разбиения. В общем случае количество вариантов разбиения Ф не меньше числа сюръектив
ных функций из Ф на X, т. е. sr,g = 52 (—^g № ~ , где К =
= |Ф| ^ G. Здесь sk,g — число Стирлинга второго рода, умноженное на G4. Практически число Н допустимых разбиений значительно меньше sk,g- Тем не менее с каждым из вариантов связывается свое семейство множеств архитектурных признаков. При этом в наборах Хх = (Хи,. . . , X^i), - - -, ^н = ^хн-, - - • , ^сн) одноименные компоненты Хи, . . . , Ххн? • • ■; X^i, • • • , ^gh в общем случае различны. Так, с вышерассмотренными разбиениями тгх (Ф) и ?Г2 (Ф) спецификации Ф, приведенной на рис. 5.2, а, могут ассоциироваться_сле- дующие семейства признаков: Xi = ({хо} , (Ху, Ху} , {х}, Xt }), Х2 = = ({Хо, Хо} Л Ху} , ЬГ Xt, Xi })■ В этом случае описаниях должно представлять собой общую трансверсаль для Н семейств Хх, . . . , Хи- Например, набор (хю Х^ х|) является общей трансверсалью семейств Хх и Х2, при этом ему может быть сопоставлено разбиение тгх (Ф). В представляемой такими описанием и разбиением целевой архитектуре вычисления начального приближения yOl текущего значения Pi^i и подсчет числа г итераций выполняются на трех отдельных блоках, что отличает этот вариант от структуры на рис. 5.3, а. При этом вычисление Уг^-! производится итеративно на одном и том же арифметикологическом устройстве, подобно тому, как это показано на рис. 5.3, а, с той лишь разницей, что арифметико-логическое устройство должно реализовывать функции сложения и деления.
Процесс синтеза описания требует исследования пространства архитектурных решений. Частичное описание ур, т. е. набор признаков, в наибольшей степени влияющих на характеристики системы, позволяет локализовать область поиска ее вариантов. Подробнее изложим суть этой идеи на следующем примере. Предположим, что многопроцессорная система, структура которой показана на рис. 5.4, предназначена для решения задач, допускающих крупноблочное распараллеливание на относительно независимые подзадачи по неидентичным вычислителям Вх, В2, . • • , Вп. Для коммутации данных используется системный интерфейс (СИ). Идея реализации распараллеливания задач по вычислителям заключается в следующем. Каждый из них работает по своей циклограмме, задаваемой препроцессором форматирования (ПФ). Таким образом, ПФ^, где i = 1, . . . , п, «распознает» данные из общего потока к абонентам или от абонентов, предназначенные для обработки на вычислителе Bj. По Флинну, эту систему можно отнести к классу MIMD. В каждом из вычислителей, помимо препроцессора форматирования, имеются: вычислительный модуль (ВМ), структура которого уже рассматривалась в § 4.1 (см. рис. 4.5), блок памяти (БП) и, в случае децентрализованного управления обменом с системным интерфейсом, процессор обмена (ПОбм). От соответствующего препроцессора форматирования в блок обработки (БО) поступают данные в определенном формате. На рис. 5.4: БР — буферный регистр; ЛОП — локальная оперативная память; ПДП — блок прямого доступа к памяти. Таким образом, за каждым вычислителем закрепляется
АбонентыАбонентыПФПФШина данныхШина данныхШина управленияШина управленияОбщая памятьОбщая памятьБПБП1234123412341234Совмещение каналовСовмещение каналов2^>2^>4545Биномиальное резервирование каналовБиномиальное резервирование каналов12341234ПОбмПОбмвмвмСИСИлоплопот/к ПФот/к ПФУправлениеУправлениеШина данныхШина данных
Абоненты
Абоненты
ПФ
ПФ
Шина данных
Шина данных
Шина управления
Шина управления
Общая память
Общая память
БП
БП
1
2
3
4
1
2
3
4
1
2
3
4
1
2
3
4
Совмещение каналов
Совмещение каналов
2^>
2^>
4
5
4
5
Биномиальное резервирование каналов
Биномиальное резервирование каналов
1
2
3
4
1
2
3
4
ПОбм
ПОбм
вм
вм
СИ
СИ
лоп
лоп
от/к ПФ
от/к ПФ
Управление
Управление
Шина данных
Шина данных
Рис. 5.4. Пример структуры многопроцессорной системы
своя задача, обмен данными между вычислителями реализуется через системный интерфейс и общую память.
В архитектуре системы предусмотрены три типа препроцессорной обработки (см. рис. 5.4):
форматирование с разделением каналов, когда препроцессор фор™ матирования устанавливает взаимно однозначное соответствие между каналами связи с абонентами и каналами шины данных вычислителя;
совмещение каналов, когда соответствие между каналами абонентов и каналами шины данных вычислителя является произвольным;
форматирование данных в условиях биномиального резервирования каналов абонентов; при этом препроцессор форматирования уста™
навливает соответствие между каналами абонентов и каналами шины данных вычислителя с учетом избыточности, обусловленной резервированием.
В соответствии с этими способами препроцессорной обработки вычислители разделяются на три группы, внутри каждой из которых распараллеливание выполняется на основе парадигмы SPMD. Вычислитель реализует функции: препроцессорной обработки W посредством препроцессора форматирования; промежуточного хранения данных В (буферизации), осуществляемого блоком памяти; обмена / с системным интерфейсом с помощью процессора обмена или вычислительного модуля; обработки Р на вычислительном модуле и управления U обменом. При централизованном управлении обменом функция U реализуется вычислительным модулем, а процессор обмена отсутствует.
Соответствующие этим функциям архитектурные признаки являются наиболее значимыми и имеют следующий вид:
W = {wi, W2,W3}, где wi — разделение, W2 — совместное использование и W3 — биноминальное резервирование каналов данных (соответствующие группы вычислителей обозначим Р, С и Б);
В = {61,62}, где 61 обозначает наличие, а 62 — отсутствие буферизации;
/ = {zi, Z2}, где Н — пословный обмен, а г^ — обмен блоками слов с системным интерфейсом;
Р = {pi, Р2? Рз5 Рд}, где pi — обработка слова сразу после формирования, Р2,Рз — обработка соответственно перед буферизацией и после считывания из буфера (блока памяти), Р4 — обработка до и после буферизации;
U = {oi, 02L гДе мь ^2 обозначают соответственно централизованное и децентрализованное управление.
Пусть заданы правила синтеза описаний, которые в общем случае строятся на базе экспертных знаний о предметной области, например:
l)wi^6i; 2) (югУ^з) Дб2 ДА ^РГ, 3) ?2 Д (рз VP4) W2-
Первое правило означает, что при разделении каналов данных всегда необходима буферизация. Второе — реализация целевой архитектуры при совмещении или биномиальном резервировании каналов данных, отсутствии буферизации в сочетании со словарным обменом требует обработки сразу же после формирования слова. Наконец, согласно третьему правилу при блочном обмене и обработке до буферизации либо обработке до и после буферизации необходимо децентрализованное управление.
Тогда подмножество разрешенных частичных описаний вычислителей представляется следующим образом:
Р1 = (юЬ61, A,Pl, Ml),
о2 = (о, 61, /1, Р2, «1),
ОЗ = (о, 61,21,Рз, U1),
о4 = (о, 6Ь гьр4,
об = (о, bl, г2,Р1, U1),
об = (о, 61, г2,р3, w2),
о7 = (о, 61, г2,р4, к2),
•8 = (•, 62, ii, pi, ui).
Знак о соответствует любому из признаков wi, W2, W3 (группам Р, С, Б), а • соответствует признакам W2, W3 (группам С, Б).
В соответствии с описаниями на уровне наиболее значимых архи™ тектурных признаков выделяются три группы вычислителей, в каждой из которых содержится семь подклассов архитектур: Р1, ..., Р7, С2, ..., С8, Б2, ..., Б8. В каждом из подклассов реализуется свой тип циклограмм для обработки заданий, соответствующих функциям Ж, Р^ ВД архитектуры.
На рис. 5.5 показаны две разновидности циклограмм в архитекту™ рах РЗ, СЗ и БЗ; Т* соответствует крайнему сроку завершения обра-
Рис. 5.5. Циклограммы заданий в архитектурах РЗ, СЗ, БЗ
ботки, at* — крайнему сроку завершения отдельных действий, дли™ тельность которых в общем случае является случайной величиной.
Необходимо заметить, что на практике упорядочение архитектур™ ных признаков по значимости (присвоение весов) далеко не простая задача. Так, в разных подклассах архитектур доминирующими по от™
носительным затратам на реализацию могут оказываться признаки, соответствующие различным функциям. Например, в одном подклассе аппаратурные затраты на буферизацию и обмен могут быть сопоставимы или доминировать над затратами на обработку и обмен. В другом могут преобладать затраты на обработку и обмен. В третьем подклассе архитектур наибольшая стоимость может приходиться на реализацию функций препроцессорной обработки либо обработки и обмена. При этом относительные доли затрат на аппаратуру могут изменяться в зависимости от вычислительной нагрузки и/или заданных крайних сроков завершения программ. Поэтому исследование пространства архитектурных решений требует специальных инструментальных средств.
В начале 90™х годов прошлого столетия на кафедре вычислительной техники МЭИ была начата разработка системы GSSS (Generalized Structure Synthesis System) [152]. Co времени анонсирования одной из ее первых версий ) система GSSS была существенно развита и прошла апробацию в ряде проектов [153—156]. Одна из возможностей этого инструментария — сравнительный анализ различных типов целевых архитектур на основе обобщения экспертных знаний.
На рис. 5.6 показано расположение вариантов вычислителей с разделением каналов (группа Р) в пространстве (|ЛЖ| , |5Ж| , Т*), где |ЛЖ| и |5Ж| представляют соответственно относительные затраты на реализацию аппаратной платформы и сложность программного кода в некоторых условных единицах. Так, относительная сложность кода |5Ж| изменяется от 1 до 4 единиц, относительные затраты на аппаратуру не превышают 8 единиц, а крайний срок Т* не больше 8 единиц времени. Приведены результаты анализа архитектур вычислителей с пословным обменом (см. рис. 5.6, а) и обменом блоками слов (см. рис. 5.6, б), отличия между которыми состоят в том, что обмен первого типа может прерываться другими заданиями (см., например, рис. 5.5), а обмен второго типа — нет.
Сравнительный анализ различных архитектур позволяет сделать значимые и не всегда очевидные выводы. Так, согласно третьему правилу в некоторых архитектурах с блочным обменом словами (в частности, в подклассах о 6 и о 7) необходимо введение специального процессора, управляющего обменом. Однако в ряде случаев это не дает практически никакого выигрыша в производительности по сравнению с пословным обменом (см. рис. 5.6, а, б). Далее, при заданных требованиях к производительности удается выделить наиболее экономичные по аппаратуре подклассы архитектур. На рис. 5.6, а это вычислители подкласса РЗ в соответствующем диапазоне изменения крайнего срока Т* завершения программы. На рис. 5.6, б не показано расположение вариантов архитектуры Р6, поскольку при той же производительности, что
Относительные аппаратурные затраты \HW\
Относительные аппаратурные затраты \HW\
Рис. 5.6. К анализу пространства архитектурных решений
и для РЗ, в соответствии с ее описанием необходимы дополнительные затраты на процессор обмена. Чтобы добиться даже незначительного повышения производительности, обеспечиваемого архитектурой типа РЗ (см. рис. 5.6, а), требуется перейти в другие подклассы архитектур (Р1, Р2, Р4), что приводит к существенному росту аппаратурных затрат.
Другая практически ценная возможность системы GSSS, которая
и позволяет упорядочить архитектурные признаки по значимости, — это определение долей относительных аппаратурных затрат | АЖЖ| на реализацию различных функций архитектуры.
На рис. 5.7 показана диаграмма распределения затрат |АЖЖ| для архитектуры подкласса РЗ (см. рис. 5.6, а) в зависимости от крайнего срока Т* и относительной сложности |*9Ж| программного кода. Здесь
Доли аппаратурных затратДоли аппаратурных затрат\SW\ — относительная\SW\ — относительнаяРис. 5.7. Диаграмма распределения относительных затрат на реализацию функций архитектуры РЗ. Функции архитектуры: Р, /(•); Ж(о); Р(*)Рис. 5.7. Диаграмма распределения относительных затрат на реализацию функций архитектуры РЗ. Функции архитектуры: Р, /(•); Ж(о); Р(*)
Доли аппаратурных затрат
Доли аппаратурных затрат
\SW\ — относительная
\SW\ — относительная
Рис. 5.7. Диаграмма распределения относительных затрат на реализацию функций архитектуры РЗ. Функции архитектуры: Р, /(•); Ж(о); Р(*)
Рис. 5.7. Диаграмма распределения относительных затрат на реализацию функций архитектуры РЗ. Функции архитектуры: Р, /(•); Ж(о); Р(*)
[minТх*, maxT^], [minТ^ , maxТ^] — диапазоны изменения крайнего срока Т* выполнения кода РЖ для двух разных значений его относительной сложности |РЖ|.
Как видно из рис. 5.7, «траектории» изменения |АЖЖ| даже для одной отдельно взятой архитектуры весьма сложно организованы и зависят от требований к производительности и вычислительной нагрузки. Соответственно варьируется и значимость того или иного архитектурного признака в описании целевой архитектуры.
5.1.3. Синтез архитектуры и генетические алгоритмы. В сущности набор архитектурных признаков описывает в закодированном виде одно из возможных архитектурных решений. Сами по себе правила синтеза описаний, в какой-то мере формализующие экспертные знания, не дают конструктивного приема порождения (синтеза) вариантов архитектуры, удовлетворяющих заданным требованиям. Эти правила лишь допускают либо запрещают некоторые комбинации архитектурных признаков. Сама же процедура синтеза так или иначе связана с оптимизацией архитектуры по совокупности критериев. Поэтому желательно было бы алгоритмизировать и процессы порождения вариантов, и их оценку.
Весьма перспективным здесь может быть использование генетических алгоритмов^ которые обладают рядом свойств, необходимых
для решения задачи выбора архитектуры вычислительной системы. Чуть позже мы охарактеризуем эти полезные свойства, а сейчас на примере алгоритма Холланда SGA (simple genetic algorithm) опишем основные понятия и схему генетического алгоритма.
Множество строк из символов некоторого конечного алфавита образует так называемую популяцию. Каждая строка кодирует одно из возможных решений задачи. В нашем случае популяция образуется совокупностью описаний — «хромосом» целевой архитектуры. Вектор признаков — «генов» х = (xi,. . . , xg) ~ представляет некоторый способ реализации архитектурных функций, т. е. описывает архитектурное решение. Его качество оценивается с помощью функции выживаемости. Она строится на основе целевых функций и ряда ограничений, например на разрешенные комбинации архитектурных признаков. Функция выживаемости может и совпадать с целевой функцией, в частности, представлять собой относительные аппаратурные затраты |НЖ|, допустимую сложность кода |5Ж|, крайний срок Т* завершения отработки (см. рис. 5.6). Основные операции генетического алгоритма, выполняемые над элементами популяции, — это селекция, скрещивание и мутация. В результате их применения образуются новые популяции, а процесс их порождения продолжается до тех пор, пока не будет достигнут критерий останова.
Схема алгоритма SGA включает следующие действия.
Генерация случайным образом популяции.
Вычисление функции выживаемости для каждой из строк популяции.
Выполнение селекции — отбора строк популяции.
Скрещивание с некоторой вероятностью родительской пары строк и получение пары потомков.
Мутация с некоторой вероятностью символов, кодирующих решение, например битов строки.
Если критерий останова достигнут, то завершение работы, иначе переход к действию 2.
Приведем примеры операций SGA над частичными описаниями целевой архитектуры многопроцессорной системы, которую мы уже начали рассматривать в этом параграфе (см. рис. 5.4). Пусть случайным образом сформированная популяция состоит из трех частичных описаний:
Р4 = (wi, 61, И, Р4, Mi);
Р5 = (W1,61,22, Pl, mi);
Р6 = (гщ, 61,22,р3, м2).
Эти описания соответствуют группе вычислителей с разделением каналов данных (признак гщ). В архитектуре Р4 осуществляется обмен словами (признак щ), а в архитектуре Р5 и Р6 — блоками слов (признак щ). Выполним точечное скрещивание наборов Р4 и Р6 таким образом, что происходит обмен признаками обработки рз и Р4.
В результате генерируется новая популяция, включающая описания P3=(wi, 61 ,A, рз, иД и P7=(wi, 61, г2, Р4, м2). Положим, функция выживаемости представляет собой относительные аппаратурные |НЖ| при заданных относительной сложности кода |5Ж| и крайнем сроке Т*. Если Т* = 5, а |5Ж| = 3, то существует вариант РЗ, явно лучший варианта Р4 по аппаратурным затратам примерно при той же производительности (см. рис. 5.6, а). А вот решение Р7 (см. рис. 5.6, б) хуже решения Р5, поскольку требует дополнительного процессора для организации обмена данными (признак и^ уступая варианту Р5 в производительности (на рис. 5.6, б относительные затраты на процессор обмена в Р7 не учтены). Поэтому в результате селекции архитектура Р7 не будет включена в новую популяцию. Предположим, что скрещивание наборов Р4 и Р6 было произведено таким образом, что произошел обмен признаками в позициях с третьей по пятую. Такое скрещивание не порождает новой популяции:
Р4 = (wi, 6Х, ibp4l Ui) => Р6 = (wi, 6i,i2,p3, м2);
4-t
Р6 = (wi, 61, г2,Рз, м2 ) ^ Р4 = (wi, 61, й,р4, Ui).
Если происходит обмен парами, состоящими из четвертого и пятого признаков описаний Р4, Р6, то образуются следующие наборы:
(wi, 61, Zi,p3, w2), (wi, 61, г2,Р4, Ui).
Первый из них будет хуже по значению функции выживаемости |ЖЖ| в сравнении с архитектурой РЗ, поскольку признак и^ означает введение дополнительного процессора обмена, хотя можно обойтись и без него, как это сделано в решении РЗ (признак izi). Второй вариант вообще недопустим, поскольку нарушается третье правило синтеза описаний: комбинация признаков i2, р4 и Ui является запрещенной. Архитектура РЗ может быть получена из архитектуры Р4 в результате мутации признака («гена») p4l приводящей к появлению признака рз в соответствующем описании РЗ. С другой стороны, мутация признака pi в описании Р5 = (wi, 61,г2,pi, Ui) и замена его на признак р2 не порождают нового решения. Дело в том, что архитектуры с описаниями Р5 и (ш17 61, г2, р2, Ui) являются функционально эквивалентными: обработка слова сразу после формирования (признак рД при наличии буфера (признак 61) — это то же самое, что обработка перед буферизацией (признак р2). Однако сразу же заметим, что это не означает избыточности архитектурных признаков pi и р2: второе из приведенных выше правил синтеза описаний допускает и отсутствие буферизации (признак 62), при этом в описании обязательно должен присутствовать архитектурный признак pi. Такой комбинации соответствуют архитектуры подклассов С8 и Б8.
Конечно, здесь мы рассмотрели лишь некоторые общие принципы работы генетического алгоритма, точнее его схему. Переход от схемы к алгоритму требует выбора способов кодирования решений, определения основных операций (селекции, скрещивания, мутации), задания функции выживаемости и настройки параметров алгоритма. Последнее, в частности, означает и выявление параметров, зависящих и не зависящих от исходных данных задачи. Более того, важно правильно определить область эффективного применения алгоритма. Это может быть сделано на основе сравнения предлагаемого алгоритма с известными алгоритмами и эвристиками по вычислительной сложности и размерности решаемых задач.
Теперь сформулируем основные свойства генетических алгоритмов, которые могут быть весьма полезны в синтезе архитектурных решений вычислительных систем.
Первое свойство: генетические алгоритмы при соответствующей настройке параметров хорошо адаптируются к целевым функциям. В отличие от алгоритмов имитации отжига (simulated annealing), скорость сходимости генетических алгоритмов практически не зависит от сложности ландшафта целевой функции. Алгоритмы имитации отжига основываются на понятии тепловой энергии, ассоциируемой с функцией качества решения. Задача комбинаторной оптимизации может быть рассмотрена как поиск состояния теплового равновесия и вычисления энергии системы. Сначала выбирается некоторое начальное приближение и устанавливается начальная температура. Генерируется новое решение, для которого вычисляется функция качества. Допускаются те переупорядочивания конфигурации, например, параметров системы, которые не увеличивают значения функции. В противном случае оценка допустимости конфигурации и выбор стартовой точки производятся с помощью вероятностного фактора Больцмана. Рассмотренные действия итеративно повторяются. Затем температура понижается. Если критерий останова не достигнут, то генерируется новое решение и т. д. Как правило, целевые функции, характеризующие качество архитектурного решения, имеют ряд локальных оптимумов и довольно сложный рельеф. Чтобы это проиллюстрировать, достаточно вновь обратиться к рис. 5.7, на котором показаны диаграммы распределения относительных аппаратурных затрат |АНЖ (Т*)| на реализацию различных функций архитектуры подкласса РЗ. В алгоритмах имитации отжига, имеющих дело с подобными целевыми функциями, нужно медленно понижать температуру, чтобы алгоритм не был захвачен локальным оптимумом, из которого он не сможет выйти. При медленном понижении температуры возрастает число итераций и соответственно вычислительная сложность алгоритма.
Второе свойство: параметры генетического алгоритма, например, такие, как размер популяции, значения вероятности скрещивания и мутации, могут быть настроены на задачах небольшой размерности. Затем они допускают перенос и на задачи большей размерности.
Наконец, третье свойство: допустимо изменять степень детализации описания архитектуры, в частности, число архитектурных признаков, без значительных модификаций в самом генетическом алгоритме. Это возможно в том случае, когда вычисление функции выживаемости выполняется отдельно от операций генерации решений (селекции, скрещивания, мутации).
Итак, генетические алгоритмы могут помочь в исследовании пространства и локализации области поиска архитектурных решений. Теперь сформулируем содержание основных этапов при выборе целевой архитектуры.
Основные этапы синтеза целевой архитектуры. После выбора частичного описания хр необходимо построить полное описание х архитектуры. Эта процедура связана с видом разбиения множества Ф объектов спецификации. При этом одинаковые признаки могут оказаться в различных множествах Хх, . . . , Х^, как это было показано выше. Более того, множества Х^х, . . . , Х^к могут содержать более одного элемента, т. е. не только признаки Хы ? • • • ? Хч частичного описания. Это объясняется тем, что эти множества могут быть расширены разработчиком за счет добавления к элементам хР ДРУ™ гих, близких к ним по значимости признаков. Последовательностям Х17 . . . , Хя соответствуют разбиения тгх (Ф) , . . . , тгя (Ф), каждое из которых будем называть начальной фрагментацией спецификации Ф. Заметим, что число возможных описаний не равно числу инъективных последовательностей вида (уд? . . . , Xg^ гДе
Хъ• • • ^Xg {Хх U Х2 U • • • U^g} = {х\ • • • ? X™} 1
XiXg-
Последовательность (ух, . . . xg) в общем случае не является трансверсалью признаков архитектуры. (Количество таких последовательностей равно числу размещений без повторения т\( (т — G)!, т. е. числу всех взаимно однозначных функций из X на {Хх U - • • U Xg}-)
Таким образом, решение задачи синтеза целевой архитектуры включает следующие этапы.
Этап 1. Нахождение частичного описания. Построение начальных фрагментаций тгх (Ф) , . . . , тгя (Ф) и соответствующих последовательностей Хх,.. . ,Хя-
Этап 2. Поиск общей трансверсали признаков для Н последовательностей Хх,. . . , Хя длины G семейства X.
Этап 3. Построение разбиения тг (Ф) спецификации, соответствующего найденной общей трансверсали архитектурных признаков.
На первом этапе поиск начальных фрагментаций спецификации может осуществляться не только «вручную», но и с помощью специаль-
ных алгоритмов, например на основе метрического подхода. Примеры применения метрик приводятся в § 5.2.
Общая трансверсаль признаков для семейства Xi, . . . , Хя не обязательно существует. Это означает, что на заданном семействе признаков не может быть реализована целевая архитектура с требуемыми свойствами. Поэтому требуется возврат со второго этапа синтеза к первому и изменение вида последовательностей Xi,. . . , Хя- Возможно, что придется при этом изменить и начальные фрагментации.
В § 5.2 исследуется критерий существования целевой архитектуры. Необходимость третьего этапа обусловлена тем, что семейство ф = = {Фх, . . . , Ф^}, соответствующее общей трансверсали, полученной на втором этапе, может содержать пересекающиеся подмножества. Кроме того, возможно, что |Ф| J . . . J Ф^| ^ |Ф|, т. е. некоторые объекты спецификации могут не попасть в подмножества семейства ф. Поэтому необходимо расширить подмножества Ф'х, . . . , Ф^ до подмножеств Фх, - . . 3 фс семейства фг так, чтобы фх J . . . J фо = Ф, азатем построить разбиение тг (Ф). Заметим, что во многих задачах проектирования дискретных систем приходится отыскивать разбиение множества, имея в качестве его «промежуточного» представления некоторое семейство не обязательно непересекающихся подмножеств, причем это семейство является покрытием исходного множества [54]. Так, для рассмотренного выше примера с разбиением спецификации вычисления у = д/ж (см. рис. 5.2, а) «промежуточное» семейство подмножеств строк спецификации для вычислений у^ Уг+ь ^ может иметь следующий вид:
({1}, {2, 3,4, 5, 6}, {2, 3,5, 6}).
Здесь неполнота знания о конечной реализации выражается в том, что подмножества строк, реализующих вычисления ^+i? Т пересекаются. С другой стороны, из этого семейства могут быть получены уже упоминавшиеся разбиения
({1}, {4}, {2, 3, 5, 6}), ({!}, {2, 3, 4, 5, 6}, 0).
Приемы отыскания окончательного вида разбиения рассматриваются в § 5.3.
Итак, в двух следующих параграфах этой главы описываются формальные комбинаторные схемы для решения задачи представления спецификации целевой архитектурой вычислительных ресурсов, что может помочь заинтересованному читателю в разработке автоматизированных систем отображения. Материал, который содержит необходимые сведения из комбинаторики и теории графов, дается в § 5.4. Читатель, не нуждающийся в этом материале, может его опустить без ущерба для понимания содержания настоящей главы. Тем же, кто посчитает приводимые сведения недостаточными, мы рекомендуем обратиться к книгам [36, 38, 39].
§5.2. Критерий существования целевой архитектуры
Л. Схема поиска частичного описания архитектуры. Пусть X = (Xi,. . . , Xg) — семейство на конечном множестве Е архи™ тектурных признаков, a J — семейство частичных описаний целевой архитектуры. В соответствии с теоремой Эдмондса и Фалкерсона пара М = (Е, J) представляет собой матроид (см. § 5.4). Введем функцию w: Е —> R+, где R+ — множество неотрицательных действительных чисел, а значение w (е) есть вес элемента е Е Е. Упорядочим мно-
G
жество Е — {вХ, . . . , вт } — Xg по невозрастанию весов: w (ei) ^ . . . • • • ^ w (ет).
О нетривиальное™ этой задачи на практике уже упоминалось в § 5.1, а для разнородных, программных и аппаратных компонентов вычислительной системы проблема еще больше усложняется. Здесь важно, чтобы вес w(e) элемента (архитектурного признака) был инвариантен относительно будущей технической реализации. Разумеется, подобные допущения оправданы лишь при определенных условиях и на ранних стадиях выбора целевой архитектуры. В данном случае такое упрощение позволяет применять жадные алгоритмы (см. § 5.4). Задача заключается в нахождении наибольшей по весу частичной трансверсали семейства X, а поскольку М = (Е, J) — матроид, то для этого можно применить жадный алгоритм.
Общая комбинаторная схема для нахождения частичной трансверсали Т С Е с наибольшим весом такова. Просматриваются все т ребер ^гц.и^ (m = |Е|) двудольного графа Н с вершинами {ux, . . . , tim,^ {щ, . . . д^}, причем вг Е Xg1 г = 1, . . . , m. Находится паросочетание графа Н, которое и задает инъективное отображение ^: Т —^ —>{1,2,..., G} такое, что (W Е Т) tЕ X^^tp Для этого отыскивается чередующаяся цепь относительно паросочетания с началом в е^ (см. § 5.4). Если использовать метод поиска в глубину (см. § 5.4), то G
сложность нахождения цепи составляет О (т + G + 52 1^5 I) чт0 дает оценку сложности применения этой комбинаторной схемы в целом °(m £ |Xg|).
Итак, в результате применения жадного алгоритма получается наибольшая по весу 52 w (е) частичная трансверсаль Т. Однако не вся™ ебЕ
кое сочетание признаков описывает реализуемую архитектуру. Такие недопустимые сочетания определяются совокупностью правил синте™ за описания (см. § 5.1). Так, недопустимыми описаниями в группе архитектур с разделением каналов (см. рис. 5.4) являются наборы признаков вида (wx, 62, *, *, *), где знак * соответствует любому из
признаков в множествах функций /, Р^ U. Подобные наборы не могут представлять реализуемые архитектуры, поскольку нарушается первое из заданных экспертных правил синтеза описаний гщ —> 61. В группах архитектур с совмещением и биноминальным резервированием каналов запрещенные наборы, не соответствующие второму правилу (w2 v wa) Л ^2 Л И Рь таковы:
(•, 62, Н,р2, *), (•, Ь2, Д,р3, *), (•, Ь2, Н,Р4, *)•
Здесь • обозначает признак w2 или признак W3. Наконец, третье правило синтеза описаний г2 Д (рз V Рд) ^2 не соблюдается на следующих наборах:
(о, Ь^г^Рз, Ui), (о, Ь1Щ21Р4, Ui),
где знак о соответствует любому из признаков гщ, w2, W3.
Положим, полученная трансверсаль Т содержит недопустимый набор признаков. Необходимо, перебирая их сочетания, полагать веса соответствующих признаков равными нулю и из получаемых трансвер-
Рис. 5.8. Алгоритм поиска частичного описания архитектуры
салей, определяющих реализуемую архитектуру, отобрать трансверсаль Т' с наибольшим весом w(T'). Она и будет частичным описанием целевой архитектуры. Схема алгоритма для его нахождения приведена на рис. 5.8.
Начальное разбиение спецификации. В основу разбиения спецификации на фрагменты могут закладываться различные критерии в зависимости от целей, преследуемых при выборе той или иной архитектуры вычислительной системы. Это может быть, например, минимизация передач управления между операторами программы, минимизация пересылок данных между процессорными узлами; разбиение операторов на группы может осуществляться по степени функциональной близости и вычислительной сложности и т. д. Рассмотрим один из подходов к разбиению спецификации с помощью кластерного метода. Здесь понятие «кластер» является синонимом понятия «совокупность», в которую включаются некоторые объекты по специальным признакам «близости» друг к другу. Поскольку спецификация не представляет собой в общем случае готовую к исполнению программу, то далее в этом параграфе ее объекты будем называть не операторами, а операциями.
Кластерный метод позволяет реализовать разбиение с помощью метрик. Операции объединяются в кластер в зависимости от того, насколько они являются «близкими» друг другу по данным, управлению, типам действий и т. д. «Близость» по данным означает использование общих переменных. «Близость» по управлению может определяться как принадлежность к одному линейному участку спецификации или вероятность совместного выполнения операций при наличии условных ветвлений. Однотипность операций может быть важна в неоднородных вычислительных системах для привязки операций к тем или иным типам процессоров. Сводя однотипные и не допускающие распараллеливания операции в кластеры, можно уменьшить требуемое число соответствующих процессоров. Приведем примеры некоторых метрик и поясним с их помощью цели кластеризации.
Цель кластеризации по управлению — сгруппировать вместе операции в нити (потоки управления) как можно более длинные, чтобы уменьшить число передач управления между группами операций. О том, что условные ветвления замедляют работу программ и усложняют устройство процессоров, мы уже говорили в § 4.1, когда речь шла о механизме предикации в архитектуре команд IA-64. Поскольку в реальных программах содержатся многочисленные операторы выбора, то было бы желательно минимизировать число передач управления между кластерами, соответствующими последовательным участкам программ. Пусть операция а предшествует операции Ь. Тогда формально метрика «близости» этих операций по управлению может быть введена так:
рс(а, Ь) = Р(Ь\а), где Р (6|а) — условная вероятность выполнения операции 6, т. е. вероятность того, что выполнится операция b при условии, что выполнена операция а.
Положим, отношение предшествования операций задано графом переходов (рис. 5.9, а). Операция 2 соответствует условному ветвлению.
абРис. 5.9. К вычислению метрик «близости»абРис. 5.9. К вычислению метрик «близости»
аб
Рис. 5.9. К вычислению метрик «близости»
аб
Рис. 5.9. К вычислению метрик «близости»
Пусть переход от операции 2 к операции 3 осуществляется с вероятностью Р^ = 0,2, а переход к операции 4 — с вероятностью Р^ = 0,8. «Близость» операций 1 и 5 по управлению определяется значением метрики рс(1, 5) = Р(5|1) = Р24 = 0,8, а для операций 1 и 3 - значением pc (1, 3) = Р (3| 1) = Р23 = 0,2. Поскольку переходы 1^2, 4—^5 безусловны, то в один кластер попадают операции 1, 2, 4, 5, а в другой — операция 3.
Совместимость операций может быть выражена следующей метрикой:
{
1, если операции а и b однотипны и не могут выполняться параллельно, 0, в противном случае.
Эта метрика отражает возможность разделения операциями одного и того же (возможно, специализированного) вычислительного ресурса. Рассмотрим информационный граф (рис. 5.9, б^ представляющий связи операций по данным. Для операций умножения mi, m2 показателем совместимости является значение метрики рт (mi, m2) = 1. Операции сложения di, а2 имеют другой тип и, следовательно,
Рт (nil, Й1) = Рт ^г,^ = Рт (mi,^) = рт (т2,а2) = 0.
При этом, несмотря на то, что «1 и «2 однотипны, Дт(«1,«2) = 0, поскольку эти операции могут выполняться параллельно.
Минимизировать трафик обмена данными (что особенно важно в масштабируемых вычислительных системах) можно, используя метрику «близости» по данным:
pD (а, Ь) =pD (а, Ь) =у; + Уь УаРУ/у; + Уь УаРУ/
pD (а, Ь) =
pD (а, Ь) =
у; + Уь УаРУ/
у; + Уь УаРУ/
Здесь Уа1 Уь — число переменных, участвующих в выполнении операций а, b соответственно; У^ У^ — число общих переменных для операций а, b (понятно, что У^ = У^ однако иногда из практических соображений в числителе этой метрики удобнее иметь удвоенное число общих переменных).
Метрика рр(а,6) по сути отражает степень связности операций по данным. Для примера, приведенного на рис. 5.9, б^ значения этой метрики таковы:
pD(mi,m2) = ГГ = Ро^аР^^У^, О I" О ОО I" НЕ I
Pd (т2,аР = |±| = 4,Pd (т2,аР = |±| = 4,Pd («1, «2) = 0 и т. д.Pd («1, «2) = 0 и т. д.
Pd (т2,аР = |±| = 4,
Pd (т2,аР = |±| = 4,
Pd («1, «2) = 0 и т. д.
Pd («1, «2) = 0 и т. д.
Сильнее всего связаны по данным операции mi и «1, ш2 и «1, меньше — операции mi и т^ наконец, операция а2 не имеет общих переменных ни с одной из остальных операций. Группирование силы но связанных операций в кластеры позволяет уменьшить накладные расходы, связанные с пересылкой данных. Так, в масштабируемых системах с локальной памятью в узлах группы таких операций целесообразно размещать в одном и том же процессорном узле.
Поясним общую идею построения кластерных алгоритмов разбиения на следующем примере. Положим, с использованием метрики «близости» по данным необходимо выделить кластеры в 4-точечном конвейерном быстром преобразовании Фурье (БПФ), граф которого показан на рис. 5.10. Элемент БПФ выполняет четыре комплексных умножения (операции 1, 2, 7, 8) и восемь комплексных сложений (операции 3,... ,6 и 9,... ,12).
Рис. 5.10. Элемент конвейерного БПФ с прореживанием по времениРис. 5.10. Элемент конвейерного БПФ с прореживанием по времени
Рис. 5.10. Элемент конвейерного БПФ с прореживанием по времени
Рис. 5.10. Элемент конвейерного БПФ с прореживанием по времени
Сначала, на первой стадии разбиения, метрика связности по данным вычисляется для всех 12 операций БПФ. Результаты представлены матрицей на рис. 5.11, а. Это матрица 12x12, симметричная относительно главной диагонали, состоящей из нулей.
Для каждой рассматриваемой операции определим множество операций-соседей с наибольшим значением метрики. Рассматриваемую операцию и ее соседей объединим в кластер, который представим в виде дерева (рис. 5.12, а).
Так, для операций 1 и 3, 1 и 5 значение метрики равно ро (1,3) = = рп (1,5) = 0,4. Однако операции 3, 5 связаны по данным сильнее, поскольку pd (3, 5) = 0,67. Следовательно, именно они включаются в один кластер. На рис. 5.12, а он обозначен через I. Операция 1 в этот
1234567891011 12
1
0
0
0,4
0
0,4
0
0
0
0
0
0
0
2
0
0
0
0,4
0
0,4
0
0
0
0
0
0
3
0,4
0
0
0
0,67
0
0
0
0,33
0,33
0
0
4
0
0,4
0
0
0
0,67
0,4
0
0
0
0
0
5
0,4
0
0,67
0
0
0
0
0
0
0
0,33
0,33
6
0
0,4
0
0,67
0
0
0
0,4
0
0
0
0
7
0
0
0
0,4
0
0
0
0
0,4
0,4
0
0
8
0
0
0
0
0
0,4
0
0
0
0
0,4
0,4
9
0
0
0,33
0
0
0
0,4
0
0
0,67
0
0
10
0
0
0,33
0
0
0
0,4
0
0,67
0
0
0
11
0
0
0
0
0,33
0
0
0,4
0
0
0
0,67
12
0
0
0
0
0,33
0
0
0,4
0
0
0,67
0
а
1
2
7
8
I
II
III
IV
1
0
0
0
0
0,33
0
0
0
2
0
0
0
0
0
0,33
0
0
7
0
0
0
0
0
0,33
0,33
0
8
0
0
0
0
0
0,33
0
0,33
I
0,33
0
0
0
0
0
0,25
0,25
II
0
0,33
0,33
0,33
0
0
0
0
III
0
0
0,33
0
0,25
0
0
0
IV
0
0
0
0,33
0,25
0
0
0
б
А В С D
Е F
G Н
А
00 0,25 0,25
Е
00,4
G
00,4
В
00 0,25 0,25
F
0,40
Н
0,40
С
0,25 0,25 00
D
0,25 0,25 00
вгд
Рис. 5.11. Матрицы значений метрики связности по данным
б в
Рис. 5.12. Кластерные деревья
кластер не попадает. По аналогии формируются кластеры II, III и IV, куда входят пары операций 4, 6; 9, 10 и 11, 12 соответственно. Операции 2, 7 и 8 в эти кластеры не включаются, поскольку слабее связаны по данным, чем операции кластеров II, III и IV. Итак, после первой стадии разбиения мы имеем восемь кластеров, одна половина которых состоит из одиночных операций (1, 2, 7, 8), другая образована парами операций (I, II, III, IV).
Далее, на второй стадии разбиения вычисляется связность по дан™ ным для этих восьми кластеров. При этом для кластера, содержащего более одной операции, учитываются только «внешние» входные и выходные переменные. Так, кластер I, состоящий из операций 3, 5 (см. рис. 5.10), имеет две входных переменных (одна из них обозначена через /о, другая передается операцией 1), а также две выходных переменных. При этом у кластера I есть одна общая переменная с кластером 1. Значение метрики «близости» по данным равно
Значения метрики для всех восьми кластеров, полученных на второй стадии разбиения, приведены в матрице на рис. 5.11, б. Так, кластер I сильнее всего связан по данным с кластером 1. Поэтому они образуют новый кластер А (см. рис. 5.12, а). Аналогично могут быть сформированы и три остальных кластера, В, С и D. Степень связности кластеров А, В, С, D представлена матрицей, показанной на рис. 5.11, в. При этом на третьей стадии разбиения возможно сформировать еще четыре более крупные группы операций, Е, F и G, Н, которым соответствуют деревья, изображенные на рис. 5.12, б^ в. Наконец, на последней,
четвертой стадии кластеры Е и F, а также кластеры G и Н могут образовывать еще два кластера, I и J соответственно (см. рис. 5.11, г, д и рис. 5.12, б^ в). На этом завершается построение полных кластерных деревьев с корнями I, J.
Степень детализации кластера зависит от целевой архитектуры, а точнее, от доступных вычислительных ресурсов. Положим, при вычислении БПФ, показанного на рис. 5.10, каждая из операций назначается на отдельный процессор. Доступность SMP-архитектуры с физически не распределенной общей памятью и не менее чем 12 процессорами позволяет реализовать это БПФ с минимальным обменом данными. При этом никакой кластеризации не нужно. Если в каждом вычислительном узле DSM-системы с локальной памятью имеется по два процессора, то на такой системе целесообразно реализовать восемь кластеров, полученных после первой стадии разбиения (см. рис. 5.12, а). При этом операции 3, 5; 4, 6; 9, 10 и 11, 12 назначаются на один узел. Если доступна вычислительная система, узлы которой содержат не менее трех процессоров, то на отдельные процессорные узлы имеет смысл назначать кластеры А, В, С и D, которые были выделены на второй стадии разбиения. Если же узел имеет по крайней мере шесть процессоров, то рассматриваемое вычисление БПФ может быть реализовано на двух узлах в соответствии с кластеризацией третьей стадии (см. рис. 5.11, в и рис. 5.12, б^ в\
На практике, как правило, используются комбинации различных метрик либо отдельные метрики применяются в некоторой последовательности в зависимости от целей разбиения спецификации. При этом, однако, нужно учитывать то, что метрики могут вступать в противоречия друг с другом. Возникает ситуация коллизии, когда на основе применения разных метрик одни и те же операции нужно причислять к разным кластерам. Так, например, операции mi и di (см. рис. 5.9, б) наиболее близки по данным (для них, напомним, Pd (mi,ai) = 4/7). Однако при этом они являются несовместимыми, поскольку имеют различные типы, т.е. рт (mi,ai) =0. Поэтому при практической реализации кластерного метода очень важен порядок использования тех или иных метрик «близости». Второй немаловажный момент — необходимость учета вида отношения предшествования операций. Например, формальное применение метрики совместимости к кластеризации операций БПФ (см. рис. 5.10) может привести к потере свойства конвейерности вычислений. В частности, если попытаться пары операций 1, 2 и 7, 8 назначить на один и тот же ресурс при условии, что каждая из них использует его монопольно, то никаких конвейерных вычислений реализовать уже будет нельзя. Ну и, наконец, аспект методологического характера. Метрики могут вводиться разными способами, и не исключено, что при разных метриках лучшими будут оказываться различные разбиения одной и той же спецификации программы. В этом случае существует опасность подмены исходной задачи разбиения задачей выбора метрики.
Положим все-таки, что после отыскания частичного описания хр и построения начальных фрагментаций яд (Ф) , . . . , ин (Ф) получена последовательность Xi, . . . , Хя семейств архитектурных признаков. Перейдем к задаче второго этапа синтеза целевой архитектуры.
Критерий существования описания архитектуры. Пусть Н = (X, У, Е) — произвольный двудольный граф, в котором X и У — непересекающиеся множества вершин, а Е — множество ребер. Сетью S(H), построенной на графе Н, с источником s и стоком t будем называть ориентированный граф, множество вершин которого имеет вид V* = {s, t} (J АГ U У, а множество дуг — это Е* = = {(s,ж)|х е х} и {(у,61у е У)} и {(ж,у)|ж е х д у е уд {ж, у} е € £7}- При этом пропускная способность каждой дуги (п, и) Е Е* равна единице (см. § 5.4).
Рассмотрим последовательность X = (Xi, . . . , Хя) G-наборов, каждый из которых является семейством архитектурных признаков. Введем следующие обозначения:
( U U f U = {г1 ? • • • > } > • • •
' ■ ' ’ ( U ^^) U ( U ^(4+1)^) = {-Ю - - ■-
U Х8(Н-Г и ( Ug=lg=l
Построим сеть N = (V, А) с множеством вершин:
V = {s,i} U {жц, • ■ - ,ЖС1} U Щ, ■ ■ • и {4 ■ ■ • , 4J U
U {Ж12,...,ЖС2} U Г1'---'итЛ U ЕГ-'ХЛ □
U {жхз,..., жез} U • ■ ■ U {жця-х), ■ • •, жС(я-1)} U
и КЛ...,С4} ии ^н,..аЛ
(5-1)
В (5.1) вершина xgh соответствует множеству Xg^ а вершины и^ь и и1^ — элементу 2^, г^ = 1, . . . , m^, h = 1, . . . Н ™ 1.
Множество дуг, каждая из которых имеет пропускную способность, равную единице, определяется следующим образом:
л = {(в,ж51)| g = ТГс}и
и{Щ1,гД)| g = 1,G Д 7i €Д w^ € Хг1}и
□ {(4’4)1 *1 € {1, . . . ,mi}}U
U{«,^2)| 11 е {1,... ,7711} Л g = 1,G Л Д € Xg2}ll
U {(^2,^)1 g = 1,G Д i2 e {1,... ,m2} л w^ e Xg2} и • • •
и {(^(h-i),^^ s = i?G Д »H-1 € {1,, 777/7-1} A t^y e
€ Xg(H-i)} u {(M;L ' ’ A ') ^-! e {Г • • • ,тн-1}}ии{(^715жгн)| 7н-1б{1,... , 777н-1}л g = !ЩД ЯУ eXgH}uи{Щя,г)| g = 1Щ}. (5.2)
На рис. 5.13 приведен пример сети N = (V, А) с множествами вершин и дуг, определяемыми в соответствии с (5.1), (5.2), для последовательностей ХсС = 4иЯ = 2.
Таким образом, в сети N = (У, А) любая вершина xgh представляет множество Xgh в наборе Х^ длины G^ а пара вершин и^ь и v^ со™
Рис. 5.13. Пример сети для поиска общей трансверсали архитектурных признаков
ответствует архитектурному признаку z^h, входящему в объединение множеств Xgh и Xg^^xy
Ниже приводится утверждение, устанавливающее необходимое и достаточное условие существования описания целевой архитектуры для семейства признаков X. Доказательство этого утверждения строится на том, что существует взаимно однозначное соответствие между паросочетаниями в любом двудольном графе Н и нуль- единичными потоками в сети S(H), построенной на этом графе. Далее, каждая трансверсаль % семейства (Хх,...,Х^) однозначно соответствует паросочетанию мощности G в двудольном графе Н = = (X, У, Е\ В нем
X = Х1 и ... и XG =.. . , жт} , У = Щ,... , yG} ,
Е = { Щ, у/}| г € {1, • ■ ■, ттг} A xt е Xg A g = 1, • ■ •, G}.
Трансверсаль % = (хх, • • • , Xg) соответствует паросочетанию
{{$i,Z/i},---,{a:G,yG}}.
Теорема 5.1. Пусть X = (Xj,. . ., Xя) — последовательность G-наборов, соответствующих функциям целевой архитектуры. Описание архитектуры существует тогда и только тогда, когда в сети N = (V, А) (5.1), (5.2) существует нуль-единичный поток величины G.
Доказательство. Положим, что X = (Хъ • • ■ , Xg) — общая трансверсаль для Хх,...,Хя- Это означает следующее. Если х —
-/хЛ
трансверсаль Хх и существует такая подстановка ах = I _/ I, где Х2 —
_\ Х2/_
перестановка Х2, что х есть общая трансверсаль для набора Хх и
набора Х2, то х — общая трансверсаль для Хх и Х2.
Далее, пусть существуют подстановки
где Х3, . . . , Хя — перестановки Х3, . . . , Хя, такие что х — общая транс™ версаль для последовательности (Хх,Х2, . . . , Хя), а значит, и для X.
Рассмотрим следующие тройки двудольных графов. Первый граф тройки Н^ = (Хх, Ui, Е[), где Хх = {жц,. . . , ж^х}, Ui = = {t^x, . . . , и^} — множества вершин, а каждое ребро е^ Е Е^ имеет вид е^ = {жх,пх}, где жх Е Хх, и1 Е Uv Другой граф Н" = = (1Д, Xi, X"), где ¥i = {??x, . . . , ж^1} — подмножество вершин, а любое из ребер е" Е Е" представляется как е" = {тж1, гД}, причем n1 Е U^ v1 Е Ух- Наконец, третий граф Нх' = (Ух, Х2, Е^) с подмножеством вершин Х2 = (жх2, • • • , ж^) и множеством ребер Е^, каждое из которых имеет вид e”f = {ж1, ж2}, где ж2 Е Х2 (см. рис. 5.13).
Число таких троек двудольных графов равно Н — 1:
/тт/ и// ттНА/ТТ/ тт" тт///\
Нх, Нх ), где
Ня„х = (Хя^х, Uh^i. Хя„х), Ня„х = (//я^х, Vh^i, Хя„х),
Н'^^^Ун-ьХн^'йЩ.
При этом
Хн-1 = {Ж1(я-!), ■ ■ • , ЖС(я-1)} , Uh-1 = {и^-1, . . • ,’
(Ve'^-! € Е'н_1^ е'я-i = {®н-1, ^ 1}, $h-i^XH-i, ин 1eUh-i-
Далее,
ин™х Е Uh-ъ Vя™1 е Vh-i-
Наконец,
Хн = {ж1я, ■ • • , ^ся}, ^ея_х Е Е^^ ея_х = {уя™\ хн^
Е ун_щ хн Е ХН-
Обозначим через и\ vh наборы длины т^, образованные различными элементами множеств Uh^ Vh- Пусть
— подстановки такие, что существует взаимно однозначное соответствие между нуль-единичными потоками в сети N = (V, Л) и в тройках сетей
(sro, s(h"), seo, ^(н^), s(h^
Каждая из сетей в тройке строится на соответствующем двудольном графе.
Если существуют подстановки од, ... , стн-ъ т0 существуют и па- росочетания мощности G в графах соответствующих троек
/тт/ и" и///\/и/ и" тт///\
Ня_1,
Между паросочетаниями в двудольном графе Н и нуль-единичными потоками в сети S (Н) имеется взаимно однозначное соответствие. Значит, существуют нуль-единичные потоки величины G в сетях троек
№), s(H"), s(H'")),
Следовательно, существует и поток величины G в сети N = (К, Л).
Пусть теперь, наоборот, имеется нуль-единичный поток величины G в сети N = (К, Л). Тогда существуют потоки такой же величины и в сетях троек (S(H^), S(H"), S(H^)). В свою очередь это означает существование паросочетаний мощности G в графах Н^, Н^, Н^7. Поэтому найдутся подстановки од, ... , стн^х такие, что % будет общей трансверсалью для последовательности X. Что и требовалось доказать.
Здесь приведено довольно подробное доказательство теоремы 5.1, поскольку оно может быть использовано для разработки соответствующих алгоритмов проверки существования целевой архитектуры, реализующей заданную спецификацию прикладной программы. Эти алгоритмы могут реализовываться на основе следующей схемы.
Для заданной последовательности Х = (Х1? . . . , Хя) семейств архитектурных признаков построить сеть N = (V, А) вида (5.1), (5.2).
Найти максимальный нуль-единичный поток в сети N = (V, А).
Если величина потока равна числу G множеств архитектурных признаков, то целевая архитектура для последовательности X существует.
Описанию целевой архитектуры соответствует паросочетание в графе Н^_х, принадлежащем (И™ 1)-й тройке двудольных графов, на которых строится сеть N = (V, А).
Если величина потока меньше G^ то изменить последовательность X и перейти к шагу 1.
Так, для примера, приведенного на рис. 5ЛЗ, общая трансверсаль для двух семейств архитектурных признаков однозначно определяется паросочетанием {{^2? ж12 } ? {^п ^22}? {^5, ^32}, {^з, ^42}} - Поскольку существует взаимно однозначное соответствие между вершинами вида и1^ и элементами z1^, то описание целевой архитектуры для данного примера — это последовательность признаков (z^, z\ £5, - j) • В общем случае для Н семейств описание архитектуры образуется набором признаков из множества {г^”1, . . . , -^^ }•
2.4. Сложность поиска описания. Какова оценка сложности нахождения описания для последовательности X = (Xi, . . . , Хя)? Пусть п — число вершин, I — число ребер двудольного графа. Алгоритм нахождения наибольшего паросочетания методом Хопкрофта-Карпа (см. § 5.4) имеет сложность О ((Z + п) -^п), поскольку число фаз в этом алгоритме не превышает 2 [V^J + гДе 8 — наибольшая мощность паросочетания, а |_*J — ближайшее не большее ^ целое число. Фаза —
увеличение существующего паросочетания вдоль максимального множества путей из s в t с попарно различными множествами вершин во вспомогательном бесконтурном графе (см. § 5.4). Ясно, что число фаз при числе вершин п имеет порядок Ач поскольку s < п.
Пусть в задаче отыскания системы различных представителей для последовательности (Ai, . . . , Ап) множеств т + п обозначает число вершин в двудольном графе И. Число ребер не больше 52 I AI- 3=1
Множества вершин графа Н: X = Ai (J - ■ • U Аг = {жъ - - ■ , У = {?/i, . . . , ynY Сложность нахождения системы различных представителей (ai,...,an) или паросочетания мощности п в графе Н по алгоритму Хопкрофта-Карпа с числом фаз 2 |_Аф| + 1 составляет о(^/п(^т + п + 52 I Al))- Поскольку m 52 I ^jk т0 оценка сложности как функции от п — это О ^уА^п + 52 I Al))• ^ак
как ^з € {1, . . . , п}) | Aj \1, то
3 = 1
Отсюда получаем следующую оценку сложности нахождения системы различных представителей для последовательности (Лх,. . . , Ап):
Теорема 5.2. При исполъзовании метода Хопкрофта-Карпа сложности нахождения описания уелевой архитектуры, реализующей спеуификауию Ф, имеет оуенку
Н~1 G
O^Vg 1>М + lxs(^+i)l
/1=1 g=l
Доказательство. Сложность нахождения общей трансверсали для последовательности Хх, . . . , Хя определяется сложностью нахождения паросочетаний мощности G для Н — 1 троек двудольных графов Н^, Н^, Н^7. Если применить алгоритм, реализующий метод Хопкрофта-Карпа, то оценка сложности для произвольной тройки определится следующим образом.
Для графа Н^ с числом вершин тн + G и числом ребер 52 (I х^/г| +
+ | Х^рг+1)|) сложность составляет
G
О (VG + G + У2 (|Xg/i| + |Х^(/г+1)I)))-
Для графа Н^ сложность имеет порядок О^л/Стн^ поскольку число вершин равно 2т^ а число ребер тн.
Для графа Н^ так же, как для графа Н^, имеет место оценка
G
O^VG^mh + G + У2 (1Х5г/г1 + |Xg(/i+i)|)]]-g=i
G
При этом ть ^ 52 (|^/г| + |^(/г+1)|)- Отсюда получаем порядок
числа шагов алгоритма применительно к тройке (Н^, Н^, Н^'):
GG
0^/G^G + 2 У2 (1Х5Г/г| + |Х^(/г+1)|) + У2 (1Х^/г| + |Xg(/1+1)|) + g=lg=l
G
+ G + 2 У2 (lxsr/il + |х^(/г+1)|)))-
g=l
Далее, (Vg е {1,.. . , G}) |Xg/l|, |Xg(h+1)| > 1. Значит,
GG
G+2 52 0x^i + Ix^+dI)<3 52 (ix^i + lx^(^+i) I) ■
g=l
Отсюда получим оценку сложности для Л-й тройки
G
(1ХЩ + Ix^/^!)!)),
а для Л ™ 1 троек сложность составляет
Н-1 G
«И XX(|^g/i| + |^Д/г+1) |)^ •
^=1 ST = 1
Теорема доказана.
Практическое значение теоремы 5.2 обусловлено тем, что, как уже отмечалось в § 5.1, число Н вариантов допустимой начальной фрагментации спецификации Ф из К = |Ф| объектов значительно меньше числа sk,g всех разбиений К-элементного множества на G блоков.
Следующий параграф посвящен отысканию окончательного вида разбиения согласно найденному описанию целевой архитектуры.
§5.3. Разбиение спецификации программы
Задача доопределения. Пусть решена задача второго этапа и выполнено расширение подмножеств Ф^, . . . , Ф^ до подмножеств 991,, 99g, причем 99i (J • • • U Фс = Ф (см- § 5.1). Дело в том, что
процедура отыскания общего описания у архитектуры для Н семейств признаков, основанная на поиске максимального нуль-единичного потока в сети N = (V, Л), вовсе не гарантирует получения разбиения спецификации Ф согласно найденному описанию. Теперь, на третьем этапе необходимо найти разбиение тг (Ф), соответствующее описанию у. Это разбиение назовем доопределением семейства 99/ = {99i,...,99g} расширенных подмножеств. Можно проиллюстрировать необходимость доопределения с помощью диаграмм, приведенных на рис. 5.14.
На рис. 5.14, а показаны пересекающиеся множества семейства ф! = = {991,99 2,99 3,99 4}. Эти множества соответствуют расширенным подмножествам 991,99 2,99 3,99 4 объектов спецификации и четырем функциям целевой архитектуры. На рис. 5.14, б показан один из возможных вариантов доопределения, результатом которого является разбиение G
множества U 99^, где G = 4, на четыре блока. При этом
(71 С 991, (Т2 с 99 2, (7 3С99 3, а4 = 99 4, GG
U = U Vg, ^"1 о ^"2 о ^з о ^4 ~ 0.
g=lg=l
Рис. 5.14. Иллюстрация процедуры доопределения
Обозначим через (^i, . . . , ^п) последовательность различных элементов пересечений множеств 991, . . . , 99 с, а через S = (5ц,. . . , 5П) — семейство непустых непересекающихся множеств. При этом имеют место биекции Sj ^ ф^ где j = 1, . . . , п, ф^ — совокупность пересекающихся множеств семейства ф’ таких, что tpj — элемент пересечения, а ф-^ . . . , (pj, . . . , ф^ не обязательно не пересекаются.
Рассмотрим тп-элементное множество Е, для которого S является разбиением и т = ^ \^j\- Упорядочим элементы Е = {ei, . . . , em} по невозрастанию неотрицательных вещественных весов: w(ei)^ > w (е2) >...>w (ет).
Задача оптимального доопределения, заключается в том, чтобы найти подмножество ТСЕ с наибольшим весом w (Т) = J2 w (eL где ест
|Т| = п. Это означает, что необходимо отобрать п подмножеств Е, пересечения которых образуют последовательность (^1, . . . , фп). В результате доопределения каждый элемент ф.^ должен быть закреплен за одним и только одним из пересекающихся подмножеств ф^ и исключен из других (см. рис. 5.14, б\ При этом сумма весов подмножеств, за которыми закрепляются элементы ^1, . . . , фп^ должна быть наибольшей.
Основные этапы доопределения. Для оптимального доопределения разбиения необходимо: во-первых, выделить последовательность (^х, . . . , ф^ все элементы которой различны; во-вторых, построить семейство 5; в-третьих, из множеств Sj семейства S отобрать п разных элементов, сумма весов которых будет наибольшей.
На первом этапе доопределения выполним следующие операции. Найдем пересечение G множеств семейства ф1:
= ^1 Л • • • Л
Далее найдем все пересечения G — 1 множеств из ф\ число которых не превышает числа сочетаний Cq™1 =_ 1):
Построим разбиение вида тг^-! = {V^^WFs? ^gg^M^V
Рекуррентно продолжим построение разбиений, отыскивая на шаге г + 3 все пересечения G — г + 1 множеств ф*. Их не более (7^^г+1 = = (G, G — г + 1), т. е. ^™г+1, . . . , ^G^^xy Рассмотрим некоторое пересечение ^^™г+1, где 1 s (G,G —г + 1). Пусть ^s(G-_^+2) — объединение всех пересечений множеств ф\ найденных на (г — 1)-м шаге и участвующих в образовании пересечения ■^^г+1 На шаге г = = 3, . . . , G — 1. Построим следующее разбиение:
—г+1 = ^Ф1 l+1\^l(G^i+2B • • • ’ Ф? t+1\^s(G-i+2r • • •
■ ■ • ’ ^(+е+Л+1)+’(с-г+1)(а-<+2)}-
Поскольку индекс s изменяется от 1 до (G, G — г + 1), а число пересечений на (г — 1)-м шаге не превышает С^™г^"2^ то некотОрые подмножества ^5(с^+2) являются пустыми.
Наконец, найдем попарные пересечения ^, . . . , ^G 9р где (G, 2) = = CG, и построим разбиение вида
^2 = {++13, • ■ ■ , ^^,2)+с,2)з},
где ^1з? • • • ? ^(0,2)3 — объединения блоков разбиения пересечений из G по три тех подмножеств, которые участвуют в формировании попарных пересечений ^^,. . . , ^G
Результатом первого этапа является семейство разбиений тг = = {тг^, . . . , тгдЗ множества пересечений элементов семейства ф' = = {921,. . . , +g}, где 2 г G, 1 ir G — 1.
Проиллюстрируем первый этап диаграммами рис. 5.14, а. На шаге г = 1 отыскивается разбиение яд: оно пусто. На шаге г = 2 получаем разбиение яд = {921 Л +2 Л +з}5 +1 Л +2 Л +з = ^v На шаге г = = 3 строится разбиение попарных пересечений, причем из его блоков удаляются элементы, вошедшие в пересечение при г = 2:
7Г2 = {^1 П ^2\^1, ^1 П ^з\+, 9^2 П УзMG ^ Л уД-
Таким образом, получается семейство {тг2, яд} разбиений пересечений множеств ф!.
На втором этапе пронумеруем элементы тгд U • • • U ^G? определив последовательность (^1? . . . , ^п), где п = |я"д | + . . . + |ядг |. После первого этапа известны пересекающиеся множества, образующие фу элементом которых является фу j = 1, . . . , п. Сопоставим каждому элементу t^j множество Sj, элементы которого находятся во взаимно однозначном соответствии с элементами множества фр Если при этом одним и тем же пересекающимся множествам из ф\ содержащим ^j ^ = ФзГ Ь з' ^ {1, • • • , ^}, соответствуют различные элементы Sj, Sj^ причем Sj Л Sy = 0, то получаем разбиение S = (51, . . . , S^.
На третьем этапе необходимо решить, какому элементу множества 5*j соответствует элемент ^j. Тогда в итоге объект спецификации ф^ будет закреплен за одним и только одним из множеств совокупности ^j.
Обоснование процедуры оптимального доопределения. Рассмотрим матроид разбиений М = (Е, J), где
Е = J Sj, J= {АСЕ: |А П Sj| < 1, j = l,...,n}. j=i
Тогда для того, чтобы найти какое-либо решение задачи доопределения, нужно отыскать одну из баз этого матроида (см. § 5.4).
Пусть t = (Н, - - - , t-п) — трансверсаль семейства 5, независимая относительно матроида М = (Е, J) (см. § 5.4). Тогда 7 является одним из решений задачи доопределения. Действительно, прежде всего на основании теоремы Радо можно утверждать, что такая трансверсаль всегда существует, поскольку объединение любых j подмножеств S имеет ранг, не меньший чем j (см. § 5.4). Это следует из способа построения семейства я, последовательности (^i, . . . , фп) и семейства S.
Пусть 71 и ?2 — Две различные трансверсали S. Объединения их элементов Bi и В2 соответственно удовлетворяют аксиомам баз, поскольку S — разбиение Е:
ни Bi, ни В2 не включают друг друга;
(VP Е В1)(ЕР/ Е B2)(Bi\{P}) U{O = В3 — база, поскольку В3 — максимальное независимое множество ранга п матроида М = (E,J).
Следовательно, В = (J tj — одна из баз матроида М. Между множеством трансверсалей семейства S и множеством баз матроида М существует взаимно однозначное соответствие.
Построим доопределение по шагам, ассоциируя 7-й шаг с анализом множества Sj. Пусть элемент tjg Е Sj трансверсали 7 соответствует множеству pg Е pf, pg Е pj, g = 1, . . . , G, элементом которого является 'ф j - Тогда оставляем без изменения множество рg и исключаем элемент ф ^ из остальных | Sj | — 1 подмножеств совокупности pj. Получаем новое семейство p'j и переходим к (j + 1)-му шагу. Число таких шагов равно п. После получения семейства р'п задача доопределения решена, поскольку в результате построено семейство, являющееся разбиени-
G
ем (J pg. На каждом из шагов доопределения элементы пересечения множеств из рj оставались в одном и только одном из множеств рj и исключались из других.
Рассмотренная выше процедура дает возможность нахождения какого-либо из доопределений, число которых может быть и более одного, поскольку на каждом из п этапов произвольно выбирается подмножество pg, остающееся без изменения. В примере на рис. 5.14, б раз-
биение тгз закрепляется за множеством 921, а «лепестки» разбиения ?Г2 распределены между множествами 922,92 3,92 4. Сложность нахождения какого-либо решения t задачи доопределения составляет О (1), т. е. не зависит от |Е| = т. Действительно, для любого доопределения элемент tjg Е Sj можно выбирать совершенно произвольно, и соответственно элемент фj можно закрепить за любым из множеств ф^.
Практически важнее другой случай, когда отыскивается оптимальное решение Т задачи доопределения спецификации программы.
Теорема 5.3. Сложность нахождения оптимального по Гейлу решения задачи доопределения составляет О (т) .
Доказательство. Применяя жадный алгоритм (см. § 5.4), можно сформировать подмножество Т С Е, являющееся базой с наибольшим весом. При этом проверка условия включения в базу Т (J {еД Е J, где I = 1, . . . , пр осуществляется на основании следующей посылки:
(Vj|(Ти{е/})П^|<1.
Тем самым мы находим множество Т, оптимальное в очень сильном смысле — по Гейлу (см. § 5.4): в любом независимом множестве вес j-ro по величине элемента не больше веса j-ro по величине элемента в Т.
/ ПX
Число шагов жадного алгоритма имеет порядок О ( 52 I ^Ъ' I Ь по™ 4=17
скольку 8 является разбиением Е. Для каждого из т элементов Е нужно лишь проверить условие его включения в базу Т с наибольшим весом. Теорема доказана.
Линейная оценка сложности поиска оптимального по Гейлу решения задачи доопределения — следствие специальной организации G
семейств тг и 8. Заметим, что наибольшее значение т равно 52 g ^g* g=2
Действительно, число членов семейства тг не превышает G — 1. При этом (Vg Е {2, . . . , G}) |тг^| С^ а мощность множеств из 8соответствующих тг^, равна g.
Положим, что 8 не является разбиением Е, т. е. содержит не обязательно непересекающиеся множества Ui^. . . , Un, a M = (E,J) — матроид трансверсалей (см. § 5.4). Тогда поиск оптимального по Гейлу решения задачи доопределения включает в себя отыскание наибольшей по весу трансверсали семейства ((Д, . . . , Un) и биекции р: Т -Е
{1,2, . . . , п}, где Т С Е и (Vt Е Т) t Е Up^ty Сложность нахождения наибольшей по весу трансверсали и биекции р имеет порядок
О(т 52 Щ?!)- Поскольку 52 \Uj\ ^ тп^ то это означает не менее чем
квадратичную оценку сложности, что подчеркивает преимущество рассмотренной процедуры доопределения с линейной временной асимптотической сложностью.
Заметим, что поиск разбиения конечного множества элементов произвольной природы на блоки, удовлетворяющие заданным требованиям, является весьма распространенной оптимизационной задачей. Часто эту задачу удается свести к задаче доопределения до разбиения некоторого «промежуточного» представления исходного множества (об этом уже говорилось в конце § 5.1, где речь шла о разбиении спецификации вычисления у = V^Y В этом параграфе мы рассмотрели процедуру доопределения, результатом которой является разбиение спецификации программы на блоки, оптимальные в очень сильном смысле — по Гейлу. Сложность поиска оптимального по Гейлу решения задачи доопределения линейно зависит от суммарного числа пересечений множеств «промежуточного» представления.
В заключение данного параграфа подведем некоторые итоги.
Синтез описания целевой архитектуры и построение соответствующей ему начальной фрагментации спецификации — взаимосвязанные процедуры (см. § 5.1).
Целевая архитектура определяет способ функционирования системы посредством разрешенного набора у признаков и разбиения тг (Ф) спецификации программы в соответствии с функциями, реализуемыми вычислительной системой для выполнения программы.
Разобранный подход к синтезу архитектуры включает в себя: поиск ее частичного описания (см. § 5.2) с последующим построением полного набора архитектурных признаков; отыскание общего описания для разных вариантов начальной фрагментации (см. § 5.2); построение разбиения спецификации, соответствующего найденному описанию (см. § 5.3).
Наконец, необходимо подчеркнуть, что рассмотренные выше комбинаторные схемы и методы ни в коей мере не претендуют на полноту формализации процесса синтеза архитектуры. Они изначально основываются на экспертных знаниях и предназначены для того, чтобы «справиться» с объективно существующей неполнотой этих знаний о реализации функций, заданных спецификацией программы, и неизбежно высокой трудоемкостью обоснованного выбора архитектурного решения.
§5.4. Комментарий и краткий обзор к главе 5
Краткая сводка необходимых сведений по комбинаторике и теории графов. Основной математический аппарат, который используется в этой главе, — это потоки в сетях и связанные с ними задачи [39], а также теория матроидов и жадные алгоритмы [36, 38]. Именно по этим разделам теории графов и комбинаторики ниже приводится минимум сведений, которые нужны для понимания отдельных этапов синтеза целевой архитектуры.
Существует целый ряд алгоритмов поиска на графах, использующих систематический просмотр вершин, когда каждая из них анализируется лишь однажды. Один из методов, применяемых в таких
алгоритмах, называется поиском в ширину. Его основная идея заключается в следующем. Выбирается произвольная вершина uq графа G = = (V, Е) с множеством V вершин и множеством Е дуг. Определяются все вершины-соседи, т. е. вершины, находящиеся от uq на расстоянии в одну дугу. Произвольно выбирается вершина щ из окружения вершины ио и рассматривается окружение Ui. Процесс продолжается до тех пор, все вершины графа G не будут просмотрены.
При поиске в глубину просмотр также начинается с некоторой произвольной вершины vo- Затем просматривается какая-либо вершина щ, смежная с vq, и процесс повторяется от вершины щ. Если не существует вершин смежных с щ, то осуществляется возврат к vq и выбирается другая, смежная с ней вершина. Таким образом, в отличие от поиска в ширину, поиск в глубину от вершины v € V основан на просмотре всех вершин, смежных с и.
Для определения трудоемкости, или сложности, алгоритма часто используют О-символику. Говорят, что неотрицательная функция / (п), где п — размерность входа (натуральное число), не превосходит по порядку функцию g (п\ если существуют такие константы О, N > 0, что / (п) ^ С g (п) для всех п G N. При этом используется запись / (n) = О (g (п)). Запись 0(1) означает, что сложность алгоритма не зависит от размерности входа. В такой символике временная сложность (число шагов) многих алгоритмов, использующих методы поиска в ширину или глубину, составляет О (|П| + |Е'|).
Сетью обычно называют произвольный ориентированный граф G= (V, Е\ каждой дуге которого некоторая функция (поток) ставит в соответствие неотрицательное вещественное число, называемое пропускной способностью дуги. В сети выделяются две вершины — источник s и сток t. Величину, равную сумме весов дуг, исходящих из источника s или входящих в сток С называют величиной потока. Поток не возникает и не накапливается ни в одной из вершин и Е Е V\ {sCY Алгоритмы построения потока с максимальной величиной (максимального потока), как правило, основываются на последовательном увеличении потока.
Произвольное подмножество М попарно несмежных ребер неориентированного графа называется паросочетанием. Паросочетание является наибольшим, если число ребер в нем наибольшее среди всех паросочетаний графа. В двудольном графе G = (V, Е) множество вершин V = X (J Y можно разбить на непересекающиеся подмножества X, ¥, а каждое ребро е Е Е имеет вид е = {ж, yY где х Е X, у Е Е Y. Задачу нахождения наибольшего паросочетания в таком графе Н = (X, Y^ Е) можно свести к поиску максимального потока в сети S(H), построенной на этом графе (см. § 5.2). Существует взаимно однозначное соответствие между нуль-единичными потоками в S (Н) и паросочетаниями в двудольном графе Н. При этом величина потока равна мощности соответствующего паросочетания. Для данного паросочетания MCE чередующейся цепью относительно М называется
произвольное подмножество дуг Р С Е, которое однозначно определяется последовательностью различных вершин жо, Уъ жы У 2 • • •? Уь хь уI > 0, жо, уг+i — свободные вершины в X, ¥ соответственно. При этом
р П м ={у2,ж2}, ■ ■ ■, {уьЩ}-
Метод Хопкрофта-Карпа позволяет найти наибольшее паросоче- тание в двудольном графе Н с п вершинами за О(п5/2) шагов. Детальное описание соответствующего алгоритма дается в книге [38], а идея метода состоит в следующем. Для заданного двудольного графа Н = (X, ¥, Е) строится вспомогательная бесконтурная сеть, пропускные способности всех дуг которой равны единице. Затем специальная процедура находит максимальное множество непересекающихся кратчайших чередующихся цепей. Эта процедура ведет поиск в глубину во вспомогательной бесконтурной сети, начиная с источника s. При этом существующее паросочетание увеличивается вдоль максимального множества путей из s в t с попарно различными подмножествами вершин во вспомогательной сети. Число фаз, увеличивающих паросочетание, имеет порядок д/п. Поскольку сложность построения вспомогательной сети определяется порядком числа шагов поиска в глубину, то сложность алгоритмов, реализующих метод Хопкрофта™Карпа, имеет порядок (ш + п) л/п, где т = \Е\. Ясно, что т < п2. Отсюда и получается сложность О(п5/2).
С помощью метода Хопкрофта-Карпа для заданного семейства (Лх, . . . , Лп) можно найти систему различных представителей (трансверсаль) или установить, что ее не существует за время порядка
o(Vn ± ИД).
j=l
Необходимое и достаточное условие существования трансверсали было получено Ф. Холлом.
Теорема Холла. Трансверсаль семейства (Л1, . . . , Лп) сугрест™ вует тогда и только тогда, когда
(V/ь е {1,..., п}) |ЛЙ (J Л2 U • - ■ U Ан\ 1 й п.
С паросочетаниями в двудольном графе G = (V, Е) связано и отыскание вершинного покрытия, которое представляет собой произвольное подмножество RCV такое, что любое ребро из Е инцидентно некоторой вершине из R. В произвольном двудольном графе максимальная мощность паросочетания равна минимальной мощности вершинного покрытия. Нужно заметить, что R является вершинным покрытием тогда и только тогда, когда в множестве V\R никакие две вершины не являются смежными (V\R называют независимым множеством вершин).
Рассмотрим следующую задачу. Пусть Е — непустое конечное множество, J — семейство его подмножеств, т. е. J С 2е, w: Е R+ — функция, значениями которой являются неотрицательные вещественные числа из R+. Она каждому элементу е Е Е присваивает некоторый неотрицательный вес w (е). Необходимо из J выбрать подмножество 5 € J с наибольшей суммой весов его элементов ^ ^ (4 = w (5*). eES
В некоторых случаях эту оптимизационную задачу можно решить с помощью так называемого жадного алгоритма:
Упорядочить множество E = {ei,...,em}no невозрастанию весов: w (ei) ^ w (е2) ^ . . . ^ w (ет).
S = 0.
Если 8 (J {еД G J, г = 1, . . . , т, то 8 = 8 (J {еД, иначе останов.
Возникает вопрос: всегда ли жадный алгоритм правильно находит подмножество 8 Е J с наибольшим весом? Оказывается, так происходит тогда, когда пара М = (Е, J) является матроидом.
Матроид — произвольная пара М = (Е, J), где Е — конечное непустое множество, a J — семейство его подмножеств, удовлетворяющих двум следующим аксиомам независимости.
Если Л Е J и В С Л, то В Е J (0 Е J).
Если Л, В Е J и \В\ = |Л| + 1, то (Зе Е В\А) Л (J {е} Е J.
Иногда матроид определяется как пара (Е,В), где Е — конечное непустое множество, а В — семейство его подмножеств (баз), удовлетворяющих аксиомам баз.
Никакая база не содержится в другой базе.
Если Въ В2 Е В, то ^b Е В^ (Зс Е В2) (ВД{6}) U {4 Е В.
Базы являются независимыми равномощными множествами. Мощность базы называется рангом матроида.
Теорема Рад о™ Эдмондс а. Если М = (Е, J) — матроид, то множество 8, найденное жадным алгоритмом, является независимым множеством с наибольшим весом. Если М не является мат™ роидом, то найдется функция w: Е R+ такая, что 8 не будет независимым множеством с наибольшим весом.
Множество 8, найденное жадным алгоритмом, является оптимальным в сильном смысле — по Гейлу: в любом другом независимом множестве Т вес г-го по величине элемента не больше веса г-го по величине элемента в 8. Таким образом, жадный алгоритм отбирает такое множество 8, в котором г-й по величине элемент не меньше г-го по величине элемента произвольной базы.
В § 5.2 упоминается следующая
Теорема Эдмондса-Фалкерсона. Пусть Л = (Л1,... . . . , Лп) — семейство подмножеств конечного множества Е, J —
семейство частичных трансверсалей А. Тогда (E,J) является матроидом.
Семейство J удовлетворяет аксиомам независимости II и 12 (при этом иногда соответствующим образом изменяется формулировка теоремы Эдмондса-Фалкерсона). Такой матроид называется матроидом трансверсалей семейства А.
Часто нужно отыскивать трансверсаль семейства А = (Ai, . . . . . . , Ап), которая является независимой относительно матроида М = = (Е, J) (Л — семейство подмножеств множества Е). Эта трансверсаль является независимым подмножеством матроида. Теорема Радо, частным случаем которой является теорема Холла, отвечает на вопрос о существовании такой трансверсали.
Теорема Радо. Пусть М — матроид с множеством элементов Е, Л = (Лх, . . . , Лп) — семейство непустых подмножеств множества Е. Трансеерсаль семейства Л, независимая относительно матроида М, существует тогда и только тогда, когда для У k G б{1,...,п} объединение любых к подмножеств А имеет ранг не меньший к.
Пусть 7г = {5х,...,5п} — произвольное разбиение множества Е, семейство подмножеств которого определяется так:
J = {ACE: |АП^|^1, j = l,...,n}.
Пару М = (Е, J) в этом случае называют матроидом разбиений. Вышеприведенная краткая сводка понятий из теории графов и комбинаторики будет также полезна при чтении гл. 6.
.2. Методы выбора целевой архитектуры. Существующие подходы к выбору (синтезу) целевой архитектуры вычислительной системы на основе заданных функций можно классифицировать по используемым методам отображения (разбиения) спецификации на архитектурные компоненты.
С помощью методов кластеризации можно выполнить разбиение спецификации на основе метрик близости операций (действий программы). Чаще всего цель кластеризации — уменьшение числа компонентов архитектуры за счет их совместного использования совокупностью (кластером) метрически близких операций. Подобная постановка задачи характерна для совместного проектирования аппаратных средств и программного обеспечения (hardware/software co-design), в частности для систем реального времени [158]. Здесь требуется выполнить заданные спецификацией действия в крайние или директивные сроки. При этом, как правило, стремятся минимизировать стоимость системы, которая определяется главным образом числом заказных сверхбольших интегральных схем (СБИС).
Метрическому подходу присущ ряд недостатков, рассматриваемых в [156]. Как отмечалось в § 5.2, возможны коллизии (противоречия) мет-
рик, например, близость по данным и совместимость операций. Кроме этого, метрики, как правило, строятся на локальных связях между кластерами, в частности, с учетом числа переменных, передаваемых между отдельными операциями. Практически же часто бывает важнее глобальная связность операций по данным и по управлению в той или иной модели обработки.
Часто кластерные методы используются в сочетании с языками спецификации, инвариантными относительно технической реализации функций архитектуры. Так, в [73] в качестве языка спецификации используется UNITY, который изначально разрабатывался как средство и метод спецификации параллельных вычислений. Этот язык сочетает в себе возможности нотации и формальной верификации программ. Язык позволяет описать синхронное и асинхронное взаимодействие процессов без их предварительного планирования и назначения на ресурсы. Таким образом поддерживается функциональный стиль спецификации и возможность анализа конкретных реализаций компонентов архитектуры в широком диапазоне — от программ до заказной аппаратуры. Близким к рассмотренному в [73] является метод объектноориентированных функциональных спецификаций [159], в котором используются теоретико-множественные нотации архитектуры. Состояние системы представляется объектами, которые реализуются как функции языка C++. Намеренный уход от операционной семантики в спецификациях обеспечивает гибкость в реализации архитектурных решений.
Выявление структуры вычислительных устройств на основе решения задач планирования и назначения операций наиболее характерно для высокоуровневого синтеза аппаратных средств [82, 139]. На алгоритмическом уровне спецификация задается на каком-либо языке описания аппаратуры, например VHDL [82]. Первый этап высокоуровневого синтеза — компиляция спецификации во внутреннее представление проекта в виде графа, дерева синтаксического разбора и т. д. Последующие этапы преобразования спецификации в структуру — планирование, привязка и назначение операций на компоненты (функциональные блоки, память и шины). Эти задачи решаются в рамках детерминированных моделей составления расписаний (см. § 6.1).
Быстрое прототипирование представляет собой совместное имитационное моделирование программных и аппаратных компонентов в единой инструментальной среде [72, 149]. Здесь не предполагается автоматизация разбиения спецификации. Акцент переносится на исследование свойств целевой архитектуры в широком диапазоне изменения ее параметров средствами имитационного моделирования.
Методы совместного проектирования аппаратных средств и программного обеспечения [74, 89, 152-154] основаны на исследовании динамических свойств моделей обработки (спецификации поведения системы). Отображение (разбиение) спецификации на программные и аппаратные компоненты осуществляется путем выявления критиче-
ских по времени выполнения фрагментов модели обработки и реализации их в виде аппаратуры, например как заказных СБИС. Как правило, при этом целевая архитектура вычислительной системы считается заданной и не выбирается.
Оригинальный подход к синтезу целевой архитектуры встроенных систем на основе эволюционных алгоритмов описывается в работе [78]. В [29] генетический алгоритм применяется для выбора числа, типов процессоров, коммутационной среды и оптимизации статического расписания выполнения программы в реальном времени.
Рассмотренные в этой главе комбинаторные схемы и методы позволяют формализовать отдельные этапы выбора целевой архитектуры на основе заданных спецификацией функций программных приложений. При этом применяются классические комбинаторные алгоритмы или их модификации. Так, использование сети для поиска трансверсали путем построения максимального нуль-единичного потока известно [38]. В случае синтеза описания архитектуры сеть строится для отыскания общей трансверсали Н семейств, что связано с Н вариантами начальной фрагментации спецификации программы.
Многочисленные оптимизационные задачи проектирования дискретных систем сводятся к отысканию разбиения конечного множества, удовлетворяющего определенным требованиям. Примером может служить задача построения кратчайших разбиений в синтезе заказных и полузаказных СБИС [54]. Часто необходимо найти разбиение множества путем доопределения «промежуточного» представления в виде семейства не обязательно непересекающихся подмножеств, причем это семейство является покрытием исходного множества. Рассмотренный в § 5.3 метод доопределения разбиения спецификации программ основан на результатах, изложенных в [54].
Глава 6
МАСШТАБИРОВАНИЕ РЕСУРСОВИ РАСПРЕДЕЛЕНИЕ ВЫЧИСЛЕНИЙ
Модели планированияи распределения вычислений
Особенности распределения ресурсов в масштабируемых системах. В § 1.3, где речь шла об управлении ресурсами в системах пакетной обработки, мы уже говорили о том, что при определении порядка выполнения работ программа-планировщик использует информацию пользователя о потребностях запускаемого приложения в ресурсах. В системах управления ресурсами эта информация оформляется в виде опций команды ввода работы (qsub или submit). Так, опция «заказ ресурсов» описывает потребности в типе, числе, производительности процессоров, пространстве дисковой и виртуальной памяти и т. п. Эти данные могут быть получены в результате анализа пользовательских программ инструментальными методами, описанными в гл. 4. Если работы являются зависимыми, то в опциях команды ввода перечисляются эти зависимости и указываются их типы.
Примеры типов зависимостей: after/before — запуск работы по- сле/прежде работ, с которыми она связана отношением зависимости; syncswitch — одновременный запуск работ; af terany — запуск работы после окончания выполнения любой другой работы.
Динамическое управление потоком работ осуществляется в зависимости от потребности и наличия соответствующих ресурсов. Известно, что в пакетном режиме обработки используются очереди, однако это вовсе не означает, что порядок выполнения независимых работ строго предписывается очередностью ввода. В процедуре бэкфилинга, реализуемой, в частности, планировщиком Maui, работа может быть запущена, если свободен необходимый ресурс и при этом не блокируется начало очереди (см. § 1.3).
Некоторые планировщики, такие, например, как в системе PBS, могут манипулировать не только работами, но и очередями: упорядочивать их по приоритету с помощью параметра sort_queues или
вовсе игнорировать, просматривая всю совокупность работ (атрибут by_queue), и т. п. Более того, в современных системах управления ресурсами, в том числе DQS и PBS, с помощью специальных средств конфигурирования (утилиты администратора qmqr) можно гибко настраивать ресурсные ограничения. Так, атрибутами resources_min и resourses_max можно задать диапазон, при попадании в который ресурсного запроса работы она заносится в соответствующую очередь. В системе DQS ресурсы подразделяются на статические, не изменяемые в течение большого временного интервала, и динамические, расходуемые.
Статические ресурсы могут быть представлены в виде описания архитектуры процессорного узла, например, четырехпроцессорная платформа Sun UltraSPARC, операционная система Solaris 2.6, объем памяти 256 Мбайт, программное обеспечение MPI. Это описание связывается с определенной очередью. Если заказ ресурсов в команде qsub удовлетворяет заданным ограничениям, то работа будет поставлена именно в эту очередь.
Примеры динамического ресурса: общая разделяемая память, дисковое пространство, лицензионное программное обеспечение при наличии ограничений на число пользователей. В системе PBS динамический ресурс может быть описан атрибутом resourse_available. Если занятость ресурсов превышает порог, задаваемый этим атрибутом, запуск работ временно прекращается. В системе Condor все узлы, включенные в пул, декларируют свои возможности: тип и производительность процессоров, пространство дисковой памяти, среднюю загрузку и т. д. Condor выполняет роль брокера, подыскивающего в соответствии с запросом ресурсов предложение со стороны вычислительных узлов.
Таким образом, с одной стороны, имеют место требования пользователя, специфицируемые в виде ресурсного запроса, а с другой стороны, реально выделяемые ресурсы, гарантирующие выполнение пользовательской программы. При этом уровни запрашиваемых и выделяемых ресурсов могут не совпадать. Действительно, положим, что планировщик решает задачу балансировки вычислительной нагрузки узлов в неоднородной системе по всей совокупности независимых работ в течение некоторого временного интервала. Пусть для выполнения некоторой работы за время Д необходимо N процессоров типа Д. Если ту же работу можно выполнить за время t^ < й на N свободных процессорах типа Д большей производительности, то во избежание простоя процессоров типа Д планировщик может загрузить именно их этой работой. Теперь, предположим, работа с атрибутами t^ N, Д допускает прерывания, миграцию и повторный запуск на других N узлах типа Д. Очевидно, что если планировщик решает задачу балансировки общей нагрузки узлов по совокупности взаимозависимых работ на заданном интервале времени, то время счета этой отдельной работы может быть и больше Д. При этом, разумеется, вся система
работ должна гарантированно выполняться с соблюдением временных и ресурсных ограничений.
Следовательно, уместно говорить не о длительности работы, а о времени, отведенном для ее выполнения.
Такое, казалось бы, очевидное, но двоякое проявление свойств ресурсов в схеме «запрос-предложение» тем не менее требует переосмысления некоторых положений классических моделей составления расписаний. Как было замечено в [84], планирование процессов вычислений в распределенных системах, в отличие от моделей составления расписаний, обогащается таким важнейшим компонентом как управление ресурсами. Функциями управления наделяются менеджер ресурсов и планировщик, которые реализуют определенную политику взаимодействия вычислительных ресурсов и их потребителей.
Качество планировщика может оцениваться по двум позициям: во- первых, насколько хорошо по производительности, во-вторых, насколько эффективно в смысле накладных расходов он реагирует на запросы ресурсов со стороны потребителей. Иными словами, пользователи заинтересованы в быстром и эффективном доступе к ресурсам и вовсе не желают разбираться с побочными эффектами, которые сопровождают управление ими. В схему «запрос-предложение» включается еще и момент психологического порядка. Как уже говорилось, планировщик в системе управления ресурсами опирается на информацию о запускаемой работе, которая предоставляется пользователем. Возникает вопрос: насколько она адекватна реальным времени выполнения работы и ее потребности в вычислительных ресурсах? Вполне понятно, что пользователь, желая поставить свою программу в более выгодное положение по сравнению с другими программами, запускающимися в пакетном режиме, может завышать требования к резервируемым вычислительным ресурсам. Это также необходимо учитывать в политике планирования распределенных вычислений. Наконец, еще один важный аспект, определяющий серьезное отличие планирования в распределенных системах от составления традиционных расписаний. Вопрос, где выполнять вычисление, куда назначать работу, в этих двух случаях имеет разное смысловое содержание.
В традиционных расписаниях для параллельных систем [6, 10] процесс остается под управлением одной операционной системы. В распределенных системах высока степень автономности узлов, а на различных сайтах глобальной среды Grid могут устанавливаться свои системы управления ресурсами с разными локальными планировщиками и нет единой политики выделения ресурсов. Все это приводит к тому, что в распределенных средах в общем случае необходима стратегия планирования, т. е. должен существовать не один, а множество вариантов распределения ресурсов (в зависимости от наступления внешних по отношению к программе событий, динамично меняющегося окружения из-за пространственно-временной конкуренции различных программ и т. п.).
Далее мы рассмотрим основные компоненты традиционных моделей составления расписаний, чтобы нагляднее продемонстрировать требования к моделям планирования в распределенных масштабируемых средах. Эти компоненты образуют своего рода систему отсчета, которая позволяет понять различия между составлением расписаний и планированием вычислений на основе масштабируемых моделей обработки.
Компоненты моделей составления расписаний. Методы планирования процессов и прогнозирования времени выполнения программ варьируются в зависимости от приложений и постановки задачи. Когда речь идет о выборе конфигурации или комплектации вычислительной системы, как правило, подразумевается составление статического (априорного) расписания. При этом планирование осуществляется до начала вычисления. В основе динамического планирования, в частности, алгоритмов диспетчирования, лежат в основном эвристические, приближенные методы. Что же касается масштабирования вычислительных ресурсов для выполнения конкретного приложения, то здесь, разумеется, уместны планирование и назначение процессов, опирающиеся на некоторые априорные оценки и прогнозы. Кроме того в ряде случаев необходимо выполнять комплексы сложных взаимосвязанных работ, состав которых не изменяется длительное время.
Принципиальные допущения, которые делаются в детерминированных математических моделях составления расписаний [6, 10, 11, 37, 42, 45, 47], основаны на том, что вся информация об операциях (элементарных процессах) заранее известна: 1) задано отношение предшествования операций, например в виде графа; 2) все операции должны быть выполнены; 3) известны длительность каждой операции и ее потребность в том или ином типе ресурса; 4) на один экземпляр того или иного типа ресурса (например, на один процессор) в текущий момент времени может назначаться только одна операция.
Общая постановка задачи построения расписания состоит в том, чтобы с помощью некоторого множества процессоров и дополнительных ресурсов, таких, как память, библиотечные компоненты в виде программ, доступных специализированных процессоров ит.д., выполнить фиксированную систему операций. Цель — для определенных свойств операций и особенностей архитектуры, выраженных через доступные ресурсы и наложенные на них ограничения, построить оптимальное расписание при заданной мере эффективности.
Время является независимой переменной в описании выполнения операций. Операции могут быть элементами более сложных, составных действий. Расписание считается допустимым, если: в каждый момент времени суммарные уровни потребления ресурсов по всем операциям не превосходят общего уровня наличия ресурсов; не нарушается отношение предшествования операций; выполняются дополнительные условия в виде директивных или крайних сроков и т. п.
Таким образом, задачи составления расписаний решаются в условиях определенной архитектуры или заданной математической модели вычислительной системы. Например, задача минимизации стоимости системы при ограничении на время выполнения алгоритма, поставленная как выбор комплектации (набора процессоров), все™таки предполагает решение в рамках конкретной архитектуры [6]. Она неявно фик™
Рис. 6.1. Основные компоненты моделей составления расписаний сируется посредством ограничений на ресурсы (число процессоров), заданием длительности каждой операции и стоимости использования процессора соответствующего типа.
Рассмотрим более подробно основные компоненты моделей составления расписаний и взаимосвязи между ними (рис. 6.1).
Принципы построения расписания. Пусть для множества U операций, связанных отношением предшествования, задан отрезок планирования [О, Т], где t G [О, Т] представляет собой независимую переменную времени. Пусть, s^ fi — моменты начала и окончания операции и^ G I/, г = 1, . . . , N. Тогда в общем случае расписание Sh определяется как множество
Sh^iJO, i = l,...,N, 8^е[0,Т]}.(6.1)
Выбор того или иного принципа построения расписания зависит не только от класса вычислительных систем, но и от конкретной по™
становки задачи и, в частности, от критерия оптимальности расписания. Например, при выборе комплектации вычислительной системы минимальной стоимости для заданных архитектуры, комплекса информационно и логически связанных задач, а также ограничении на допустимое время вычислительного процесса уместно говорить только о статическом планировании. Здесь отыскивается состав компонентов архитектуры, который не может быть изменен в ходе вычислительного процесса.
В задаче построения расписания минимальной длины на известной вычислительной системе для заданного комплекса информационно и логически связанных задач уже можно рассматривать и статические, и динамические планы решения задач. Задачи планирования и назначения связаны между собой, и часто их разделение носит вынужденный характер либо объясняется принципами построения расписания. Это разделение может иметь место при составлении динамических списочных расписаний, в то время как при построении оптимальных статических расписаний решения этих задач взаимозависимы.
Ресурсы. Чаще всего ресурсы состоят из набора процессоров и дополнительных ресурсов, причем в некоторых моделях важны различия между двумя этими видами ресурсов. Задаются общие уровни наличия каждого типа ресурса во времени:
п = ЦС j = te[o,T], (6.2)
где J — число типов ресурсов.
В большинстве моделей полагается, что r3t не зависит от времени, верхнюю границу ресурса j-ro типа (число процессоров, пропускную способность коммуникационной системы) будем обозначать т^.
Система операций описывается следующим образом. Задается множество U = {^1, . . . , un} операций, которые необходимо выполнить. На множестве операций определяется отношение X предшествования, представляемое, например, в виде ориентированного бесконтурного графа (U, Е) с множеством U вершин, соответствующих операциям, и множеством Е С U х U дуг. При этом и^ Л Uj О (и-^ и^ G Е. Транзитивные дуги исключаются. Необходимо заметить, что транзитивная редукция не является столь уж «безобидной» процедурой. Так, один из известных алгоритмов, разработанный Ахо, Гэри, Ульманом [47], имеет сложность О (Л^2,8). Отношение предшествования может быть и пустым (граф содержит изолированные вершины). При построении расписаний используются различные графовые модели параллельных программ: с информационными, логическими либо информационнологическими связями, а также графы, вершины, которых представляют операции и обработки, и обмена данными. В моделях с логическими связями (по управлению) в силу их природы имеет место априорное упорядочение операций. Информационные связи (по данным) позволяют выявить скрытый параллелизм программы. Предположение об
отсутствии логических операций и соответственно логических связей делается, как правило, при статическом планировании крупных информационно связанных задач, состав которых не изменяется в течение длительного периода, когда необходимо предусмотреть все действительные варианты совместного выполнения задач, т. е. учесть все значения логических переменных. Учет циклов и альтернатив в развитии вычислений приводит к использованию информационно-логических графов. Здесь важно принимать во внимание два аспекта. Во-первых, необходимо оставлять лишь такие логические связи, которые необходимы для альтернативного развития вычислительного процесса. Во- вторых, операции, выполняемые на альтернативных путях, не конкурируют между собой за один и тот же тип ресурса, что играет особую роль при назначении. При планировании процессов в распределенных системах часто нельзя пренебречь временем обмена между информационно связанными задачами и затратами на организацию обмена. В этом случае в граф вводятся дополнительные вершины, соответствующие операциям обмена данными, а транзитивно замыкающие дуги сами собой исчезают.
Для г-й операции задается длительность т^- > 0 ее исполнения на j-м типе ресурса, причем Tij = сю, если г-я операция не может использовать j-й тип ресурса. Каждая операция характеризуется потребностью Tij в ресурсах типа j, причем Tij ^ т^ для всех г и j. Удельная стоимость (или вес) Wi операции чаще всего полагается постоянной. Тогда стоимость завершения операции равна Wifi и представляет собой неубывающую от срока завершения операции функцию. По сути т^-, Tij и Wi образуют вектор параметров операции, а совокупность таких векторов параметрически описывает систему операций и соответствующую графовую модель. Эти параметры могут фиксироваться или полагаться случайными. Однако числовые характеристики случайных величин считаются известными либо значения случайных величин формируются до решения задачи упорядочения. Поэтому и такие задачи также относятся к задачам составления детерминированных расписаний: вся информация для принятия решения об упорядочении известна заранее.
Ограничения на составление расписаний отчасти могут быть заданы исходя из имеющихся ресурсов и свойств системы операций. Другая часть ограничений определяет классы алгоритмов планирования. Расписание (6.1) является допустимым, если выполняются следующие условия:
ог Е U) Л < Т, (6.3)
(Чи^ Uj Е U) ut X Uj ^ fi ^ Sj, (6.4)
(Vt € [0,Т], Ut = {ut & U\si ^t fi}) r3 (t) = ^ Тч
(6-5)(6-5)€ Ut
(6-5)
(6-5)
где Ut — множество операций, выполняемых в момент времени t; т3 (t) — потребность в ресурсе j-ro типа, а г^ — уровень наличия ресурса j-ro типа (6.2) в момент времени t.
Фиксация свойств архитектуры определяется неизменяемыми уровнями наличия каждого типа ресурса Гд, длительностью т^-, потребностью в ресурсах rgj и удельной стоимостью гщ каждой операции. Исходя из этого и формулируется задача составления допустимого в соответствии с (6.3)-(6.5) расписания (6.1).
Ограничения на классы алгоритмов зависят от особенностей выбора и назначения операций на ресурсы: назначение без прерываний или с прерываниями; назначение без задержки или с задержкой; произвольный выбор из числа готовых к исполнению или приоритетный выбор операций на основе списка.
Пример простейшего алгоритма с произвольным выбором операций, для которых готовы необходимые операнды, — это планирование по принципу «как можно скорее» (ASAP — as soon as possible) или «как можно позже» (ALAP — as late as possible). Положим, для реализации системы операций, отношение предшествования между которыми задано информационным графом на рис. 6.2, а, доступны два процессора.
ВремяОперацияПроцессор 1Процессор 211322344556ВремяОперацияПроцессор 1Процессор 211322344556ВремяОперацияПроцессор 1Процессор 2123216354ВремяОперацияПроцессор 1Процессор 2123216354
Время
Операция
Процессор 1
Процессор 2
1
1
3
2
2
3
4
4
5
5
6
Время
Операция
Процессор 1
Процессор 2
1
1
3
2
2
3
4
4
5
5
6
Время
Операция
Процессор 1
Процессор 2
1
2
3
2
1
6
3
5
4
Время
Операция
Процессор 1
Процессор 2
1
2
3
2
1
6
3
5
4
Рис. 6.2. Планирование операций: а — информационный граф; б — алгоритмASAP; в — списочное планирование
Каждая из операций может быть назначена на любой из них, а выполнение операции занимает одну условную единицу времени. Требуется построить кратчайшее расписание.
Возможный результат применения алгоритма ASAP показан на рис. 6.2, б. Ясен и недостаток алгоритмов этого типа — отсутствие приоритетов в планировании операций критического пути: операция 1 планируется раньше операции 2, принадлежащей критическому пути (2, 5, 6), в итоге получается неоптимальный план, требующий для выполнения 5 единиц времени. Этот же недостаток присущ и алгорит-
мам ALAP. Списочное планирование использует некие приоритеты для выбора очередной готовой к исполнению операции. В данном случае приоритет определяется принадлежностью операции к критическому пути. Операции упорядочиваются в списке в соответствии с присвоен™ ным приоритетом. Если соответствующий ресурс свободен, то прежде всего выполняется операция с наивысшим приоритетом. На рис. 6.2, в показан результат построения оптимального, кратчайшего списочного расписания.
Расписание без прерываний и задержек достаточно определить как множество моментов начала операций (длительность операции учитывается в условиях допустимости):
Sh' = {^, i = 1,..., У, Si e [0, T]} .(6.6)
Условия допустимости расписания (6.6) приобретают следующий вид:
(W; е У) Si + Ti С Т,(6.7)
Uj Е U) u,i Ч Uj Si Г Ti Sj,(6-8)
(V£ е [0, Г], Ut = {Ui eU\si Si + тД) T3 (Z) = ^ тч
(6.9) где Ti — длительность г-й операции в расписании Sh'.
Выражения (6.7)-(6.9) являются аналогами (6.3)-(6.5).
Возможность прерываний не улучшает расписания при идентичных процессорах, неотрицательных весах и пустом отношении предшествования. Задержка в назначении операций может приводить к улучшению расписаний в условиях неидентичности процессоров или различных длительностей операций. При произвольном выборе операций к назначению не должно нарушаться отношение предшествования (условия (6.4), (6.8) допустимости расписаний). Приоритетные (списочные) расписания просты в построении и обладают достаточно высокой эффективностью. Эффективность их тем выше, чем более глобальные характеристики используются для определения приоритета операции. Решающим фактором здесь оказывается принадлежность операции к критическому пути по числу операторов и/или длительности.
Существует ряд моделей, допускающих так называемые свободные параметры, конкретные значения которых не влияют на алгоритм и соответственно сложность составления расписания [47]. Анализ таких моделей интересен возможностью оценки свойств архитектуры посредством решения отдельных задач с различными значениями свободного, масштабируемого параметра. Далее, известны методы составления расписаний на основе преобразования отношения предшествования операций [6]. Соответствующие модели рассматриваются в этом параграфе.
Как правило, эффективность расписаний оценивается по одному критерию. Наиболее часто используются следующие критерии.
Длина расписания Sh определяется так:
(6.10)(6.10)T(Sh) = max {/J.
(6.10)
(6.10)
Это соответствует наиболее общему случаю построения расписания с прерываниями и назначениями с задержкой.
В случае отсутствия прерываний и задержек при составлении расписания Sb/ (6.6)
Т (SV) = max + тД .(6.11)
Среднее взвешенное время прохождения задач составляет
N
(6.12)
г = 1
ИЛИ
N
T№ = ^ILWi^i + TiY(6.13)
Иногда вместо (6.13), если операции равнодлительны, используется критерий
_N
(6.14)
г = 1
Максимальная или суммарная задержка времен завершения по сравнению с директивными сроками di, г = 1, . . . , N (запаздывания) составляет
N
КТ (Sh) = У^ max [0, fi — ф](6.15)
ИЛИN
КТ (Sh') = У^ max [0, Si Т Ti — di],(6.16)
г = 1
где di G (0, Г].
Если запаздывания недопустимы, то речь идет о крайних сроках Di, i е {1,..., ку.
fi^Di, Die(0,T].(6.17)
Используются и другие критерии, например, среднее число работ, находящихся на обслуживании или выполненных за время T(Sh). При составлении некоторых расписаний в постановку задачи вводится второй критерий — так называемый вторичный показатель эффективности. Например, основной критерий — длина расписания (6.10) или (6.11), вторичный — среднее взвешенное время прохождения системы операций (6.12) или (6.14). Помимо (6.15)-(6.17), могут задаваться ограничения на составные действия, например цепочки операций.
Необходимо заметить, что (6.12)-(6.14) можно интерпретировать как аддитивно-сепарабельные функции стоимости выполнения (пребывания) программы в системе. Смысловое содержание этих критериев таково: чем больше время завершения операции, тем больше стоимость пребывания в системе (завершения операции). Разумеется, это обосновано, когда свойства архитектуры зафиксированы, при этом учитываются и время ожидания исполнения, и стоимость использования операцией ресурса того или иного типа. В задачах выбора конфигурации масштабируемых ресурсов стоимость выполнения операций имеет другое смысловое содержание: какова цена, которую необходимо заплатить за выбор той или иной длительности операции на том или ином типе ресурса (причем длительность может и отличаться от априори заданной). Иногда важно знать, насколько изменение параметров модели (например, длительности операций) влияет на эффективность упорядочения, т. е. насколько устойчив оптимальный план к влиянию ошибок определения параметров или возмущающих факторов.
Основной вывод, который можно сделать из краткого анализа компонентов традиционных моделей составления расписаний (см. рис. 6.1), заключается в следующем. Ограничения в применимости соответствующих моделей к масштабируемым системам обуславливаются фиксацией архитектуры вычислительных ресурсов: заданием неизменяемых уровней наличия ресурсов и параметров операций (длительностей, потребностей в ресурсах, весов), а иногда — специальным видом отношения предшествования, например при конвейерной обработке.
Модели составления расписаний со свободными параметрами. Основные теоретические результаты решения задач со свободными параметрами получены в 70™е годы XX века, а сводка некоторых из них приведена в табл. 6.1 и табл. 6.2. Там же даются соответствующие библиографические ссылки.
Вид свободного параметра определяется ресурсами и системой операций. Такие ограничения, как тип назначения и выбор операции, влияющие на постановку задачи и класс алгоритмов построения расписаний, не относятся к свободными параметрам (см. табл. 6.1 и табл. 6.2). В качестве свободных рассматриваются следующие параметры:
число тр процессоров, которые считаются идентичными;
общий уровень т^ наличия дополнительного ресурса j-ro типа;
отношение X предшествования;
длительность т^ операции;
стоимость Шг операции.
Полиномиальные алгоритмы минимизации длины расписаний (см. табл. 6.1) известны в случаях, когда на фиксируемые параметры на™
Т а б л и ц а 6.1
Составление кратчайших расписаний со свободнымипараметрами
Свободные параметры
Параметры моделей составления расписаний
Библ, ссылка
Тр
1 0
Ti
Временная сложность
0
2
нет
равные
-
O^N2)
[85]
2
нет
1 или 2
-
NP
[47, 157]
0
2
да
равные
-
NP
[47, 157]
Тр
-
нет
равные
дерево
О(М
[62]
п
2
нет
-
0
NP
[47, 86]
1 0
2
-
равные
0
0(0)
[97]
1 0
2
-
равные
дерево
NP
[97]
1 0
з
-
равные
0
NP
[97]
Тр
-
нет
равные
-
NP
[157]
0, Ti
2
нет
-
-
O(N2)
[133]
Тр, Ti
-
нет
-
0
O(N\o& N)
[133]
0, Гр, Ti
-
нет
-
-
NP
[47]
Таблица 6.2
Составление расписаний со свободными параметрами для минимизации среднего взвешенного времени прохождения
Свободные параметры
Параметры моделей составления расписаний
Библ, ссылка
Тр
0
Ti
Wi
Временная сложность
Тр
-
множество цепочек
равные
равные
NP
[79]
Wi
1
дерево
равные
-
O(N2)
[Ю7]
Wi
2
0
равные
-
NP
[79]
rP,Ti
-
0
-
равные
0(0)
[39, 108]
0, Wi
1
-
равные
-
NP
[Ю7]
кладываются ограничения, сильно сужающие область применения со™ ответствующих моделей:
при произвольном отношении предшествования это — составление двухпроцессорных расписаний с равнодлительными операциями при отсутствии дополнительных ресурсов;
если свободный параметр — число процессоров, то накладываются требования их идентичности, равнодлительности операций, отсутствия дополнительных ресурсов и древовидной структуры системы заданий;
если длительности независимых операций допускаются произ™ вольными, но не равными, задача является Л^Р-полной уже при числе процессоров, равном 2;
при произвольных уровнях наличия ресурсов известен полино™ миальный алгоритм составления двухпроцессорного расписания лишь для независимых операций равной длительности;
™ в задачах с двумя свободными параметрами полиномиальные алгоритмы существуют, когда отсутствуют дополнительные ресурсы;
при трех свободных параметрах (отношение предшествования, число процессоров, длительность операций) не известны алгоритмы полиномиальной сложности, даже если нет дополнительных ресурсов.
Полиномиальные алгоритмы в задачах минимизации среднего взвешенного времени прохождения (см. табл. 6.2) известны лишь в следующих случаях:
если свободный параметр — вес операций, то возможно составление однопроцессорных расписаний для системы равнодлительных операций с древовидной структурой;
™ при произвольных числе процессоров и длительности операций последние должны быть независимы и иметь одинаковый вес.
Таким образом, попытки использования известных моделей упорядочения со свободными параметрами с целью выбора конфигурации ресурсов под конкретное программное приложение наталкиваются на принципиальные трудности.
Преобразование графовой модели программы. Методы точного составления расписаний путем преобразования отношения предшествования (исходной графовой модели программы) требуют полного перебора возможных упорядочений. Пусть исходное отношение предшествования представлено ориентированным бесконтурным графом ([/, Е\
Допустимым преобразованием отношения предшествования назовем переход к отношению, граф которого формируется следующим образом:
в граф ([/, Е) вводятся дуги, не приводящие к появлению контуров, так что ([/, Е) является подграфом графа ([/, Е'^ где ЕСЕ']
из графа (И, Е') устраняются транзитивно замыкающие дуги. Вновь получаемый граф ([/, ЕД, гДе Ен С Е\ представляет преобразованное исходное отношение предшествования в виде графа ([/, Е\
Это преобразование соответствует назначению операций без прерываний [10]. Если прерывания допустимы, то некоторым вершинам графа сопоставляются маршруты, содержащие различные вершины и различные дуги (им соответствуют цепочки операций). Осуществляется переход к вспомогательному графу ((/*, ЕД, U С U*, Е С Е*, который затем преобразуется рассмотренным выше способом.
Примеры допустимых преобразований графа зависимости процессов приведены на рис. 6.3.
Рис. 6.3. Допустимое преобразование отношения предшествования: а — исходный граф; б — допустимое преобразование без прерываний; в — допустимое преобразование с прерыванием процесса р^Рис. 6.3. Допустимое преобразование отношения предшествования: а — исходный граф; б — допустимое преобразование без прерываний; в — допустимое преобразование с прерыванием процесса р^вв
Рис. 6.3. Допустимое преобразование отношения предшествования: а — исходный граф; б — допустимое преобразование без прерываний; в — допустимое преобразование с прерыванием процесса р^
Рис. 6.3. Допустимое преобразование отношения предшествования: а — исходный граф; б — допустимое преобразование без прерываний; в — допустимое преобразование с прерыванием процесса р^
в
в
Типичные задачи, для решения которых может использоваться преобразование отношения предшествования: минимизация стоимости системы при ограничении на время вычислительного процесса и минимизация времени решения связанных задач при ограничениях на доступный ресурс. В графах, представляющих отношение предшествования, выделяются вершины, соответствующие полным множествам взаимно независимых операторов [6]. Далее вводятся дуги, соединяющие эти вершины, так, чтобы образовались пути, не содержащие общих вершин. Таким образом, в исходном графе появляются дополнительные дуги, а расписание строится по вновь полученному графу. Простейшая реализация подхода показана на рис. 6.3, а, б. Число образуемых путей в однородной системе определяется числом тр идентичных процессоров. В данном случае rp = 1 (см. рис. 6.3, б, в). В задаче пер™
вого типа отыскивается наименьшее число гр, в задаче второго типа строится кратчайшее расписание при заданном тр. Для неоднородных систем (с неидентичными процессорами) необходимо учитывать, какая задача может выполняться процессором соответствующего типа. Методы точного решения подобных задач требуют перебора целых значений по оси времени, причем изменение масштаба оси сокращает число исследуемых точек, но не изменяет числа возможных вариантов упорядочения [6].
Рассмотрим еще одну задачу и метод ее приближенного решения. Пусть необходимо максимизировать коэффициент загрузки основного процессора в архитектуре «процессор-сопроцессор» при заданном крайнем сроке Т* завершения вычислений [74]. Основная идея решения задачи заключается в следующем (см. рис. 6.3): процессы pi, . . . ,р6 (см. рис. 6.3, «) отображаются на цепочку (см. рис. 6.3, б, в) без учета временных ограничений. Затем с учетом крайнего срока вычисляется минимально допустимое значение коэффициента 8С ускорения, или масштабирования по времени. Коэффициент 8С есть отношение требуемой производительности системы к производительности, обеспечиваемой основным процессором. Если крайний срок при вычислении на одном, основном процессоре не нарушается, то коэффициент загрузки процессора равен v = 8С 1. В случае, если крайний срок нарушается, то v > 1, и необходимо ввести сопроцессор для выполнения некоторых процессов.
Принцип масштабирования по времени иллюстрируется рис. 6.4. Цепочка процессов, или работа (см. рис. 6.3, б), последовательно ис-
Работы
Сопроцессор
Основной процессорОсновной процессорРу И I М Д ИИ
Основной процессор
Основной процессор
PtPtHIMHIMОсновной процессорОсновной процессор
Pt
Pt
HIM
HIM
Основной процессор
Основной процессор
ООВремя
О
О
Рис. 6.4. Масштабируемое по времени планирование процессов
полняется на одном процессоре за время Т > Т*. Значение коэффициента ускорения 8С должно быть не меньше, чем Т/Т*. Для этого часть процесса р4 назначается на сопроцессор, производительность которого выше, чем у основного процессора.
С целью максимальной загрузки основного процессора подбирается некоторый эвристический, «адаптирующий» коэффициент а ^ 1. Значение масштабирующего коэффициента в результате равно 8* = аи. Очевидно, что применение такого подхода ограничено лишь
последовательной или циклической системой операций, причем дает приемлемый, но не оптимальный результат, поскольку открытым остается главный вопрос: какие процессы назначать на сопроцессор? Кроме того, неоднозначной и далеко не тривиальной является процедура преобразования графа программы (см. рис. 6.3).
Планирование на основе масштабируемой модели вычислений. В контексте планирования параллельных процессов под масштабированием с целью оптимизации выполнения программ будем понимать выбор конфигурации вычислительных ресурсов. Получаемые при этом динамические характеристики процессов могут отличаться от априори заданных оценок. Конфигурирование ресурсов и оптимизация характеристик процессов тесно взаимосвязаны и определяют главные отличия масштабирования от составления расписания при фиксированных свойствах вычислительных ресурсов. По сути основная идея масштабирования заключается в том, чтобы снять основные ограничения, присущие моделям составления расписаний. Для этого модели масштабирования должны обладать следующими свойствами.
Во-первых, модели должны допускать изменение длительностей и потребностей процессов в ресурсах. В результате масштабирования ресурсов для заданной программы в общем случае получаются не длительности процессов, а время, отведенное для их выполнения. Разумеется, в случае неоднородной среды это время не может быть меньше значения, определяемого самым производительным процессором.
Во-вторых, должны быть определены условия использования, помимо базовых, так называемых дополнительных, вводимых ресурсов (процессорных узлов и каналов связи). Требования к базовым ресурсам специфицируются в запросе пользователя, например в опции команды запуска qsub.
Метафора масштабирования может быть сформулирована следующим образом: при определенных ограничениях выбирается конфигурация ресурсов, необходимая для оптимальной или эффективной в заданном смысле (при наличии нескольких критериев) реализации конкретной прикладной программы. Особенно актуальным становится этот подход для повышения эффективности обработки в вычислительных средах, подсистемы которых являются масштабируемыми. Так, коммуникационная подсистема называется масштабируемой, если пропускная способность каналов связи не зависит от числа процессорных узлов, участвующих в вычислениях. В рамках традиционных моделей составления расписаний подобные явления не учитываются, да и просто недопустимы. Практические же примеры масштабируемых коммуникационных сред, используемых, например, в кластерах, известны: Memory Channel, Myrinet, SCI и др. При этом одной из важнейших является задача балансировки нагрузки [2] — эффективного распределения данных и процессов по процессорным узлам. При технической
реализации идеи масштабирования, конечно же, нужно учитывать ар™ хитектурные особенности различных вычислительных систем, разно™ образие исполняемых программных приложений и их функциональ™ ную зависимость. Так, известно, что степень оптимальности загрузки процессоров в кластерах может быть выше, чем в мультикомпьютерах или МРР-системах, именно благодаря согласованности набора выполняемых программ.
Априорные оценки процессов обработкиАприорные оценки процессов обработки— длительность обменапо каналу типа к— длительность обменапо каналу типа кРаботы2 _ ОбменРаботы2 _ ОбменПродемонстрируем основную идею масштабирования. Пусть задан информационный граф программы (рис. 6.5, а), вершины р1,р2,рз которого соответствуют обработке, а вершины Г12,Г1з,Г2з — обмену данными. Положим, уровень базовых ресурсов ограничен одним про™
Априорные оценки процессов обработки
Априорные оценки процессов обработки
— длительность обмена
по каналу типа к
— длительность обмена
по каналу типа к
Работы
2 _ Обмен
Работы
2 _ Обмен
ШвШ (тип ресурса) ОбработкаПзД <^/
г23Д Время
01234567
в
Рис. 6.5. Параметризованный информационный граф программы (а, б) имасштаб процессов (в)
цессором из двух возможных типов и одним каналом связи, т. е. в текущий момент времени может выполняться одна операция передачи данных. Априорные значения длительности т^ и стоимости C^j вы™ полнения процесса р^, на процессоре типа j приведены на рис. 6.5, б. Стоимость может определяться как функция от объема и времени вычислений. Значения времени обмена данными по каналу &-го типа полагаются постоянными. Кроме того, заданы ограничение на время завершения программы в виде крайнего срока Т* = 7 (в некоторых условных единицах времени) и функция стоимости обработки
E^expfy -1),
где § = 1, 2, a т^ — длительность процесса р^, которая может отличаться от т^. Эта функция представляет собой сумму «экспоненциальных штрафов» за использование вводимых процессоров, более производительных, чем базовые процессоры типа j. Необходимо минимизировать стоимость обработки при крайнем сроке завершения.
Очевидно, что априорные параметры процессов обработки pi, р2, рз с учетом длительности процессов обмена Г12,Г2з не позволяют выполнить заданное ограничение в виде крайнего срока завершения: наилучшая комбинация базовых ресурсов для процессов pi, р2, рз образована соответственно процессорами типов 2, 2, 1, поскольку при этом минимаксное значение длительности критического пути составляет
Т1°2 + т^к + т^ + т^ + т^ = 2 + 0,4 + 4 + 0,6 + 1 = 8.
Результат масштабирования по времени, или минимизации функции стоимости, минимальное значение которой при Г* = 7 равно 13,6, показан на рис. 6.5, в. Для выполнения pi, Р2 вводятся процессоры, замещающие процессоры типов 2, 1 (обозначения 2°, 1°), а процесс Рз выполняется на базовом процессоре типа 1. При этом вводимые процессоры 2°, 1° являются более производительными, чем соответствующие базовые, а время, отводимое для выполнения процесса Рз, больше априори заданного (см. рис. 6.5, б). Таким образом, для каждого из процессов pi, р2, рз выбирается свой «масштаб» по оси времени так, чтобы для работы (pi, р2, Рз) не нарушался крайний срок Т*: процессы Pi и р2 «сжимаются», а процесс рз «растягивается» во времени. Такой подход существенно отличается от решения, показанного на рис. 6.4, где все процессы цепочки (pi, . . . ,ро) «сжимаются» с одинаковым коэффициентом ускорения S*. Разумеется, это лишь общая идея масштабирования, требующая тщательной проработки и обоснования, чему и посвящена гл. 6.
К настоящему времени уже известны программные средства поддержки масштабирования ресурсов с целью оптимизации выполнения параллельных программ. Здесь можно упомянуть одну из наиболее оригинальных разработок — систему программирования трС [3] (Институт системного программирования РАН). Система трС является расширением языка С в рамках стандарта ANSI и ориентирован на программирование неоднородных вычислительных сетей, хотя программы разрабатываются в соответствии с парадигмой SPMD. Дело в том, что трС предоставляет программисту богатую информацию, необходимую для написания эффективных программ, выполняемых в неоднородных системах: число параллельных процессов, объем вычислений и передаваемых данных и т. д. Отображение так называемых виртуальных процессоров системы трС на процессорные узлы основывается на данных о реальной производительности процессоров и коммуникационной среды. Более того, трС позволяет учесть конфигурацию неоднородной сети.
В языке трС можно специфицировать относительные объемы вычислений, выполняемые виртуальными процессорами, для сбалансированной загрузки реальных процессоров. При предварительной оценке реальной производительности компонентов сети используется тестовая программа, запускаемая в ходе установки системы трС в конкретной вычислительной сети. Однако программист имеет возможность варьировать оценки производительности процессоров и каналов обмена, настраивать их на свойства фактических вычислений, т. е. по сути масштабировать и вычислительные ресурсы, и процессы прикладной программы. Для этого в языке трС предусмотрен оператор recon, позволяющий изменять оценки производительности в ходе выполнения программы. При этом учитывается фактическая загрузка и соответственно реальная производительность системы к моменту выполнения программы пользователя. Еще одной привлекательной возможностью системы трС является учет затрат на обмен данными между виртуальными процессорами. Таким образом, система программирования трС использует и информацию о свойствах параллельного алгоритма, и данные о конфигурации и производительности вычислительной системы.
Итак, масштабируемые ресурсы и программное приложение можно рассматривать как своего рода единую среду, позволяющую оптимизировать динамические характеристики вычислительных процессов для создания эффективных распределенных программ.
Основные компоненты моделей масштабирования. Рассмотрим, как при масштабировании должны видоизмениться основные компоненты моделей упорядочения, характерные для составления традиционных расписаний (см. рис. 6.1).
Принципы масштабирования. До начала выполнения программы необходимо построить оптимальный или эффективный в заданном смысле план процессов путем соответствующего конфигурирования ресурсов. При этом результирующие длительности процессов могут отличаться от априори заданных или полученных в результате статического и динамического анализа программы (см. гл. 4).
Ресурсы должны состоять из базовых и дополнительных, или вводимых. Состав базовых ресурсов, процессорных узлов (далее по тексту — процессоров) и каналов обмена зависит от целевой архитектуры среды, совокупности исполняемых программ, степени распараллеливания и т. п. Под каналом обмена далее будем иметь в виду любую виртуальную линию связи между парой различных процессоров, обменивающихся данными. Требования к базовым ресурсам специфицируются, как правило, в запросе пользователя, оформляемом в виде скрипта команды ввода работы qsub в пакетном режиме, либо утилитой globus-job-submit инструментария Globus Toolkit. Дополнительный ресурс вводится в следующих случаях. Во-первых, если для эффективной организации вычислений необходим процессор более произво-
дительный, чем базовый. Во-вторых, если суммарный уровень потребности в соответствующем ресурсе превышает некоторый изначально задействованный планировщиком. (Эта ситуация может возникнуть из-за столкновения интересов различных пользователей, претендующих на один и тот же тип ресурсов. В масштабируемых системах эта коллизия может быть разрешена за счет вводимого ресурса. При этом нужно, конечно, учитывать фактические ограничения по числу доступных процессоров и пропускной способности коммуникационной подсистемы. Так, для коммуникационной среды Myrinet масштабируемость ограничивается числом узлов, равным 1024.)
Система действий. Элементарный, неделимый процесс, который может быть назначен на один экземпляр ресурса, будем называть one™ рацией. Операции делятся на два типа, соответствующие обработке и обмену. На основе операций U = {«i, . . . , uw} строятся задания и работы. Задание — непрерываемая последовательность из не менее чем двух информационно или логически связанных операций, работ,а — последовательность операций и заданий. Отношение предшествования X задается с помощью ориентированного бесконтурного графа, вершины которого соответствуют операциям обработки и обмена, а дуги — информационным связям и условным ветвлениям. Вершины, отражающие затраты на обмен, в таком графе необходимы в силу распределенности процессов и данных. Поэтому нет транзитивных информационных дуг. Будем считать, что затраты на обмен данными исключаются, если соответствующие операции обработки, участвующие в обмене, назначаются на один и тот же процессор.
Каждая из операций обработки множества Р С U характеризуется вектором априори заданных длительности т^ и стоимости С^ выполнения на процессоре J-ro типа, г = 1, . . . , |Р|, j Е {1, . . . , J}.
Под стоимостью С^ понимается весовой коэффициент, присваиваемый операции из следующих соображений. Априорные значения т^^ С^ — результат статического и динамического анализа программ. В частности, С^ может задаваться как функция от объема и времени вычислений и имеет смысловое содержание, принципиально отличное от того, которое вкладывается в это понятие при составлении расписаний.
Чем меньше время реализации заданного объема вычислений при масштабировании (например, на более производительном процессоре), тем больше стоимость выполнения соответствующего фрагмента программы. Таким образом, операции «взвешиваются» друг относительно друга по следующему правилу: чем больше вычислений выполняет та или иная операция по сравнению с другой за то же время на том же процессоре, тем больше ее стоимость.
Необходимо заметить, что такого рода зависимости давно используются в математических моделях при выборе состава и количества исполнителей для реализации заданного набора действий. Достаточно упомянуть модель Фалкерсона [39] для решения задачи оптимального
распределения задержек между некритическими операциями по критерию минимума линейной функции стоимости. Здесь время выполнения операции может быть сокращено путем выделения N дополнительных «одинаково оплачиваемых» исполнителей. При увеличении длительности операции ее стоимость уменьшается пропорционально коэффициенту, равному N.
Длительность и стоимость могут изменяться в результате масштабирования и принимать значения Tij, Cij соответственно. Зависимость между длительностью и стоимостью — необходимое условие одновременного планирования и назначения. Пример частной функции стоимости: Cij = C^j exp ir^j/Tij — 1) — «экспоненциальный штраф» на рост т^(т^, т. е. уменьшение Tij по сравнению с априорным т^. Здесь независимой переменной является длительность Tij. Смысл функции стоимости, заданной как «экспоненциальный штраф» на вводимый ресурс, заключается в том, что для выполнения программы пользователям могут быть доступны и более производительные процессоры, чем запрашиваемые, но «цена» за их ввод увеличивается в зависимости от роста производительности. С другой стороны, фрагмент программы может выполняться и на менее производительном процессоре по сравнению с тем, что заказывает пользователь в ресурсном запросе, если при этом соблюдаются заданные ограничения, например срок завершения всей программы. «Цена» такой обработки будет ниже.
Когда Tij < т^ и/или Cij > C^j либо требуемое суммарное число процессоров j-ro типа для параллельно исполняемых операций больше имеющегося, в архитектуру вводится дополнительный процессор, по своим функциональным возможностям соответствующий процессору типа j, что обозначается как j°. Это может быть универсальный или специализированный процессор, не включенный в число базовых ресурсов. Конкретный вид функции стоимости зависит от многих факторов и особенностей решаемой задачи масштабирования. Например, насколько жестким должен быть штраф за попытку введения более производительного процессора или дополнительного процессора той же производительности, определяется целевой архитектурой вычислительной системы, классом алгоритмов, долями последовательных и параллельных вычислений и т. д. Таким образом, стоимость обработки при масштабировании имеет смысл, отличный от стоимости пребывания задачи в системе (6.12)-(6.14).
Подобные рассуждения справедливы и в том случае, когда масштабирование осуществляется по стоимости Ci j, являющейся независимой переменной. Примеры частных функций от переменной Cij, когда длительность и стоимость могут быть связаны через объем вычислений (чем больше стоимость реализации заданного объема вычислений, тем меньше время их выполнения):
_ I 1 111 .
Тгз ~ Tij I I 7 ъ ip
\ ° О /
( _0r-vO < Р. . < прО
f ™0рО / Р. . / про
Tip\^гр
™С Ъ
При масштабировании по стоимости необходимо учитывать прежде всего объем вычислений, связанных с той или иной операцией, и потребность ее в вычислительном ресурсе соответствующего типа. Так, г-я операция может быть настолько сложной, что ее нельзя выполнить на одном процессоре J-ro типа. Для ее реализации требуется уже некоторый ресурс типа j, представляющий собой совокупность процессоров, или вычислительную систему. При этом нужно принимать во внимание известные ограничения, часто носящие характер эмпирических законов. Это, в частности, законы Амдала, Густавсона-Барсиса [9]. Суть их заключается в том, что не всякое увеличение числа процессоров (стоимости) ведет к росту производительности (к сокращению длительности операций). Так, по Амдалу, ускорение системы зависит не только от числа процессоров и их загрузки, но и от свойств алгоритма (от доли последовательных операций). Поэтому чем крупнее операции, тем сильнее при оценке времени их выполнения (т. е. при масштабировании по стоимости) сказываются такие глобальные факторы, как архитектура системы и структура алгоритма.
Итак, выбор той или иной функциональной зависимости между длительностью и стоимостью зависит от целевой архитектуры вычислительной системы, класса программных приложений и постановки задачи масштабирования, в частности от вида критериев эффективности. Важно и то, что относительные оценки длительности и стоимости выполнения вводятся для всех процессов программы. Известны и соответствующие языковые средства для манипулирования такого рода оценками. В частности, система программирования трС [3] позволяет программисту специфицировать относительные объемы вычислений для виртуальных процессоров сети.
В общем случае априорные длительность и соответственно стоимость являются случайными величинами (см. гл. 4). Тогда, строго говоря, в задаче масштабирования необходимо оперировать числовыми характеристиками длительности и стоимости (например, математическим ожиданием и дисперсией), а также вероятностными аналогами критериев масштабирования — числовыми характеристиками функций случайных величин. При вычислении дисперсии суммарного времени выполнения двух операций, например, пришлось бы каким-то образом учитывать корреляционный момент. Вряд ли подобные усложнения задачи масштабирования уместны. Как правило, усложнения моделей
за счет введения вероятностных параметров не всегда оправдываются получаемым эффектом. Так, замена детерминированных параметров вершин в вероятностной (по направлениям переходов) модели программ на вероятностные параметры вершин переводит ее из класса марковских моделей в класс полумарковских [4]. При этом известно, что с любой заданной точностью к марковской модели можно свести по™ лумарковскую модель программ [10]. Общий методологический прием, используемый при этом, заключается в том, что каждой немарковской задаче можно поставить в соответствие эквивалентную марковскую задачу с расширенным множеством состояний. Это позволяет рассматривать методы решения только марковских задач. При необходимости можно различать минимальные, максимальные, средние значения, нижнюю и верхнюю доверительные границы априорных длительности, стоимости и т. д.
Каждая из операций иг^ Е R С U, соответствующая обмену данными между операциями обработки vs, щ, s,t€{l,...,|P|}, также характеризуется в общем случае изменяемыми в результате масштабирования временем Tstk и стоимостью cstk обмена по каналу в ком™ муникационной среде ^-го типа, но при этом Tstk ^ Tstk> cstk ^ c®tk^ где Tgtk^ cstk — априори заданные значения, определяемые пропускной способностью коммуникационной подсистемы, к Е {1, . . . , J}.
Напомним, канал обмена — виртуальная линия связи для обмена данными между процессорами. Если в результате масштабирования операции us , щ могут выполняться на одном и том же процессоре, то затраты на обмен отсутствуют: Tstk = 0, cstk = 0, к = 0. Операция обмена может использовать канал типа к из доступных базовых ресурсов, если не превышена потребность параллельно выполняемых операций обмена в суммарной пропускной способности ранее зарезервированных планировщиком каналов этого типа. Иначе вводится дополнительный канал обмена того же типа. Если нужно выделить этот факт, будем использовать обозначение к°.
Суммарная пропускная способность каналов, естественно, не должна превышать порога, определяемого характеристиками соответствую™ щей коммуникационной среды. В масштабируемых коммуникационных средах этот порог определяется максимальным числом процессорных узлов, которые могут участвовать в вычислениях (например, для Myrinet, как уже говорилось, этот параметр равен 1024). Поэтому можно, конечно, трактовать понятие «дополнительный канал» и в сугубо техническом смысле: выбор для организации вычислений системы, коммуникационная среда которой обладает большей пропускной способностью. Однако при масштабировании имеет место другой немаловажный аспект — необходимость контроля за трафиком обмена данными при разрешении коллизий между конкурирующими параллельными процессами. В § 6.3 будет показано, что при разрешении коллизий между операциями обмена данными важно, чтобы степень загруженности коммуникационной подсистемы не возрастала.
Ограничения^ фиксирующие свойства модели упорядочения при составлении расписаний (см. рис. 6.1), при масштабировании снимаются: система действий программы характеризуется изменяемой потребностью процессов в ресурсах. При этом необходимо учитывать, что в результате масштабирования получается время, отведенное для выполнения процесса на ресурсе соответствующего типа, которое и обеспечивает оптимальное (или эффективное) выполнение всей программы. Поэтому масштабирование допускает и прерывания, и назначения процессов с задержкой, если это поддерживается соответствующим алгоритмом планирования. Выбор очередного процесса к назначению зависит от метода масштабирования. Например, возможно последовательное выявление и масштабирование критических работ, которым соответствуют пути наибольшей длительности или стоимости на графе, задающем отношение предшествования (см. рис. 6.5).
Теперь формализуем понятие масштаба операций, его допустимости и постановку задачи. Пусть [0,Т] — отрезок масштабирования, s^ — момент начала, переменная а^ = j V j° соответствует назначению г-й операции на базовый ресурс типа j (процессор или канал обмена) либо на дополнительный ресурс типа j°.
Масштаб операций — это множество троек вида
S = Цз^тц,»^ г = N, j =8^е[0,Т]}. (6.18)
Верхняя граница Т отрезка масштабирования зависит от вида критериев масштабирования. Так, если минимизируется суммарная стоимость операций при ограничении Т* на время выполнения операций критического пути, то Т = Т*. Если минимизируется время выполнения операций критического пути при заданном ограничении на суммарную стоимость операций, то Т полагается равным длительности операций критического пути до начала масштабирования.
Обозначим через Ut множество операций, выполняемых в момент времени t Е [О, Т]; rij — выделяемое г-й операции количество ресурса j (например, Tij = 1, если г-я операция назначается на процессор j, Tij = = 0 в противном случае); Ьт^ — общее количество базового ресурса типа j (число процессоров, число каналов обмена или их суммарная пропускная способность). Введем независимую переменную ж^ — длительность Ti операции либо стоимость Ci использования ею ресурса. В первом случае осуществляется масштабирование по времени, во втором — по стоимости.
Масштаб (6.18) операций является допустимым при выполнении следующих условий:
(Ущ Е U) Si + Tij ^Т,(6.19)
(Vug, ur Е и, q, г Е {1, . . . , Ж}) uq X иг =>
Sq + Tqj Sr, Sq, Sr E [0, T],(6.20)
CM е Р) ($i = Tj, Tij < г?) V Щ = Ci, Cij > CiP => =^«г=3°,(6.21)
CM 6 R) Tij > тф(6.22)
(Vf € [О, T], Ut = {w, e U\ Si < t < Si + Tij^ У Tij > br® =>
^(X/UiEUt) (3j E {1,.. ■ , J}) ai=jVj°. (6.23)
Условие (6.19) очевидно и означает, что любая из операций завершается на отрезке масштабирования [0, Т]. При этом должно соблюдаться отношение предшествования операций (6.20). По условию (6.21) в зависимости от вида независимой переменной ж^ любая операция обработки, длительность (стоимость) которой меньше (больше) априори заданной для базового ресурса j, назначается на дополнительный, вводимый компонент j°, функциональные возможности которого, т. е. способность выполнить соответствующую операцию, не уступают базовому ресурсу. Время, отводимое для операции обмена, не может быть меньше минимального, априорного значения, определяемого пропускной способностью коммуникационной подсистемы (6.22). При возникновении конкуренции между операциями множества Ut за базовый ресурс j (состояние коллизии) необходимо ввести дополнительный компонент j° для какой-либо из конкурирующих операций (6.23). Таким образом, условий (6.19)-(6.23) вполне достаточно для описания допустимости масштаба (6.18).
Критерии эффективности масштабирования должны допускать возможность их декомпозиции с точностью до отдельной операции (частной функции), чтобы, если требуется, осуществить планирование на уровне процессов программы. В общем случае масштабирование представляет собой процедуру многокритериальной оптимизации, поскольку речь идет о выборе той или иной конфигурации ресурсов для реализации прикладных программ при наличии ограничений, определяемых наступлением внешних событий (взаимодействием процессов и различных программ, арбитражем при доступе к разделяемым ресурсам и т. д.). Поэтому обоснование критериев эффективности масштабирования и приведение их к соответствующему виду — это вопросы, требующие специального рассмотрения. Цель данной главы — наглядно, без побочных эффектов продемонстрировать метод перехода от системы операций к реализующей ее архитектуре вычислительных ресурсов. Поэтому пока ограничимся однокритериальным масштабированием. В гл. 7 рассматривается масштабирование по векторному критерию.
Каждый из вариантов архитектуры, или масштабирования ресурсов, представим набором ^ = (ж1, . . . , ждг, ai,..., «nY Пусть Uig,
g = 1, . . . , G^ суть операции одной работы. Критерий w (£) назовем аддитивно-сепарабельным, если он имеет вид
NGG
W Ю = 52 Ц’» Gi, «Л, ^ W»s 6ig'“O = 52 Wie 6ig) = W ,
» = 1g = lg = l
(6.24)
^(ж^ , . . . , XiG , O^ , . . . , ОЦС ) ,l^Zi^.-.^Z^^ /V,
где ич (•), uiig (•) — частные функции для z-й, ig-й операций.
Примеры аддитивно-сепарабельных критериев: длительность завершения программы Т (S) = max {s^ + Tij (<2^)} при масштабировании по стоимости — аналог критериев (6.10), (6.11); функция стоимости N
С (S) = ^ ^ij (Ti) ПРИ масштабировании по времени.
1=1
Постановка задачи однокритериального масштабирования. Положим, заданы связывающие (активные) ограничения для Н операций и L заданий системы действий программы:
Х^ — хн^О, h = l,...,H; Хр^х^О, l = l,...,L. (6.25)
I
Ограничение в виде неравенства называется связывающим или активным, если в точке ^ экстремума критерия w (£) неравенство обращается в равенство. В (6.25) Х^Х^ — крайние сроки или значения предельной стоимости завершения отдельных операций, заданий, работ и всей системы действий.
Формальная постановка однокритериальной задачи масштабирования заключается в том, чтобы найти экстремум критерия ui ^ (6.24) эффективности масштаба S (6.18) при условиях допустимости (6.19)(6.23) и ограничениях (6.25).
В§6.2и§6.3 описываются метод масштабирования по заданному критерию и процедуры разрешения коллизий параллельных процессов, вызванных конкуренцией за использование одного и того же ресурса.
§6.2. Общая схема масштабирования
Метод критических работ. Выражение (6.24) означает, что при масштабировании операций одной работы значение критерия однозначно определяется независимой переменной Xig, а назначение — функция Xig, поскольку последовательно выполняемые операции и^, . . . , UiG не могут конкурировать между собой за использование ресурсов. (Это и объясняет использование термина «независимая переменная».) Однако масштабирование другой работы может потребовать коррекции ранее полученных результатов, если возникает коллизия, что выражено в условии (6.23).
Таким образом, масштабирование состоит в итеративном применении двухэтапной процедуры:
планирование и назначение по переменной Xi последовательно выделяемых критических работ — путей наибольшей длительности или стоимости, содержащих неназначенные операции;
разрешение возникающих коллизий путем изменения назначения оц соответствующей операции.
Важно, чтобы при разрешении коллизий промежуточный план операций сохранялся, а значение критерия не ухудшалось. Кроме того, при разрешении коллизии не должно соответственно уменьшаться (увеличиваться) суммарное время использования процессоров (каналов обмена), задействованных до наступления коллизии. Каналы обмена соотносятся, как правило, с унифицированными ресурсами, и с ростом Tstk увеличивается стоимость cstk операции обмена. Здесь, в отличие от обработки, имеет место аналогия со стоимостью пребывания задачи в системе (6.12)-(6.14).
Масштабирование очередной критической работы, для каждой операции которой априорные значения длительности или стоимости равны соответственно min I rf • > или min I ^ ^ {1? • • • 1 3
з V ) j I gJ J
E {1, . . . , J}, осуществляется по критерию w (^Д в (6.24). В основу масштабирования работы положена универсальная схема совместного планирования и назначения задания, применимая и к отдельным операциям. Используемая при ее описании терминология соответствует принятой в теории динамического программирования. Читателю, желающему ознакомиться с методами динамического программирования, мы рекомендуем обратиться к книге [42], хотя для понимания дальнейшего материала достаточно сведений, приводимых по ходу изложения.
Итак, схема планирования и назначения задания включает в себя следующие процедуры.
Для каждой операции г задания («i X П2 X . . . X um) определяется запас по переменной жд Zx = Х\ Zi = Z^i — ж^1, г > 1, где X* — крайний срок или предельная стоимость завершения программы.
Задается диапазон Х$ изменения ж^ в зависимости от Zp.
i — 1, . . . , th 1, Xm — [жш, ^уп] ?
где ж^ , жг , жт — минимально возможные (исходные) значения переменных. Шаг изменения ж^ в диапазоне Х^ не меньше жЕ, определяемого из ограничений на рост стоимости г-й операции, если ж^ = т^, либо из ограничений на увеличение длительности, если ж^ = Ci.
Функция uii (жД в критерии w (жх, . . . , жт) = ^ ич (жД опреде
лена на отрезках Х^, верхние границы которых зависят от значения запаса, и может быть представлена как функция двух переменных
Wi (ж^, ЯД. При этом значение гщ (ж^, Z^ выбирается как субоптималь™ ное для разных типов доступных ресурсов:
Wi (xt, Z^ = extr{wy (ж», X)} , Xi € X» (Z^ . з
На г-м шаге состояние задания представляется запасом Z^, а управление — переменной ж^. Для каждой операции, кроме первой Mi, определяется условно оптимальное управление, при котором гсДж^ЯД достигает условного оптимума Wq^Z^ при фиксированном Z^. Соответствующее функциональное уравнение имеет вид
id'q (Zi) = extrid'q (Zi) = extrг = 2, . . . ,т, (6.26)г = 2, . . . ,т, (6.26)
id'q (Zi) = extr
id'q (Zi) = extr
г = 2, . . . ,т, (6.26)
г = 2, . . . ,т, (6.26)
Zi — X — ^ ^ ж , ZT — ZT i — ж r .
i=l
Обозначим изг = гщ (ж^, ЯД + Wq, где u)q = ^ wo (Zry
Рекуррентное соотношение оптимального управления (по времени или стоимости) есть
ж| = arg extr w1, Ж1 'ж| = arg extr w1, Ж1 'ж* (Z^ = arg extr w\'Xi'ж* (Z^ = arg extr w\'Xi'(6.27)(6.27)
ж| = arg extr w1, Ж1 '
ж| = arg extr w1, Ж1 '
ж* (Z^ = arg extr w\
'Xi'
ж* (Z^ = arg extr w\
'Xi'
(6.27)
(6.27)
Zi = ZM - жД, (Z^) , г > 1, ZT = X*.
Для вектора (жД . . . , жД) определяются моменты начала s^ операций оптимальной длительности (тД . . . , тД), а также назначения оц = = arg extr {w^- (ж* (ЯД , Z^ в соответствии с (6.21):
з''
если Ж г = Tg, ТО Q^ = j ПРИ Tij = т* 5
если x-i = Ci, то сц = j при Cij = С* Д С^;
оц = j° в остальных случаях.
Масштабирование системы работ 0,1, . . . , М представляет собой применение рассмотренной схемы к совокупности из Q заданий и операций, где Q Д М + 1. Для каждой последовательности q, q = = 1, . . . , Q с mq ^ 1 операциями отыскивается оптимальное управление по независимым переменным ж* = (ж*17 . . . , ж*Шд). Последовательности жД жД . . . , x,q позволяют получить оптимальное управление для всей системы работ из X операций (жД жД . . . , жД). Воспользовавшись обобщением принципа оптимальности [42], можно доказать, что оптимальное управление для системы работ определяется вектором (жД . . . , Жд), где ж*, q = 1, . . . , Q, отрезок одной и только одной последовательности жД жД / = 1, . . . , М. Ниже приводится доказательство соответствующего утверждения.
Теорема 6.1. Пусть w (£) — аддитивно-сенарабелън'ый критерий эффективности масштабирования. Тогда
extr W (^) = W (ж|, . . . , Жд) .
Доказательство. Обозначим через X множество допустимых значений переменных управления Xi ^i = 1, . . . , N. Допустимые значения определяются соответствующими диапазонами изменения ж^. Рассмотрим конечные последовательности из т — q + 1 элементов вида
Pq = (жд), Pqr = (Xq, • • • ЛЭ, Q < Г, 1<Q, Г < Q,
где хд^хГ — векторы управления для соответствующих заданий.
Множество таких последовательностей обозначим через Р (X). Последовательность pqr является полной, если q = 1, г = Q. Выделим в Р (X) подмножество Р (X) полных последовательностей. В последовательности рдр = (жд, . . . , жд/, ждщ1, . . . , жг) начальный отрезок Ъ (Pqr) = (Жд, • • • , ЖдО И КОНСЧНЫЙ ОТреЗОК е (pqr) = (жд/ + 1, . . . , Хр) назовем сопряженными. Пользуясь свойством аддитивной сепарабельности критерия w, рассмотрим его как монотонно-рекурсивный функционал, определенный на множестве Р (X):
^(рд) < W(p*), р* = (ж*),
^Pqiri , Pqiri €е^рЧгТЭ = C^Pq^r^'
< ’Ш(ЦРЧ2Г2)) =^ ш(РЧ1гЭ < ™(РЧ2гХ
где 1 < <7,<71,Г1,92,г2 < Q.
Последовательность pj или p^Q € Р(Х) называется оптимальной, если
w(p|) = extrw(^) или w(p^q) = extr w(^).
Обозначим через P(pir) С P(X) множество полных допустимых последовательностей, начинающихся с управления жх, для которых рхг является начальным отрезком. Пусть Р(рхг) — множество всех конечных отрезков последовательностей множества, причем эти конечные отрезки являются сопряженными с piT.
Рассмотрим две допустимые, возможно, и одноэлементные последовательности р|г,Рхг € Р(Х) такие, что имеет место
ЧР1г) < Ш(Р1гУ
Это означает, что последовательность содержит меньше отрезков оптимального управления для заданий 1,...,г, чем последовательность р|г, что следует из свойства монотонной рекурсивности функционала w. При этом очевидно, что Р (р|г) = Р (pir), поскольку совокупность всех конечных допустимых отрезков, сопряженных с р^г и р^г,
определяется диапазонами изменения переменных векторов управления жг+х, . . . , xq независимо от их оптимальности. Тогда в соответствии с обобщенным принципом оптимальности последовательности множества R (р|г) не могут быть оптимальными. Это в свою очередь означает, что экстремум w (piq) может быть достигнут тогда и только тогда, когда piq = (ж|, ж^ • • • ? ^qY Что и требовалось доказать.
Основные особенности общей схемы масштабирования заключаются в следующем.
Свойство аддитивной сепарабельности критерия (6.24) допускает декомпозицию задачи планирования и назначения вплоть до масштабирования отдельных операций и заданий.
Универсальная схема планирования и назначения задания применима и к отдельным операциям. Поэтому формально однокритериальная схема масштабирования системы работ представляет собой последовательное применение универсальной схемы. Каждое задание входит в одну и только одну критическую работу.
Оптимальное управление (длительности или стоимости операций) для системы работ в соответствии с теоремой 6.1 определяется последовательностью векторов оптимального управления для совокупности заданий.
Поскольку изменение назначения любой операции не нарушает оптимального плана, то оптимальное управление для системы работ однозначно определяет экстремум критерия эффективности масштабирования.
2.2. Модельный пример: минимизация стоимости завершения обработки. Рассмотрим масштабирование системы работ, в
Рис. 6.6. Информационный граф системы работ (а) и априорные параметры (б) операций обработкиРис. 6.6. Информационный граф системы работ (а) и априорные параметры (б) операций обработкиV!v2v3v4v5v6351213243341326643462215V!v2v3v4v5v6351213243341326643462215бб
Рис. 6.6. Информационный граф системы работ (а) и априорные параметры (б) операций обработки
Рис. 6.6. Информационный граф системы работ (а) и априорные параметры (б) операций обработки
V!
v2
v3
v4
v5
v6
3
5
1
2
1
3
2
4
3
3
4
1
3
2
6
6
4
3
4
6
2
2
1
5
V!
v2
v3
v4
v5
v6
3
5
1
2
1
3
2
4
3
3
4
1
3
2
6
6
4
3
4
6
2
2
1
5
б
б
которой отношение предшествования задано информационным гра
фом (рис. 6.6, а).
Априорные оценки значений длительности т^ и стоимости С^ вы™ полнения операций и^ обработки на двух типах процессоров приведены на рис. 6.6, б. Число процессоров каждого типа равно 1, а число каналов обмена типа к равно 2, т. е. параллельно может выполняться не более двух операций обмена. Предположим, что значения длительности one™ раций обмена постоянны и равны:
т12к = 0,4, тулк = 2,0, т14к = 0,2,
тт^к = 0,6, т45к = 0,8, т^5к = 1,0.
Цель — минимизация стоимости операций обработки при крайнем сроке Т* = 7 завершения программы:
6\
min V Ci, Ci = C^ exp I — 1 L max + тЛ T\ j = 1, 2.
J \ Ti )1^г^6''
Пусть минимально возможное значение тГ независимой перемен™ ной Ti (длительности операции обработки) определяется исходя из ограничений на максимальное относительное увеличение стоимости:
X = min (тР. / (in max+ 1) }.
На практике т7 может определяться самым производительным процессором системы. Положим, т^ =0,26, т^ = 0,51, т^ = 0,13, т4 = = 0,26, т^ =0,13 и т^ =0,13. Эти значения принимаются за шаг из™ менения длительности т^ в соответствующем диапазоне Тф
Масштабирование по времени выполняется по общей схеме в еле™ дующей последовательности.
Критической по длительности является работа (щ, vri2, ^2, ^23, из), ранний срок ее начала Е (1) = 0, поздний срок окончания L (3) = = Т* [39]. С учетом того, что длительности операций обмена т^к = 0,4 и т^к =0,6 не изменяются, формулируем соответствующую задачу:
33
min ^ ci ПРИ ограничении Т* - (т^ + т^ - У^ 0. i=lг=1
Планирование и назначение операций vi,V2,V3 проведем в соот™ ветствии с пятью этапами рассмотренной выше универсальной схемы.
Запасы по времени для г-й операции:
^i = 6, ^2 = 23 — Ti, Z$ = ^2 — т^.
При этом
^2 Ч + Ч = °М >з Ч = одз.
Диапазоны изменения длительности Ti задаются в зависимости от значения запаса Zp.
Ti = [тГ, Zx - Щ + т3-)] = [0,26, 5,36],
Т2 = К, Z2 - т3~] = [0,51, Z2 - 0,13],T3 = K,Z3] = [0,13,Z3].
Значения функции стоимости г-й операции вычисляются в соответствующем диапазоне Т\ как значения функции от двух переменных Ti и Z^ причем для заданного запаса времени и каждого значения Ti Е Е ТД определяется субоптимальное значение стоимости г-й операции
Ci (Ti, Zi) = min {Cij ^Ti, ZJ} .'j ''
Для каждой из функций Ci (Ti, Zi) при любых значениях запаса Zi используются значения этой функции, вычисленные в максимальном из диапазонов тахТД Так строится одна зависимость Ci(ti,Zi) в диапазоне Т^ Для построения зависимостей С^ (т2, Z^) и С^ (тз, Z^) требуются дополнительные вычисления в точках ^- и ^- , где * Т2 । I т3 I
т^,^ — верхние границы диапазонов Т2, Т3, а [•] — ближайшее не меньшее целое число.
В соответствии с функциональным уравнением (6.26) строятся зависимостиm
cf* =+ Y, cbkZrV
где Cq (Zr) — условно минимальное значение функции Ст (тг, ZT) при фиксированном значении запаса по времени Zr, г = 2, . . . , т.
На рис. 6.7 приведены зависимости СF^ суммарной стоимости операций V2 и V3 от длительности Т2 для разных значений запаса Z^.
По найденным значениям условных минимумов С F2 строятся зависимости для условно минимальной стоимости CFq, условно оптимального управления т^ (Z2) , ^з (Z2) (рис. 6.8) и зависимость для суммарной стоимости трех операций обработки СF1 = Ci (ti, Zi) + СFq (рис. 6.9).
Значение минимума С F1 достигается при длительности первой операции т^ = 1,82. По рекуррентному соотношению (6.27) вычисляются остальные компоненты вектора оптимального управления.
Оптимальное управление по времени — набор длительностей т^ = = 1,82; т^ = 3,06; т^ = 1,12 (см. рис. 6.8 и рис. 6.9), обеспечивающих "з
минимальную суммарную стоимость min ^ ^г = 1^,6 при заданном г = 1
ограничении.
Моменты начала операций:
s1 = £(l) = 0; S2 = т^ + т^к = 2,22; з3 = s2 + т^ + т»лк = 5,88.
Рис. 6.7. Зависимости для масштабирования операций и^^ из
Рис. 6.8. Условно оптимальное масштабирование операций и^ из
Рис. 6.10. Диаграмма масштабирования — результат оптимизации выполнения процессов
Субоптимальное значение стоимости щ, т. е. меньшее из двух возможных по з (см. пп. 3, 5 универсальной схемы), для т^ = 1,82 достигается при з = 2. Однако процессор типа 2 не может быть использован, поскольку т^ < rf2 = 2 (см. рис. 6.6, б). Поэтому операция щ реализуется дополнительным, более производительным процессором (см. (6.21)), соответствующим по функциональным возможностям процессору типа 2, т. е. «1 = 2° (рис. 6.10; здесь Vi/ai — операция/назначение). Субоптимальная стоимость операции и^ длительности т^ =3,06 обес-
печивается при j = 1. Но поскольку т^ < т^ = 5, то принимается на™ значение «2 = 1° (см- Рис- 6.10). В отличие от операций щ, v2 операция из может быть назначена на базовый процессор типа 1, обеспечиваю™ щий субоптимальное значение стоимости при т^ = 1,12: т^ > т^ = 1, следовательно, «3 = 1.
При масштабировании второй работы (vri4, V4, иг45, V5) миними™ зируется стоимость (С4 + С5) операций обработки ^4, V5 при ограничении
L (5) - - Е (14) - (74 + 75) > 0,
где £ (5) = Т* — поздний срок окончания v3, а Е (14) = — ранний срок начала операции обмена vr^. Минимальное значение min (64 + 65) = 5,1 обеспечивается оптимальными длительностями Т4 = 2,60 и Т5 = 1,58. Моменты начала операций ^4, и^: S4 = Е (14) + + т^4к = 2,02; S5 = S4 + Т4 + т45к = 5,42. Значения стоимости ^4, V5 субоптимальны при j = 2 и j = 1 соответственно. Назначения: «4 = 2°, поскольку т4 < Т42 = 3; «5 = 1, поскольку т^ > т^ = = 1. Следовательно, операция V4 назначается на дополнительный процессор, соответствующий процессору типа 2, а операция и^ — на процессор типа 1. Однако при этом возникает коллизия, обусловленная конкуренцией операций v3 и V5 за один экземпляр процессора типа 1 (см. рис. 6.10). Поскольку т^ > т3 , переназначим операцию Из на дополнительный компонент («3 = 1°). При таком разрешении коллизии не уменьшается время использования процессора типа 1.
Цель масштабирования третьей работы (vg, ur^) — минимизиро™ вать стоимость Св операции п6 при ограничении
£(65)-7^-£(6)-76>0,
где £(65) — поздний срок окончания операции обмена пгб5, равный Е (5) = S5; Е (6) = 0 — ранний срок начала vg. Результаты минимизации стоимости: minCe = 2,2 при j = 1; Tg = 4,42; sg = 0. Назначение «6 = 1, так как т^ > т^ = 3 (см. рис. 6.6, б).
После масштабирования третьей работы возникает коллизия из™ за конкуренции операций обмена игев, ^^45 и уг23 за Два доступных канала обмена типа к (см. рис. 6.10). Поскольку при разрешении колли™ зии не должно увеличиваться суммарное время использования каналов обмена, выделим дополнительный канал операции пгб3:
т65к > max {T45fc? т23/с} = т45к^
и поэтому «65 = к°. Тогда операции W45 и ПГ23 используют два доступных канала: «45 = к, «23 = к. Как видно из диаграммы на рис. 6.10, операции обработки vg и V5 последовательно выполняются на одном и том же процессоре типа 1. Значит, нет необходимости в затратах на обмен пгбв-
Четвертая работа Цтдз), представляющая собой единственную операцию обмена, не может изменить стоимость операций обработки.
Однако важно правильно выбрать момент ее начала S13, чтобы не вызвать конкуренцию за каналы обмена (см. рис. 6.10). Полагая ранний срок Е (13) начала операции ит^ равным позднему сроку окончания L (12) обмена vri2, получаем S13 =+ т^к = 2,22.
Итак, минимальная стоимость операций обработки при заданном крайнем сроке Т* = 7 их завершения
з
min ^2 Ci + min (64 + С5) + min C6 = 20,9
г=1
обеспечивается структурным решением, показанным на рис. 6.11. Заданная система операций реализуется первым типом базового процес-
v3v4 v5 ,v6
Рис. 6.11. Структура вычислительных ресурсов — результат масштабиро-вания
сора, на который назначаются операции обработки V5, vg, четырьмя дополнительными компонентами, соответствующими обоим типам базовых процессоров (на них назначаются операции обработки щ, . . . , ^4), и двумя доступными каналами обмена. Процессоры, реализующие операции vi,V2? ^4, более производительны, чем базовые процессоры, а процессор, реализующий операцию из, менее производителен, чем базовый процессор типа 1. Такое решение при оптимальных длительностях т^, . . . , Tq обеспечивает минимальную стоимость завершения обработки, не достигаемую никакой комбинацией априорных характеристик операций.
Разобранный пример — иллюстрация основной идеи масштабирования: при заданных ограничениях (в данном случае это крайний срок завершения программы и уровни базовых ресурсов) выбирается оптимальный план вычислений, в котором интервалы времени, отведенные для процессов, не совпадают с априорными оценками. Последние же с свою очередь, если бы именно они были приняты за фактические длительности процессов, не позволили бы программе-планировщику определить такой порядок выполнения процессов, чтобы уложиться в определенный пользователем срок завершения всей программы.
Теперь рассмотрим, каким образом можно эффективно устранить коллизии параллельных процессов, которые конкурируют за один и тот же ресурс в масштабируемых системах.
§6.3. Разрешение коллизий параллельных процессов
Постановка задачи. В § 6.2 мы рассмотрели метод критических работ для совместного планирования и назначения, или масштабирования, процессов с целью выбора и оптимизации архитектурных решений вычислительных ресурсов. Напомним: понятие процесса охватывает операции (атомарные действия), задания (цепочки двух и более операций) и работы (последовательности операций и заданий). Реализация этого метода предполагает масштабируемость ресурсов, состоящих из процессорных узлов и коммуникационной среды, или каналов обмена данными, и самой модели обработки данных. Это означает возможность использования дополнительных ресурсов, помимо базового набора процессоров и каналов обмена, а также допустимое при определенных условиях изменение априорных параметров процессов, полученных для базовых ресурсов.
Общая схема масштабирования включает итеративное применение двух этапов. На первом из них осуществляется планирование и назначение критических работ. Планирование и назначение очередной критической работы может вызвать коллизию параллельных процессов, конкурирующих за использование одного и того же ресурса. Для этого на втором этапе при разрешении коллизии вводится дополнительный экземпляр ресурса. Требование разрешения коллизий выражается одним из условий допустимости масштаба S, сформулированных в § 6.1, а именно (6.23).
На рис. 6.12 приведен пример коллизии операций обработки. Граф на рис. 6.12, а иллюстрирует взаимосвязи между операциями обработки трех работ (уь у2, Уз), (У4, У5, Уб) и Щ, ж2, ж3), конкурирующих за два доступных экземпляра процессора j-ro типа. Длительности выполнения операций графически представлены на рис. 6.12, б в некоторых единицах времени: например, длительность операции ух равна 2 единицам, длительность операции у^ — 1 единице и т. д. Операциям обмена данными на рис. 6.12, а соответствуют дуги. Дуги, обозначенные крестиками, представляют операции обмена, не требующие дополнительных затрат времени и ресурсов в случае, если соответствующие операции обработки, например, ух и у^ у 4 и Ж2, назначаются на один и тот же процессор. Подробнее об этом будет сказано ниже в этом же параграфе. Значения длительности всех необходимых операций обмена приняты одинаковыми, равными 0,5 единицы времени. На рис. 6.12, б временные интервалы, которые могут быть использованы для обмена данными, представлены пробелами, например, между операциями ух
ЯЯШЖЖШШЖЖШ11^^ — обработка^^ — обработка— обмен— обмен— обменс отсутствием дополнительныхзатрат— обменс отсутствием дополнительныхзатратbr^lbr^l*е*е^^ (4,0)^^ (4,0)2233южюжBiiliiil^Biiliiil^(3,5)(3,5)ISSSSSSSSSSSSSSSSIISSSSSSSSSSSSSSSSI1111111111111111(3,5)Т(3,5)ТОО1122334455
Я
Я
ШЖЖШ
ШЖЖШ
1
1
^^ — обработка
^^ — обработка
— обмен
— обмен
— обмен
с отсутствием дополнительных
затрат
— обмен
с отсутствием дополнительных
затрат
br^l
br^l
*е
*е
^^ (4,0)
^^ (4,0)
2
2
3
3
юж
юж
Biiliiil^
Biiliiil^
(3,5)
(3,5)
ISSSSSSSSSSSSSSSSI
ISSSSSSSSSSSSSSSSI
11111111
11111111
(3,5)
Т
(3,5)
Т
О
О
1
1
2
2
3
3
4
4
5
5
(Т) @ — назначение на базовые процессоры
(5) — назначение на дополнительный процессор
б
Рис. 6.12. Информационный граф (а) и коллизия процессов обработки (б)
и y2l У1 и ^2, ^1 и ж2 и т. п. В скобках на рис. 6.12, б указана суммарная длительность операций обработки: 4 единицы времени для работы (Uh У2^ Уз)^ 3,5 единицы для работ (у4, у^Уб) и (xi, ж2, х^. Показанная на рис. 6.12, б коллизия вызвана планированием и назначением третьей работы (ж1,ж2,ж3), первые две работы (уь у2, уз) и (у4. у5, у6) могут использовать два доступных базовых процессора. Для разрешения кол™ лизии необходимо ввести дополнительный процессор того же типа.
Как уже подчеркивалось в § 6.2, после разрешения коллизий должен сохраняться промежуточный план операций обработки данных, хотя при этом и могут быть исключены затраты на обмен данными из-за того, что обработка выполняется на одном и том же процессоре. Это является необходимым условием сходимости алгоритмов масштабирования.
Разрешение коллизии заключается в таком изменении назначения (1^ одной из попарно конкурирующих операций, при котором по крайней мере не уменьшается суммарное время использования процессоров и не увеличивается суммарная загрузка каналов обмена данными, задействованных до возникновения коллизии. Это требование
может быть формализовано на основе введения такого критерия, как коэффициент URj использования ресурсов j-ro типа. При этом он может вводиться не только как вторичный показатель эффективности при разрешении коллизий, но и как основной критерий в формальной постановке задачи масштабирования (см. § 6.1). Для URj должно вы™ подняться свойство аддитивной сепарабельности (6.24).
Обозначим через URu (еД коэффициент использования г-й операцией в /-м действии программы экземпляра ej ресурса типа j. Для процессоров он имеет следующий вид:
/ (^^) При Xi — Tij У/ T^j
и Pit (е,) =и Pit (е,) =либо х i = Ci. Cij С С^,
и Pit (е,) =
и Pit (е,) =
О при Xi = Ti. Tij < т^ либо Xi = Ci. Cij > C^.
(6.28) где T* — крайний срок завершения программы, U — суммарная длительность операций обмена в /-м действии.
Для каналов обмена U Ru (ej) выглядит так:
1/(Д; (еД = туД (Т* - 7Д ,(6.29)
где Т) — суммарная длительность операций обработки в /-м действии; Tij = 0, если операции обработки, которым соответствует г-я операция обмена, назначаются на один и тот же процессор; Tij ДО — в противном случае.
Коэффициент использования экземпляра ej в /-м действии:
иНез^^иНц^,(6.30)
г=1
где nz — число операций Z-го действия; U Ru (еД для операций обработки определяется по (6.28), а для операций обмена — по (6.29).
Через £1 обозначим число действий программы, выполняемых независимо от условных ветвлений. Пусть URe Z1, где /1 = 1,..., £i, вычисляется по (6.30). Пусть £2 — число а-компонентных наборов альтернативных действий с коэффициентами использования j-го типа ресурсов на альтернативных путях, равными UR® ь, где /2 = 1, . . . , £2, и определяемыми по (6.30). Коэффициент использования экземпляра ej в программе равен
URe^^UR^u + y^extr^UR^y(6.31)
£—1£—1
Для процессоров в (6.31) берется минимум коэффициента UP® а для каналов обмена — максимум коэффициента UС® и по всем альтернативным действиям программы.
Наконец, коэффициент использования j-ro типа ресурсов:
^•^фЕ^’ (6-32)
где Ът^ — общий уровень ресурса типа j (например, число процессоров или каналов обмена типа j), задействованный до возникновения кол™ лизии, при этом URe вычисляется по (6.31).
Формальная постановка задачи оптимального разрешения колли™ зий операций обработки данных заключается в том, чтобы обеспечить максимум коэффициента UPj использования процессоров соответствующего типа согласно (6.32) и выполнить условие (6.23). В случае приближенного разрешения коллизий значение коэффициента U Pj не должно уменьшаться.
Коэффициенты UCj использования каналов обмена вводятся с уче™ том следующих особенностей операций обмена. Во-первых, в результа™ те масштабирования не уменьшаются значения их длительности и стоимости использования каналов (см. § 6.1). Во-вторых, операции обмена данными исключаются, если последовательно выполняемые операции обработки данных назначаются на один и тот же процессор. Следовательно, при разрешении коллизий по обмену нужно учесть историю их возникновения по всей системе работ и, если потребуется, выполнить повторное переназначение на каналы обмена.
Формальная постановка задачи оптимального (приближенного) разрешения коллизий операций обмена данными состоит в том, чтобы обеспечить минимум (неувеличение) коэффициента UCj использования каналов обмена соответствующего типа согласно (6.32) с соблюдением условия (6.23).
Условно оптимальное и приближенное разрешение коллизий. Коллизии процессов (см. рис. 6.12, б) могут быть представлены двудольным графом (X, У, А), множество А ребер которого отражает попарную конкуренцию за ресурс (рис. 6.13, а). При этом X — множество операций работы, планирование и назначение которой вызывает коллизии, а У — множество операций ранее назначенных работ.
Коллизии в общем случае носят «многослойный» характер, т. е. охватывают процессы более чем двух работ (см. рис. 6.12,6' и рис. 6.13, а). Это требует согласованного изменения соответствующих назначений на ресурсы. Так, взаимозависимыми являются назначения операций Ж2, Жз и У2 i Уз i Уб i У в • Если пытаться разрешить коллизии, последовательно рассматривая попарно конкурирующие операции, то придется перебрать ^^з вариантов назначения, где s = |Х| + + |У|, brj Ьт^. Для рассматриваемого примера их число равно 218. Хотя при этом и возможно оптимальное разрешение коллизий, такой подход может оказаться неприемлемым с позиций алгоритмической реализации.
Рис. 6.13. Двудольные графы «многослойной» коллизии (а), условно оптимального (б) и приближенного (в) ее разрешения
Выделим из множества X |J Y минимальное вершинное покрытие Z так, чтобы все ребра множества А были инцидентны вершинам из Z. На рис. 6.13, a Z = {ж1, Ж2, жз}. Вершины подмножеств X' С Z и Y' С Z будем называть х- и ^/-вершинами покрытия. Обозначим через Аж и Ау множества инцидентных им ребер, а через Гж и Гу множества образов х- и ^/-вершины соответственно. Пусть имеются такие х- вершины х\ хП G Х\ что Гж/ Q Гж„ ф 0, а число их равно пж. Пусть Пу — число ^/-вершин у\ ум Е Y' таких, что Гу/ Q Гун ф 0. Обозначим через пЖу число общих ребер, инцидентных вершинам из Х\ Yf.
Так, в рассматриваемом примере (см. рис. 6.13, а) пх = 2 (ГЖ2 П Гжз = {1/5}), тгу = 0, пЖу = 0. Если пж ^2, Tiy 2, то число допустимых вариантов оптимального разрешения коллизий на основе выделения минимального вершинного покрытия не больше чем 2пЬтз где п = \Z\ пж - Tiy пЖу + 2.
Действительно, если Гж/ р| Гж// ^ 0 (Г^ р| Гум ^ 0), то назначения операций, которым сопоставлены вершины х* и хн (у' и у"^ должны быть одинаковыми. Следовательно, число |0| переназначаемых операций уменьшается на величину (пж — 1) + (riy — 1). Положим,
П ^ 0. Тогда назначения операций, представленных соответствующими ж™, ^/-вершинами, должны быть различными. Это приводит к дополнительному уменьшению |Z| на число пЖу.
На рис. 6.13, а из двух переназначаемых операций, которым соответствуют вершины Ж2, Ж3, можно выбрать любую, поскольку они должны иметь одинаковые назначения, отличные от назначения операции, которая представлена вершиной у^. Поскольку пу = 0, то п = 2, и число вариантов переназначения операций сокращается до 24. Однако необходимо заметить, что при таком разрешении коллизий сначала нужно найти минимальное вершинное покрытие.
При использовании метода Хопкрофта-Карпа [38] эта задача может быть решена за время порядка О ((г + s) V^)? гДе т = Ml (см- § 5.4). Далее нужно найти компоненты связности в графе (X, У, Л), чтобы
выявить х- и р-вершины, пересечения образов которых непусты, а также наличие общих ребер из Аж, Ау. Если применить метод поиска в глубину [36], то эта процедура потребует дополнительного времени порядка О (г + s) (см. § 5.4).
Таким образом, и этот подход может оказаться неприемлемым при большом числе N операций и возникновении «многослойных» колли™ зий. Разумеется, в вырожденном случае, когда попарные конкуренции независимы (т. е. в соответствующем двудольном графе нет двух ребер, инцидентных одной вершине), для разрешения коллизий достаточно последовательного просмотра s/2 ребер и такого переназначения, ко™ торое по крайней мере не ухудшает значения коэффициента использо™ вания ресурса соответствующего типа. Тем не менее и при этом необхо™ димо нахождение компонент связности в двудольном графе коллизий.
Рассмотрим, каким образом можно понизить сложность алгоритмов разрешения «многослойных» коллизий, учитывая свойство аддитив™ ной сепарабельности критериев типа (6.32). Если требуется максимизи™ ровать (минимизировать) значение коэффициента использования про™ цессоров (каналов обмена данными), то необходимо выбрать цепочку операций ранее назначенных работ с минимальной (максимальной) суммарной длительностью. Тогда двудольный граф (X, У, А) «мно™ гослойной» коллизии может быть заменен взвешенным двудольным графом (X, У, X) «двуслойной» коллизии, где У С У, Е С А. Вес каждой вершины — длительность операции, причем сумма весов вершин в У является наименьшей или наибольшей в зависимости от того, разрешаются коллизии процессов обработки или обмена данными.
На рис. 6.13, б приведен пример графа (X, У, X), в скобках ря™ дом с вершинами указаны длительности соответствующих операций обработки (см. рис. 6.12,6'), X = {ж1,ж2,^з}, V = {£/2, Х/4, Х/б}- Сопоставив рис. 6.12, б и рис. 6.13, а, б^ нетрудно заметить, что последовательность (уд^ у2, у в) является системой различных представителей (трансверсалью) семейства (У1,У2,Уз) подмножеств множества У = = {У1,У2,Уз, У4, Уб, Уб}, а Ч = {yi, у4}, V, = {У2, Уб}, Vs = {уз,Уб, Уб}- Число подмножеств семейства совпадает с числом операций работы 3, вступающих в коллизии с операциями ранее назначенных работ 1, 2 (см. рис. 6.12, б).
Таким образом, возможен следующий конструктивный подход к условно оптимальному разрешению «многослойной» коллизии путем сведения ее к «двуслойной». Пусть (У15 . . . , Vp) — семейство необя™ зательно непересекающихся подмножеств множества У, представлен™ ное с помощью взвешенного двудольного графа (X, У, А) «многослойной» коллизии, причем р = |Х|, а вес каждой вершины — длительность соответствующей операции. Необходимо найти трансверсаль для (У1, . . . , Vp) с наименьшим (наибольшим) весом и построить двудольный граф «двуслойной» коллизии (X, У, X), где |У| = р, а ребра из Е образуют паросочетание мощности р (см. рис. 6.13, б). Далее, последовательно просматривая смежные пары вершин (ребра) этого графа,
требуется из пары выделить вершину с меньшим (большим) весом. На рис. 6.13, б это вершины у^ х^ и у^. Им соответствуют операции, назначаемые на вновь вводимый экземпляр ресурса. Такое разрешение коллизий является условно оптимальным, поскольку сведение «многослойной» коллизии к «двуслойной» не позволяет учесть всех 2бЬгз вариантов назначения. Сложность условно оптимального разрешения «многослойных» коллизий определяется трудоемкостью поиска трансверсали с наименьшим (наибольшим) весом.
На основании теоремы Холла [38] можно утверждать, что трансверсаль семейства (Ц, . . . , Мр) существует (см. § 5.4). Действительно, пусть Г (X") — множество вершин, смежных с вершинами из подмножества X" С X. Ясно, что ^МХ” С X) |Х"| |Г (JC^)!- В противном случае вообще не возникало бы коллизий. Рассмотрим пару М = (У, /), где / — семейство частичных трансверсалей семейства (1Д, . . . , VPY В соответствии с теоремой Эдмондса-Фалкерсона [38] пара М = (У, /) является матроидом (см. § 5.4). Следовательно, может быть применен жадный алгоритм для матроида трансверсалей. Если для поиска чередующейся цепи (см. § 5.4) использовать метод поиска в глубину, то общая сложность жадного алгоритма составит О (|У| г), где т = |Л| = р
На рис. 6.13, б приведен пример графа «двуслойной» коллизии, где (j/4? У2^ Уб) является трансверсалью, соответствующей операциям с наименьшей суммарной длительностью. Конкуренция в таком графе разрешается при последовательном просмотре ребер, а преимущество всегда отдается вершине с большим весом. Для рассматриваемого примера это вершины Ж1, у^ х^. Следовательно, соответствующие операции назначаются на базовые процессоры, а для операций у 4^ Ж2, ув вводится дополнительный процессор. На рис. 6.12, б показана диаграмма работ после условно оптимального разрешения коллизий. Коэффициент использования процессоров 7-го типа U Pj = 0,9.
В случае приблиснсенного разрешения коллизий по операциям обработки (обмена) не должно уменьшаться (увеличиваться) суммарное время использования процессоров (каналов обмена), введенных до возникновения коллизий. Тогда граф «многослойной» коллизии (см. рис. 6.13, а) может быть заменен двудольным графом «двуслойной» коллизии, в которой участвуют работа с наименьшей (наибольшей) суммарной длительностью операций обработки (обмена) и работа, масштабирование которой вызывает коллизии. На рис. 6.12, б это работы 2 и 3. Попарные независимые конкуренции операций представлены различными компонентами связности (рис. 6.13, в). Конкуренция между операциями обработки (обмена) разрешается в пользу вершин множеств X или У в зависимости от того, где больше (меньше) суммарная длительность операций. В рассматриваемом примере дополнительный ресурс вводится для операций, представленных вершинами у 4^ х^ х^.
Коэффициент использования двух базовых процессоров в этом случае составляет UPj = 0,8 (см. рис. 6.12, б и рис. 6.13, в). Такое приближенное разрешение коллизий возможно за время нахождения компонент связности в графе «многослойных» коллизий, т. е. О (s + г), если использовать метод поиска в глубину.
Оценим временную сложность процедур разрешения коллизий как функцию от числа N масштабируемых операций. Приближенное разрешение коллизий имеет порядок 7V2, поскольку s ^ N т < А2. При условно оптимальном разрешении это оценка порядка А3 в силу того, что |У | < N. При этом порядок сложности не увеличивается, если учитывать все экземпляры доступных ресурсов для каждой операции.
Погрешность планирования. Часть операций обмена данными может быть исключена, если информационно связанные операции обработки последовательно выполняются на одном и том же процессоре. Так, в рассматриваемом примере (см. рис. 6.12) нет необходимости в затратах на обмен данными в заданиях (гд^ у^уз)^ (у 2, жз) и ^У4^ Ж2, ув^ поскольку входящие в них операции обработки реализуются соответственно на первом, втором (базовых) и третьем (дополнительном) процессорах. Напомним, что значения длительности всех необходимых операций обмена одинаковы и равны 0,5 единицы времени (см. рис. 6.12, б). Ни в одной из трех работ, которым соответствуют последовательности операций обработки (у^ у2, уз\ [У4^ У5^ Уб) и (ж1,Ж2,Жз), затраты на обмен данными исключены быть не могут, поскольку каждая из двух последовательно выполняемых операций обработки данных назначается на разные экземпляры процессоров. Тем не менее из рис. 6.12, б видно, что время, отведенное для выполнения операции Ж2, может быть увеличено на 0,5 единиц, что позволяет повысить коэффициент использования третьего процессора и в целом процессоров данного типа. Однако изменение промежуточного или окончательного плана некоторых процессов обработки после исключения затрат на обмен может привести к необходимости заново проводить масштабирование других ранее спланированных операций. Поэтому для обеспечения сходимости алгоритмов масштабирования приходится смириться с погрешностью планирования информационно связанных операций обработки, для которых исключаются затраты на обмен. Погрешность обусловлена «недоиспользованием» процессами обработки данных возможного времени их выполнения.
Пусть t^ и ti — значения суммарного времени обработки в /-й работе, где / = !,...,£, соответственно при оптимальном и «приближенном» планировании с погрешностью. Обозначим через А/ время для обмена данными в /-й работе, а через г* и т^ — оптимальное и «приближенное» значения длительности г/-й операции обработки. При этом
где т1 число операций обработки. Однако это не означает, что (Vi[ G {1, . . . , шД) т* ^ т^ поскольку выбирается оптимальный план для всей совокупности процессов обработки в /™й работе, а не для каждой из операций в отдельности (см. § 6.2).
Относительная погрешность масштабирования /™й работы состав™ ляет*~
§t =- юо%.(б.зз)
Отклонение полученного в результате масштабирования плана от оптимального для всей системы из L работ будем оценивать усреднен™ ной относительной погрешностью вида
(6-34)
1=1
где 8[ определяется в соответствии с (6.33).
Положим, что ограничения в задаче масштабирования, заданные в виде неравенств, содержащих, в частности, крайние сроки завершения процессов и всей программы, являются связывающими (см. § 6.1). Напомним: это означает, что эти неравенства обращаются в равенства при таких значениях независимых переменных масштабирования, что соответствующий критерий достигает экстремума.
Пусть для суммарного времени обмена выполняется неравенство
LL
(6.35) 1=11=1
где Т* — крайний срок завершения программы.
Очевидно, что правая часть (6.35) — неотрицательная величина. Тогда имеет место следующая оценка сверху усредненной относитель™ ной погрешности (6.34):
max {АД
-100%.(6.36)
Действительно,
L
=тах{Д<} .
z=i
L ~
При этом из (6.35) следует, что ^2 t-i ^ Т*. Это и означает, что спра- 1=1
ведливо (6.36).
В рассматриваемом примере (см. рис. 6.12)
Т* = 5; Д=Д=4,0; t* = t2 = 3,5; t* = 4,0; ?3 = 3,5.
Соответствующие значения относительной погрешности масштабирования трех работ равны:
51=0; 52=0; 53 = ^| • 100% = 14,3 %.
Усредненная относительная погрешность по системе из трех работ составляет 5 = 4,8 %. Далее, шах {△/} = 1,5, что соответствует третьей работе (см. рис. 6.12, б). Выполняется неравенство (6.35), поскольку 33
22 А; = 3,5, а 22 ^F = ИД Следовательно, справедливо и (6.36): z=iz=i
5 < — • 100% = 30%.
5
Таким образом, когда для процессов обмена данными выполняется условие (6.35), верхняя граница усредненной относительной погрешности планирования после разрешения коллизий определяется максимумом отношения длительности обмена по отдельным работам к крайнему сроку завершения программы (6.36).
Комментарий и краткий обзор к главе 6
Модели составления расписаний. К концу 70-х началу 80-х годов XX века сложилось фактически целостное представление о границах применимости детерминированных моделей теории расписаний к планированию параллельных вычислений, прежде всего с позиций реалистичности и сложности алгоритмов поиска решения. В этом направлении выполнено большое количество работ [6, 10, 11, 24, 37, 42, 45, 47]. В 80-е и 90™е годы обобщение полученных теоретических результатов, обогащение соответствующих моделей рядом новых допущений стимулировалось такими бурно развивающимися предметными областями, как: разработка массово-параллельных, встроенных и распределенных систем; высокоуровневый синтез СБИС; совместное проектирование программного обеспечения и аппаратных средств.
Подробное изложение вопросов построения расписаний параллельных процессов дается в книге [10]. Там же рассматриваются преимущества расписаний с прерываниями и приводится большое число алгоритмов составления кратчайших списочных расписаний. В книге [6] описываются точные методы решения задач следующих типов. Это минимизация стоимости вычислительной системы (или времени вычислений) при ограничении на время вычислений (или доступный ресурс). Основная идея состоит в направленном введении дополнительных, ранее не существовавших связей между операторами, т.е. в допустимом преобразовании отношения предшествования.
Задача максимизации загрузки основного процессора при наличии сопроцессора решается в работе [74] и базируется на теоретическом
результате, полученном в [130] для однопроцессорного расписания и циклической системы заданий с крайними сроками. В [130] исследован вопрос об использовании процессора при произвольных правилах упорядочения для периодически обслуживаемых заявок с одинаковыми периодами поступления. Доказано, что существуют системы из п заданий, полностью использующие процессор. Система полностью использует процессор, если увеличение любых значений длительности заданий приводит к тому, что система перестает быть допустимой. Коэффициент загрузки процессора не превышает тъ^^Му Масштабирование по времени для архитектуры «процессор-сопроцессор», предложенное в [74] и рассматриваемое в § 6.1 (см. рис. 6.4), дает приемлемый приближенный результат. При этом возникает вопрос: какие процессы нужно выполнять на сопроцессоре для построения оптимального плана (максимизации загрузки основного процессора)? Используемая эвристика для подбора коэффициента масштабирования должна учитывать зависимости и взаимодействия процессов, временные ограничения, затраты на переключение и буферизацию и т.п. А все эти факторы в свою очередь неизвестны до получения плана.
Упомянутые выше работы и публикации [39,79, 107, 108, 133, 157] посвящены составлению детерминированных расписаний в рамках традиционных моделей. Обзор публикаций по вопросам планирования распределенных вычислений, в том числе и в среде Grid, приводится в § 1.4.
Масштабируемые модели планирования вычислений. Основной материал гл. 6 является оригинальным. Общая схема масштабирования и метод критических работ были предложены в [50, 51]. Масштабирование представляет собой по сути формализованную процедуру извлечения из реализуемой модели обработки архитектуры вычислительных ресурсов посредством совместного планирования и назначения процессов. Принципиальные отличия масштабирования от составления расписаний на заданной архитектуре — изменяемые длительности процессов и стоимости использования ими ресурсов, допустимость дополнительных (вводимых) компонентов. Схема масштабирования задания, использующая понятие условной оптимальности из динамического программирования, применима и в случае векторного критерия, поскольку позволяет сохранять полезные промежуточные результаты при поиске экстремума. Об этом будет сказано в гл. 7. Метод критических работ может использоваться для выбора архитектурных решений в широком классе масштабируемых систем.
Коллизии параллельных процессов вызываются конкуренцией за использование одного и того же ресурса. В масштабируемых системах коллизии разрешаются введением дополнительных ресурсов. Прямой перебор вариантов переназначения для оптимального разрешения многослойных коллизий при большом числе операций чрезвычайно трудоемок. В [58] были предложены специальные процедуры, подробно
описанные в § 6.3, с квадратичной и кубичной временной сложностью как функцией от числа операций за счет сведения «многослойных» коллизий к «двуслойным». Приближенное разрешение (с квадратичной сложностью) обеспечивает неухудшаемые, а условно оптимальное разрешение двуслойной коллизии (с кубичной сложностью) — экстремальные значения коэффициентов использования процессоров и каналов обмена данными. Рассмотренные процедуры могут быть также использованы для динамического управления параллельными процессами на основе списочных (приоритетных) расписаний выполнения параллельных программ с использованием фундаментального понятия критического пути [10]. После разрешения коллизий часть операций обмена может быть исключена, но план процессов обработки данных не должен изменяться. Это источник погрешности планирования, которая может иметь место при оптимальном, приближенном и условно оптимальном разрешении. В § 6.3 дана оценка верхней границы усредненной относительной погрешности планирования совокупности параллельных процессов.
Глава 7
СТРАТЕГИИ ПЛАНИРОВАНИЯ ПРОЦЕССОВИ РАСПРЕДЕЛЕНИЯ РЕСУРСОВ
. Стратегии распределенных вычислений
Зачем нужны стратегии планирования. В предыдущей главе мы говорили о том, что эффективное планирование вычислений в распределенных системах требует, как правило, комбинирования различных алгоритмов, учета динамики загрузки ресурсов, введения совокупности критериев эффективности их использования. Иными словами, приходится рассматривать некоторое множество сценариев развития вычислений, что приводит к понятию стратегии планирования процессов и распределения ресурсов.
Проиллюстрируем это на основе экспериментальных результатов, полученных группой проекта AppLeS в исследовании алгоритмов планирования для программы трассировки лучей POV, модифицированной с помощью системы программирования PVM [143]. Эксперименты проводились для неоднородной распределенной среды, состоящей из кластеров рабочих станций и персональных компьютеров. Исследовались два алгоритма трассировки лучей, реализуемых в соответствии с парадигмой master/slave, а именно статический и динамический (см. рис. 1.15). В качестве объектов обработки были выбраны два типа изображений — реалистичная трехмерная сцена («большая нагрузка») и регулярное, однородное изображение («однородная нагрузка»). «Большая нагрузка» часто используется в качестве бенчмарка при оценке производительности платформ, на которые устанавливается программа POV. Анализ результатов, полученных в [143], показывает, что по времени выполнения и эффективности использования ресурсов ни один из двух алгоритмов, ни статический, ни динамический, не обладает абсолютными преимуществами для различных комбинаций рабочей нагрузки и обрабатываемых наборов данных (блоков пикселей). Так, при «большой нагрузке» динамическая балансировка дает меньшее время выполнения программы и большую эффективность использования ресурсов, чем статическая балансировка. С другой стороны, ста™
тическое распределение «однородной нагрузки» позволяет уменьшить время прогона программы и повысить эффективность использования процессоров по сравнению с динамическим распределением той же «однородной нагрузки». Тут есть несколько факторов, объясняющих худшие характеристики статического планирования в сравнении с динамическим на «большой нагрузке».
Прежде всего, это влияние оценки объема вычислений ии^ выполняемого г-м процессором, производительность рф^) которого зависит от степени загруженности системы в целом в момент времени £д
о Рг(р)
Wi = В •™-—-— .
X рАР)
3=1
Здесь В — общее число блоков, на которые разбивается изображение, а Р — число процессоров в системе. При обработке же реальных трехмерных сцен объемы вычислений распределены между блоками далеко не равномерно.
Другой фактор — погрешность в оценке производительности процессора Pi(ti\ получаемой с помощью бенчмарка В Mi трассировки лучей для обработки изображения фиксированного размера и коэффициента доступности Ai^ti) г-го процессора в момент времени tit
Pi (ti) = В Mi • Ai^ti^.
Коэффициент Ai(ti) изменяется от 0 до 1, а конкретное его значение зависит от динамично меняющегося состояния ресурсов. В проекте AppLeS для вычисления A At А используется информация службы прогноза Network Weather Service (см. § 1.3). Погрешность в оценке рф^) объясняется главным образом неточностью прогноза доступности соответствующего процессора.
Стратегии планирования должны учитывать возможность влияния на реальную производительность вычислительной системы через управляемые параметры, доступные программе-планировщику. Так, в алгоритмах трассировки лучей такими параметрами являются размер и форма блоков, на которые разбивается изображение. Эксперименты [143] показывают, что при одном и том же числе пикселей в блоке можно так варьировать форму блока, придавая ей вид квадрата или прямоугольника, что на «большой нагрузке» и статический, и динамический алгоритмы балансировки выполняются практически за одно и то же время.
Таким образом, за планированием вычислений в распределенных системах и средах должно стоять нечто большее, чем один, хоть и очень изощренный алгоритм работы программы-планировщика. Как правило, эффективность и гибкость планирования обеспечиваются сочетанием различных алгоритмов, учетом наблюдаемых и контролируемых параметров, словом, всеми теми средствами, которые и составляют стратегию распределенных вычислений. Далее в этом параграфе мы
детально разберем один из подходов, который позволяет формализовать понятие стратегии выполнения программы, а сейчас рассмотрим несколько типов стратегий планирования.
Примеры стратегий распределенных вычислений. Сначала рассмотрим стратегии распределения вычислений и данных, вновь обратившись к модели [142], которую мы начали рассматривать в § 1.3 (см. рис. 1.17). По сути эта стратегия представляет собой различные комбинации алгоритмов внешнего по отношению к сайтам планирования работ и миграции данных в среде Grid. Напомним, что внешний планировщик направляет поток работ на выбираемый им сайт. Для этого выбора может использоваться информация, предоставляемая либо службой Network Weather Service, либо службой MDS инструментария Globus Toolkit, либо локальными системами управления ресурсов, размещенными на отдельных сайтах. При этом возможны различные варианты привязки внешних планировщиков к сайтам и взаимодействия с ними пользователей. В [142] приводятся результаты имитационного моделирования, когда внешний планировщик однозначно связан с определенным сайтом, а локальный планировщик поддерживает дисциплину обслуживания работ в порядке поступления (FCFS). Выбор сайта для размещения работы (Р) осуществляется внешним планировщиком в соответствии с одним из четырех принципов:
произвольный (случайный) выбор (РП);
выбор сайта с наименьшей текущей загрузкой (РЗ);
выбор сайта, на котором присутствуют необходимые для работы данные (РД);
направление работы на «свой» локальный сайт (РЛ).
Планировщик данных выполняет алгоритмы перемещения и репликации данных (Д) трех типов:
отсутствие активной репликации, т. е. просто удаленный доступ к данным (ДО);
репликация и перемещение данных на произвольно выбранный сайт (ДП);
репликация и перемещение данных на наименее загруженный сайт (ДЗ).
На рис. 7.1 показаны результаты экспериментов на имитационной модели для разных сочетаний алгоритмов внешнего планирования и размещения данных. Результаты получены для следующих параметров модели:
число пользователей 120;
число сайтов 30;
число процессоров на сайте 2-5;
число наборов (файлов) данных 200;
размер файла случайный от 500 Мбайт до 2 Гбайт с равномерным распределением;
время выполнения работы 300 D секунд, где D — размер входного файла данных (Гбайт);
степень «популярности» (число запросов) к файлам данных задается геометрическим распределением;
рабочая нагрузка в среде 6000 работ.
В экспериментах исследовались: среднее время выполнения работы (рис. 7.1, а), включая время ожидания в очереди, передачи необходимых данных и вычисления; средний объем передаваемых данных для выполнения одной работы (рис. 7.1, б); средняя доля простоя процессора в общем времени его использования (рис. 7.1, в).
Назначение работ:Назначение работ:РП — произвольный выбор сайта;РЗ — выбор сайта с наименьшей загрузкой;РД — выбор сайта, где есть необходимые данные;РЛ — выбор локального сайтаРП — произвольный выбор сайта;РЗ — выбор сайта с наименьшей загрузкой;РД — выбор сайта, где есть необходимые данные;РЛ — выбор локального сайтаСредний простой процессораСредний простой процессораРепликация данных:
Назначение работ:
Назначение работ:
РП — произвольный выбор сайта;
РЗ — выбор сайта с наименьшей загрузкой;
РД — выбор сайта, где есть необходимые данные;
РЛ — выбор локального сайта
РП — произвольный выбор сайта;
РЗ — выбор сайта с наименьшей загрузкой;
РД — выбор сайта, где есть необходимые данные;
РЛ — выбор локального сайта
Средний простой процессора
Средний простой процессора
ДО — отсутствие ■;
ДП — на произвольный сайт ■;
ДЗ — на наименее загруженный сайт О
Рис. 7.1. К стратегиям распределения вычислений и данных
Анализ приведенных на рис. 7.1 результатов показывает следующее. При отсутствии активной репликации данных (ДО) лучшее время выполнения достигается при назначении работы на локальный сайт (РЛ). Худшее время дает при этом алгоритм РД, когда вычисления выполняются там, где присутствуют необходимые данные (см. рис. 7.1, а). Это объясняется тем, что, несмотря на равномерное распределение данных в среде, геометрическое распределение уровня «популярности» различных файлов при использовании алгоритма РД приводит к перегрузке отдельных сайтов и снижению их производительности.
В условиях активной репликации данных с применением алгоритмов ДП или ДЗ наилучшим по все трем показателям оказывается
алгоритм РД (см. рис. 7.1). Это и понятно, поскольку динамическая репликация позволяет скомпенсировать перегрузки сайтов, обусловленные обращениями к наиболее «популярным» файлам. Незначительные объемы передаваемых данных в стратегиях РД + ДП и РД + ДЗ (см. рис. 7.1, б) обусловлены созданием копий (реплик) файлов и их пересылкой на другие сайты. Значительное сокращение среднего времени выполнения работы в этих стратегиях (см. рис. 7.1, а) также объясняется просто: выполнение работы не задерживается из-за отсутствия необходимых данных. При этом сокращается и время простоя процессоров (см. рис. 7.1, в).
Основной вывод, который можно сделать из анализа вышеприведенных результатов заключается в том, что в распределенных вычислениях нельзя изолированно друг от друга решать задачи планирования работ (распределения ресурсов) и распределения данных. Ключ к успеху — выбор адекватной стратегии согласованного распределения и данных, и процессов вычислений. Заметим, что к этому же типу стратегий можно отнести комбинации статической или динамической балансировки нагрузки, а также вида блоков пикселей в алгоритмах трассировки лучей.
Другой тип стратегий планирования основывается на прогнозировании времени выполнения программ [16, 99, 109, 145, 147]. Это может быть статическое прогнозирование методом прямого стохастического моделирования для динамического управления выполнением взаимосвязанных работ [16, 109]. Иной путь — предсказание динамики приложений с использованием предыдущего опыта выполнения подобных программ [99, 145, 147]. Рассмотрим основные идеи, составляющие суть второго подхода, который может эффективно применяться в метакомпьютинге для конфигурирования ресурсов под пользовательские программы [145, 147].
Основные задачи прогноза — оценить время выполнения и время ожидания в очереди работы, запускаемой пользователем на тех или иных ресурсах. Оценка времени прогона получается на основе специальных методов сравнения характеристик запускаемой и ранее выполнявшихся программ. Эти характеристики хранятся в специальной базе данных. Прогноз времени ожидания работы в очереди делается на основе имитационного моделирования действий программы- планировщика. В основу прогноза времени выполнения могут быть положены методы обучения на примерах [147], известные из исследований в области искусственного интеллекта. Степень подобия запускаемой и ранее выполнявшихся программ оценивается по ряду параметров, которые фигурируют в соответствующей метрике «близости». Основная проблема как раз и состоит в отборе параметров, по которым сравниваются программы: тип (имя) программы, имя пользователя, характеристики запрашиваемых процессоров, время прогона, указываемое пользователем, и т. д. Как показано в [145, 147], весьма эффективным в решении этой проблемы может оказаться использование генетических
алгоритмов. Характеристики, полученные в реальном прогоне каждой новой программы, пополняют историческую базу данных. При имитационном моделировании алгоритмов планирования, а именно, дисциплины обслуживания очереди работ, используются прогнозируемые длительности их выполнения. Что касается точности прогнозов такого рода, то относительная погрешность в десятки процентов для времени выполнения и до сотни процентов для времени ожидания в очереди считаются неплохими показателями. На практике оценки аналогичных динамических характеристик самими пользователями оказываются значительно более грубыми.
Следующий тип стратегий планирования — резервирование ресурсов [22, 146]. Механизм резервирования ресурсов со стороны пользователя поддерживается рядом систем пакетной обработки, в частности, системами PBS и LL, а также планировщиком Maui (см. § 1.3). В Grid-приложениях предварительное резервирование позволяет пользователю запрашивать ресурсы от нескольких автономных систем планирования. При этом, однако, возникает ряд вопросов, связанных с влиянием резервирования на эффективность использования ресурсов, время ожидания работ в очереди и отклонение запрашиваемого пользователем времени запуска от реального времени доступа к ресурсам. Запрос на резервирование, как правило, включает число процессорных узлов, максимальное время их загрузки, желательное время запуска приложения. Последнее может не совпадать с временем резервирования, предоставленным планировщиком конкретной локальной системы управления ресурсами. При реализации резервирования необходимо различать приложения, которые не могут прерываться, и приложения, допускающие прерывания и повторный запуск. Этот механизм, например, очень развит в системе Condor.
Сначала рассмотрим особенности резервирования для непрерываемых приложений. В этом случае планировщик не должен запускать работу из очереди, если ее выполнение не закончится в отведенное время. При этом приходится оперировать максимальным временем прогона. Прогноз момента резервирования, т. е. выделения работе ресурсов, планировщик выполняет на основе имитационного моделирования, целью которого является определение времени завершения уже выполняющихся работ.
Обратимся к результатам исследований, опубликованным в [146]. Они показывают, что резервирование всегда увеличивает время ожидания работ в очереди. Это увеличение менее заметно, если планировщик реализует алгоритм бэкфилинга (см. § 1.3, рис. 1.16). При этом время ожидания в очереди с дисциплиной LWF (первой обслуживается наименее трудоемкая работа) чуть больше, чем при обслуживании работ в порядке поступления (FCFS). Резервирование практически не сказывается на эффективности использования (времени простоя) ресурсов. Что касается отклонения запрашиваемого времени резервирования от фактического момента резервирования, то тут получается вполне
ожидаемый результат: отклонение тем больше, чем больше запросов на резервирование поступает в систему. Если планировщик выполняет бэкфилинг, то отклонение возрастает. Отклонение при обслуживании в соответствии с дисциплиной FCFS больше, чем в случае применения дисциплины LWF. Задержки в очереди могут возрастать тем сильнее, чем большее число более приоритетных по сравнению с работами в очереди резервирований имеет место. При этом отклонение ожидаемого и реального времени резервирования становится, естественно, меньше.
Если допускаются прерывания и повторные запуски работ, то для резервирования можно оперировать не максимальным, а прогнозируемым временем прогона программы. Этот прогноз может быть сделан с помощью рассмотренных выше методов. При этом возникает вопрос: какие работы целесообразно прерывать, чтобы не задерживать обслуживание очереди в целом? В [146] предлагается упорядочивать работы по стоимости прерывания. Она включает две составляющие: стоимость выполненной части работы и стоимость той части, которую предстоит выполнить. Обе оцениваются пропорционально произведению числа используемых процессорных узлов и времени прогона, причем доминирует первая составляющая. В целом же возможность перезапуска улучшает такие характеристики, как среднее время ожидания в очереди и отклонение резервируемого времени от реального времени доступа к ресурсам.
Как видно из рассмотренных примеров, стратегии планирования необходимы, когда приложение выполняется в динамично меняющемся окружении. Однако при этом стратегии используют априорные «заготовки», представляющие собой заранее предполагаемые сценарии вычислений. Конкретный сценарий выбирается из «заготовки» в зависимости от наступления некоторых событий в окружении программы. Сейчас мы посмотрим, каким образом в некоторых случаях можно формализовать само понятие стратегии и процедуры ее порождения.
Задача порождения стратегии. Динамическое управление параллельными процессами может осуществляться на основе статического прогнозирования их выполнения. Алгоритмы управления вычислительными работами выбираются из определенного набора (априорной «заготовки») в зависимости от временных параметров контрольных событий, обусловленных взаимодействием процессов, занятостью ресурсов и т. д. Для порождения стратегии выполнения программ на основе векторного критерия возможно применение методов масштабирования ресурсов и процессов, рассмотренных в гл. 6. В частности, векторный критерий может быть образован стоимостью и коэффициентами использования базовых процессоров. При этом ограничения задаются в виде крайних сроков завершения отдельных действий и всей программы. Стратегия представляет собой множество вариантов масштабирования процессов программы. При выполнении
комплекса работ конкретный вариант масштаба для каждой из них может выбираться из полученной оптимальной стратегии.
По-прежнему будем считать, что модель программы — ориентированный бесконтурный граф, вершины которого соответствуют операциям обработки и обмена, а дуги — информационным связям и условным ветвлениям. Задание представляется в виде последовательности двух и более операций, работа — в виде последовательности операций и заданий. Каждая из операций характеризуется априори заданными длительностью т^ и стоимостью С^ выполнения на ресурсе j-ro типа и соответствующими значениями т^ С-^ полученными в результате масштабирования. Альтернатива масштабирования ресурсов описывается вектором ^ = (жх, ждг, «!,..., адг), где х^ — независимая переменная (длительность т^ операции или стоимость С^ использования ею ресурса), сц — назначение Ай операции.
Как и в гл. 6, далее используются понятия из динамического программирования. Для дальнейшего чтения этой главы желательно также знакомство читателя с понятиями бинарного отношения и оптимизации по бинарному отношению. Здесь можно рекомендовать книгу [65], хотя все необходимые сведения приводятся в этом параграфе по ходу изложения материала.
Пусть Е — множество альтернатив, каждая из которых ^ G Е соответствует допустимому масштабу S операций (6.18). С помощью вектора W (£) аддитивно-сепарабельных критериев w^ (^), к = 1, . . . , К, вида (6.24) задается бинарное отношение Ф для сравнения альтернатив множества Е. Ограничения для операций, заданий и работ, представляющие собой крайние сроки или предельные стоимости завершения, так же, как и в гл. 6, полагаются связывающими. Множество Opt (S, Ф) оптимальных по отношению Ф альтернатив в модели выбора (Е, Ф) [57] будем называть Ф-оптимальной стратегией выполнения программы. Модель выбора (Е, Ф) — частный вид алгебраической системы. Например, если Ф — отношение Парето, то речь идет о тг-оптимальной стратегии, где
7г = {(6,6) € е2 | (Vfe е {1,..., я}) wk (€1) > wk^,^к0 е {1,..., Я}) wko (€1) > Wko (€2)} ,
a гщ (•), ui^0 (•) — аддитивно-сепарабельные критерии.
Общая постановка задачи порождения оптимальной стратегии выполнения программы заключается в том, чтобы при заданных связывающих ограничениях для действий программы найти множество Opt (Е, Ф), причем каждая из альтернатив ^ G Opt (Е, Ф) должна реализовывать допустимый в соответствии с (6.19)-(6.23) масштаб S операций.
Конкретизируем задачу. Пусть, частные критерии — функция от стоимости операций обработки CF и коэффициенты использования UPj базовых процессоров J-ro типа (см. (6.28), (6.30)-(6.32)). Пусть
С F — «экспоненциальный штраф» на вводимый ресурс:
Nг=1Nг=1
N
г=1
N
г=1
Очевидно, что функции СF и UР^ j Е {1, . . . , J}, являются аддитивно-сепарабельными. Поэтому при использовании двухэтапной процедуры масштабирования, состоящей из планирования критических работ (см. § 6.2) и разрешения коллизий (см. § 6.3), векторный критерий W (£) может быть образован из функций СF, UPj от переменных т^-, например:
ИДОЛ...,ЛеЦ,.-.ЛУ(7.1)
Тогда в качестве примера конкретной постановки задачи можно привести поиск я-оптимальной стратегии, где х порождается векторным критерием (7.1), независимая переменная есть т^, связывающее ограничение задается крайним сроком Т* завершения программы.
Декомпозиция задачи поиска оптимальной стратегии. Основная идея поиска Ф-оптимальной стратегии выполнения программы заключается в том, чтобы из Е последовательным применением частных критериев кд (£) выделить подмножества Е/. Д = 1, . . . , К, такие, что
Ор1(Е,Ф) С Opt( [J Ей,ф\
к
где Ф — сужение Ф на J Ед = Е, т.е. Ф = Ф Q Е2. При этом поиск k=i
решения на Е должен быть менее трудоемким, чем непосредственное отыскание стратегии Opt (Е, Ф), что по сути означает реализацию метода последовательного анализа вариантов [42].
Введем частные бинарные отношения вида
^к-^ъ^^е Е., Е, СЕ, б€Е\Еь к = 1^.ЛУ(7.2)
Подмножество Ед., одновременно внутренне и внешне устойчивое в модели выбора (Е, Фд.) [57], назовем стратегией, условно оптимальной по -критерию w^ (С)- Пусть Ед, — условно оптимальные стратегии, Ф = к
= (J Ф^, отношения Фд, являются антисимметричными. В силу внеш- k=i1
ней устойчивости Ед. и антисимметричности Фд.
(5Г€Ор1(Е,Ф))
Значит, Ф — сужение Ф на Е. С учетом внутренней устойчивости Ед. получаем
Opt (Е, Ф) = Opt (Е, Ф) = Е.(7.3)
Пусть Ф, Ф — отношения Парето, порождаемые частными критериями гщ (^), а отношения Фд. (7.2) таковы, что w^ (£Д ^ w^ (^2)? т- е. к
Ф — «асимметричная часть» отношения [J Ф/.. Обозначим, через В^ /с = 1
подмножества Парето в условно оптимальных стратегиях В^ а Е^ — подмножество Парето в Е. Если предположить, что (3^* Е Ек) £* ^ Е, то по определению отношения Парето это означает, что Що € {1,, К}) wfco(C) > w^^), где £ € S.
Антисимметричность Ф^ и внешняя устойчивость В^ исключают к
существование такой альтернативы £*. В общем случае П ^1Гк ^ 0.
/с = 1
При ЭТОМ
(3^ Е Bk П ^f) k ^ k\ 1 ^ k,kf ^ К,
^к П ^к* 7^ ^ € Е ^7rfc , ^ ^ ^ттк? •
К
Значит, В^ = |J EKfc. Далее,
(^ е Ет J « € Е \ Ет J wk Ю > wk (С) •
Поскольку Ф — сужение Ф на 3, то тг-оптимальная стратегия есть
ОрЦЕ,тг) = U НТк =E;rC J Ек.(7.4)
к=1к=1
Таким образом, поиск Ф-оптимальных стратегий (7.3), (7.4) выполнения программ сводится к формированию подмножеств В^ альтернатив, условно оптимальных по частным критериям гщ (^), и отбору к
из Е = [J Е& альтернатив, оптимальных по Ф.
Генерация условно оптимальных стратегий. Рассмотрим задание q, q = 1, . . . , Q, с вектором независимых переменных (управлением) xq = (жх, . . . , жШд), где ж^д, iq = 1, . - . , mqi управление для гд-й операции задания (см. § 6.2). Для поиска условно оптимального управления по критерию w^ (xq) воспользуемся функциональным уравнением (6.26) из § 6.2. Пусть u)^q = w^q (xi, Zx) + w^ — зависимость для отыскания условно оптимального управления жх для запаса Zx к началу первой операции q-го задания. Здесь
^ко= 52 w^b
q — "Г 1
w^q^Z-p^ — условные оптимумы критерия w^ при заданном значении запаса ZT .
Для отыскания условных оптимумов управления для этих операций строятся зависимости
СЧ = ^ki^Xi^ZiJ +W^O, iq > 1,
a w/^g(a^g, ^g) = extr{w/^gJ^g, ^g)} является субоптимальным значением критерия по типам базовых ресурсов.
Обозначим через Arg w^, iq = 1, . . . , т^ множество значений независимых переменных функции w^. Тогда Уж^ Е Argw^Q найдется по крайней мере одна последовательность (ж*, . . . , жД) такая, что ж*^ Е Е Arg w^, причем при жД ^Г^ = arg extr гд = 2, . . . , тд, достигается условный оптимум функции w^ для запаса ZTq. Заметим, что любому управлению ж*, . . .соответствует одно и только одно
значение запаса Z^, . . . , ZTq.
Вектор ж*^ = (ж*, ж*, - . - , х*т^ — условно оптимальное управление по частному критерию w^ (жд) для задания q. Условно оптимальное назначение операции задания определяется как
otiq =argextr{wfci , «)}, iq = 1,. .., mq.
3
Вектор d*g = (a*, сф-.., а*г ) — условно оптимальное назначение для задания q с использованием критерия wk (^qY Поскольку однокритериальная схема маштабирования, изложенная в § 6.2, применима и к отдельным операциям, то условно оптимальная по критерию w^ (Д стратегия для R работ программы есть совокупность векторов £* = = &“ы)> где
®кп = Ц’п ■ • • 1 ®kqV “kR = (“м, • • • 1 “kqV R Q < N.
Подмножества Е^ = {£* \к = 1, . . . , АД представляют собой условно оптимальные стратегии выполнения программы. Действительно, Е^ внутренне устойчиво, поскольку (V^,^ € Efe) (^^J ф ^к- В соответствии с методом генерации Е^ по однокритериальной схеме масштабирования ресурсов
(V^ Е ЕД (¥^к Е Е\ЕД w(CD > «МЫ- Следовательно,
(V^€E\Efe) (3^eEk) (С'ХОеФь
где Wk задается выражением (7.2). Поэтому Вк внешне устойчиво. Кроме того,
(V^Xfc € 3) Ж^к) € Фк,(^Х*) € Фк] = ^к, т. е. отношение ^к является антисимметричным.
Основные особенности формирования стратегии выполнения про™ граммы в масштабируемых системах состоят в следующем.
Во-первых, порождение стратегии осуществляется на основе последовательного применения однокритериальной схемы масштабирования для соответствующих частных критериев. Эта схема подробно рассматривается в § 6.2.
Во-вторых, поиск решения (оптимальной стратегии) выполняется на семействе, образованном множествами условно оптимальных альтернатив масштаба, на основе сравнения их по бинарному отношению, формируемому векторным критерием.
В-третьих, условно оптимальные по частным критериям стратегии обладают свойствами внутренней и внешней устойчивости в соответствующих моделях выбора. Если частные бинарные отношения, аппроксимирующие бинарное отношение для сравнения альтернатив, являются антисимметричными, то решение задачи поиска стратегии совпадает с семейством условно оптимальных стратегий либо является его подмножеством.
. Модельные примеры поиска оптимальныхстратегий вычислений
Генерация Парето-оптимальной стратегии по трем критериям. Рассмотрим подграф из модельного примера § 6.2 (см. рис. 6.6, а), вершины которого представляют операции обработки щ, ^2? ^з и обмена W12, ^Щз, dt^ с теми же, что и в § 6.2, априорными характеристиками операций обработки. Пусть доступно по одному из двух типов базовых процессоров и один канал обмена данными. Значения длительностей операций обмена постоянны и равны: т^ = т^3 = = Т2з = 0,5. Необходимо найти тг-оптимальную стратегию выполнения программы при крайнем сроке Г* = 7 ее завершения, когда тг порождается критерием (7.1). При этом максимальные значения верхней границы длительности т^ по всем значениям запаса тахт^ для г = 1, 2, 3
равны соответственно 5,36; 5,61 и 5,23, а шаг изменения переменной составляет 0,26; 0,51; 0,13.
Проведем генерацию условно оптимальных стратегий, последовательно применяя критерии 1/CF^ U Pi и U Р^.
На рис. 7.2 показана зависимость 1/(7F от длительности ri операции щ, построенная по однокритериальной схеме, изложенной в § 6.2. Каждое значение ri представляет условно оптимальное управление для операции ui и определяет значение запаса времени к началу операций ^2 и ^з-
Для условно оптимальных длительностей г*, г*, т* по схеме § 6.2 и в соответствии с процедурой, изложенной в § 7.1, определяются условно оптимальные назначения а*, а*, а*.
(l/CF)-102
0,261,302,603,905,20
Рис. 7.2. Генерация условно оптимальной стратегии по критерию 1/(7F
В табл. 7.1 приведено множество условно оптимальных по критерию 1/ С F альтернатив масштаба. При этом коэффициенты использования процессоров U Pi, U Р^ определяются по выражениям (6.28) и (6.30), а значение Tij в (6.28) принимается равным условно оптимальному г*. При генерации по критерию 1/СF каждому г* соответствует одна и только одна пара (г*, т*), а назначения а*, а*, а* однозначно определяются условно оптимальным управлением (т*, т*, г*).
СР.
0,261,302,603,905,20
Рис. 7.3. Генерация условно оптимальной стратегии по критерию UPi
На рис. 7.3 приведена зависимость UPi (ri), каждая точка которой соответствует условно оптимальному значению г*. При этом значения 1/(7F рассчитываются по т*, т*, г* и являются субоптимальными, т. е. наибольшими по двум типам доступных процессоров.
В табл. 7.2 представлен фрагмент стратегии, условно оптимальной по критерию UPi.
Зависимость UPi (ту) строится поэтапно в соответствии с однокритериальной схемой масштабирования.
На рис. 7.4 показаны вспомогательные зависимости для коэффициента UР^ использования процессора первого типа операциями и^, от длительности т^ при различных значениях запаса Z^ по времени к началу операции и^.
По условным максимумам UР^ строятся зависимости от запаса ^2 для условно максимального коэффициента UР^о и условно
Т а б л и ц а 7.1
Стратегия, условно оптимальная по критерию по 1/CF
Вариант
Параметры
Критерии
И*
С
Т*
«2
(1/СГ)-102
UP1
UP2
1
0,26
3,57
2,17
2°
1°
2°
0
0
0
2
0,52
3,06
2,42
2°
Г
2°
1,3
0
0
3
0,78
3,06
2,16
2°
Г
2°
3,9
0
0
4
1,04
3,06
1,90
2°
1°
2°
5,7
0
0
5
1,30
3,06
1,64
2°
Г
1
6,8
0,27
0
6
1,56
3,06
1,38
2°
1°
1
7,3
0,23
0
7
1,82
3,06
1,12
2°
1°
1
7,4
0,19
0
8
2,08
2,55
1,37
2
г
1
7,3
0,23
0,35
9
2,34
2,55
1,11
2
1°
1
7,1
0,19
0,39
10
2,60
2,55
0,85
2
г
Г
6,4
0
0,43
11
2,86
2,04
1,10
2
г
1
5,9
0,18
0,48
12
3,12
2,04
0,84
2
1°
1°
5,4
0
0,52
13
3,38
2,04
0,58
2
г
Г
4,2
0
0,56
14
3,64
1,53
0,83
1
1°
1°
3,4
0,61
0
15
3,90
1,53
0,57
1
1°
1°
2,9
0,65
0
16
4,16
1,53
0,31
1
г
г
1,3
0,69
0
17
4,42
1,02
0,56
1
1°
1°
0,9
0,74
0
18
4,68
1,02
0,30
1
г
г
0,6
0,78
0
19
4,94
0,93
0,13
1
г
г
0
0,82
0
20
5,20
0,51
0,29
1
2°
г
0
0,87
0
21
5,36
0,51
0,13
1
2°
г
0
0,89
0
Т а б л и ц а 7.2
Фрагмент стратегии, условно оптимальной по критерию 17Pi
Вариант
Параметры
Критерии
И*
Т*
Т*
«2
«3
(1/СГ)-102
UP1
UP2
22
0,26
5,61
0,13
2°
1
Г
0
0,94
0
29
2,08
0,51
3,41
2
2°
1
0
0,57
0,35
30
2,34
0,51
3,15
2
2°
1
0
0,53
0,39
31
2,60
0,51
2,89
2
2°
1
0
0,48
0,43
40
4,68
1,02
0,30
1
Г
Г
0,6
0,78
0
46
5,36
0,51
0,13
1
2°
Г
0
0,89
0
Рис. 7.4. Масштабирование операций а2, ^з по критерию U Pi
оптимального управления т*, г* (рис. 7.5). Наконец, по зависимости UР^о получается зависимость суммарного коэффициента UР± для всех трех операций vi, v2, уз (см- Рис- 7.3).
Рис. 7.5. Зависимости для условно оптимального масштабирования по критерию U Pi от запаса времени
На рис. 7.6 показана зависимость условно оптимальных значений критерия UР^ от ri, а в табл. 7.3 приведен фрагмент стратегии, условно оптимальной по U Р^. Зависимость I^F2(ti) строится аналогично зависимости U Рх (тх).
В условно оптимальной по 1/ С F стратегии подмножество Парето образовано альтернативами 5, 7—18 (см. табл. 7.1-7.3). Подмножества Парето, выделенные из стратегий, условно оптимальных по разным
Т а б л и ц а 7.3
Фрагмент стратегии, условно оптимальной по критерию UP^
Вариант
Параметры
Критерии
Т*
Т*
о?
«2
«з
(1/СГ)-102
UP1
UP2
47
0,26
5,61
0,13
2°
2
Г
0
0
0,94
55
2,34
0,51
3,15
2
2°
2
0
0
0,92
56
2,60
0,51
2,89
2
2°
1
0
0,48
0,43
62
2,60
2,04
1,36
2
1°
1
6,1
0,23
0,43
63
2,60
2,55
0,85
2
Г
Г
6,4
0
0,43
106
4,68
1,02
0,30
2
Г
Г
0,6
0
0,78
112
5,36
0,51
0,13
2
2°
г
0
0
0,89
Рис. 7.6. Генерация условно оптимальной стратегии по критерию UР^Рис. 7.6. Генерация условно оптимальной стратегии по критерию UР^
Рис. 7.6. Генерация условно оптимальной стратегии по критерию UР^
Рис. 7.6. Генерация условно оптимальной стратегии по критерию UР^
критериям, могут пересекаться. Например, одинаковыми являются альтернативы 10 и 63, 18 и 40, 31 и 56 (см. табл. 7.1-7.3). Мощность множества Е условно оптимальных альтернатив в данном примере меньше 112. Может существовать более одной точки, в которых аддитивносепарабельная функция w^, iq > 1, достигает условного оптимума. Следовательно, и последовательностей (ж*, • ■ . ^х^^ соответствующих ж*, может быть больше одной (например, альтернативы 56, 62, 63 в табл. 7.3). Заметим, что мощность исходного множества альтернатив
5,360J65,360J65,610,515,610,515,23 одз5,23 одз- 8 = 75768,- 8 = 75768,
5,36
0J6
5,36
0J6
5,61
0,51
5,61
0,51
5,23 одз
5,23 одз
- 8 = 75768,
- 8 = 75768,
где р) — не меньшее целое число. В тг-оптимальную стратегию входит 55 альтернатив. Таким образом, по трудоемкости рассмотренный метод порождения оптимальных стратегий весьма эффективен.
Программа-планировщик может выбирать тот вариант из «стратегической заготовки», который подходит к ситуации, складывающейся в динамично меняющемся окружении прикладной программы. Например, в данном случае алгоритм выбора может строиться на оценке
времени, которое выделяется для выполнения отдельных процессов щ, ^2 и Уз с учетом крайнего срока завершения программы. Положим, про™ цесс щ должен использовать не более 3 единиц времени, а для завершения всей программы выделяется 7 единиц. Тогда планировщик может выбрать из тг-оптимальной стратегии любой из вариантов следующей совокупности: 5, 7—11 (см. табл. 7.1). Число порождаемых вариантов масштабирования естественным образом может быть уменьшено, если в однокритериальной схеме увеличивать шаг изменения независимой переменной ж г и сравнивать альтернативы по частным критериям с заданной допустимой погрешностью.
Рис. 7.7. Бабочка БПФ для вычислений по алгоритму Кули-ТьюкиРис. 7.7. Бабочка БПФ для вычислений по алгоритму Кули-ТьюкиУровень 1 Уровень 2 Уровень 3Уровень 1 Уровень 2 Уровень 3Стратегии для вычислений с регулярной структурой. Рассмотрим особенности генерации стратегий для «регулярных» алгоритмов таких, например, как быстрое преобразование Фурье (БПФ). Пусть необходимо выполнить масштабирование операций обработки в бабочке БПФ для вычисления с основанием 4 по конвейерному алгоритму Кули-Тьюки (рис. 7.7).
Рис. 7.7. Бабочка БПФ для вычислений по алгоритму Кули-Тьюки
Рис. 7.7. Бабочка БПФ для вычислений по алгоритму Кули-Тьюки
Уровень 1 Уровень 2 Уровень 3
Уровень 1 Уровень 2 Уровень 3
Трехуровневая сеть содержит вершины щ, ^2? ^з? соответствующие умножению, вершины 04^ ^5, ^8? ^10? соответствующие сложению, И вершины 0^1 ^7? ^9? Щ1, соответствующие вычитанию комплексных чисел. Обозначим через Т^ и Ci соответственно длительность и стоимость каждой из операций г-го уровня, где г = = 1, 2, 3.
Априорные значения длительности Т^ и стоимости С^ выполнения операций г-го уровня для двух типов базовых процессоров приведены в табл. 7.4.
Таблица 7.4
Априорные значения длительности и стоимости операций уровня
Уровень г операций
1
2
3
Длительность
тЯ
3
2
2
грО 1 г2
6
2
2
Стоимость
С®1
3
3
3
С°2
1
1
1
Положим, в каждом уровне может использоваться до четырех процессоров каждого типа. Крайний срок завершения системы операций Т* = 6. Необходимо построить тг-оптимальную стратегию для век™
торного критерия (7.1). Стоимость выполнения каждой из операций об™ работки Cij (Тг) = С^ exp (Т^/Т^ — 1). Минимально возможные значения длительности: Т^ = 0,38, Т2™ = 0,25, Т3™ = 0,25.
Из рис. 7.7 и данных табл. 7.4 ясно, что все операции обработки изначально принадлежат критическим по длительности работам. Совместное планирование и назначение этих работ, тем не менее, сводится
Рис. 7.8. Зависимости для условно оптимального масштабирования операций БПФ второго и третьего уровней
к соответствующей задаче масштабирования задания из трех операций, поскольку операции одного уровня имеют одинаковые априорные потребности в ресурсах.
На рис. 7.8 приведены вспомогательные зависимости условно оптимального масштабирования для функции стоимости операций БПФ второго и третьего уровней.
Характерно, что условно оптимальные управления в уровнях 2 и 3 (Т*, Т* на рис. 7.8) отличаются не более чем на величину шага изменения переменных Т^ = Т3™ = 0,25. Потому соответствующие операции в условно оптимальной стратегии могут быть реализованы процессорами одного типа (операции различных уровней не могут разделять один и тот же процессор из-за конвейерной организации обработки в алгоритме Кули-Тьюки; см. рис. 7.7).
Теперь рассмотрим генерацию условно оптимальной стратегии по коэффициенту UPi.
В табл. 7.5 приведены значения коэффициента использования процессора первого типа операциями второго уровня UР12, третьего уровня U Р1з и совместно операциями второго и третьего уровней О Р^ при фиксированном значении запаса Z^ по времени к началу операций во втором уровне.
Таблица 7.5
Проявление эффекта нечувствительности (Z2 = 3,72)
т2
0,25
0,50
0,75
1,00
1,25
1,50
1,75
2,00
2,25
2,50
2,75
3,00
3,25
3,47
Тз
3,47
3,22
2,97
2,72
2,47
2,22
1,97
1,72
1,47
1,22
0,97
0,72
0,47
0,25
ирИ
0
0
0
0
0
0
0
0,33
0,38
0,42
0,46
0,50
0,54
0,58
U Pis
0,58
0,54
0,50
0,45
0,41
0,37
0
0
0
0
0
0
0
0
UP?
0,58
0,54
0,50
0,45
0,41
0,37
0
0,33
0,38
0,42
0,46
0,50
0,54
0,58
Рис. 7.9. Назначение операций бабочки БПФ
Из табл. 7.5 видно, что условные максимумы UР^ достигаются как на нижней, так и на верхней границе диапазона изменения переменной Т-2 (соответственно на верхней и нижней границах диапазона изменения переменной Тз).
Таким образом, проявляется эффект нечувствительности коэффициента использования процессоров к изменению некоторых независимых переменных масштабирования. Причина такой нечувствительности, естественно, объясняется самим видом критериев (6.28)-(6.32): их значения при масштабировании задания определяются суммарным временем использования ресурса различными операциями.
Положим, длительность 21-й и 22-й операций задания из т операций, 21, «2 ^ {1, • • • , w}? не меньше априори заданных: r^j ^ TiTj^ T^2j ^ t^j (масштабирование осуществляется по длительности выполнения). Тогда, если T^j + T^j = const, то независимо от изменения значений т^^, т^27-, не меньших априорных, значение соответствующего коэффициента использования будет одним и тем же (см. табл. 7.5). Последствия проявления эффекта нечувствительности состоят в том, что условно оптимальные управления для различных информационно связанных операций одного задания с одинаковыми априорными потребностями в ресурсах могут различаться больше чем на величину шага изменения независимой переменной и назначаться на различные типы ресурсов.
На рис. 7.9 показаны назначения операций БПФ (см. рис. 7.7), соответствующие тг-оптимальной стратегии, формируемой по критерию (l/CF, UPi^ UР2). Варианты назначения на процессоры, показанные на рис. 7.9, д^ е^ соответствуют проявлению эффекта нечувствительности векторного критерия к назначению операций второго и третьего уровней бабочки БПФ.
Следующий параграф посвящен вопросам выбора стратегии выполнения программы на основе преобразования ее модели.
. Выбор стратегии обработки
Постановка задачи выбора. В общем случае выбор оптимальной в заданном смысле конфигурации масштабируемых вычислительных ресурсов предполагает не только планирование процессов, но и структурные преобразования самой модели обработки.
Это могут быть, например, допустимые преобразования отношения предшествования операций. Параметризованную модель обработки, управления и передачи данных, например, граф, будем далее называть операционной моделью.
Вариант архитектуры вычислительных ресурсов для выполнения конкретного программного приложения, как правило, является результатом структурных и параметрических преобразований операционной модели. При масштабировании операционная модель определяется за™
данием: множества операций; отношения их предшествования; набора ресурсов; априорных и изменяемых параметров; функциональных зависимостей между изменяемыми параметрами операций. Структурные преобразования (трансформации) не должны нарушать логической структуры программы.
На рис. 7.10 приведены примеры допустимых трансформаций отношения предшествования, заданного информационным графом
Рис. 7.10. Граф отношения предшествования (а) и допустимые трансформации (б, в)Рис. 7.10. Граф отношения предшествования (а) и допустимые трансформации (б, в)Viv2v3v4Тп2151z21,50,543С°1226С°1362Viv2v3v4Тп2151z21,50,543С°1226С°1362Априорные параметры операций обработкиАприорные параметры операций обработкиv-V!v2v335112243С?!326Сй462v-V!v2v335112243С?!326Сй462Априорные параметры операций обработкиАприорные параметры операций обработки
Рис. 7.10. Граф отношения предшествования (а) и допустимые трансформации (б, в)
Рис. 7.10. Граф отношения предшествования (а) и допустимые трансформации (б, в)
Vi
v2
v3
v4
Тп
2
1
5
1
z2
1,5
0,5
4
3
С°
1
2
2
6
С°
1
3
6
2
Vi
v2
v3
v4
Тп
2
1
5
1
z2
1,5
0,5
4
3
С°
1
2
2
6
С°
1
3
6
2
Априорные параметры операций обработки
Априорные параметры операций обработки
v-
V!
v2
v3
3
5
1
12
2
4
3
С?!
3
2
6
Сй
4
6
2
v-
V!
v2
v3
3
5
1
12
2
4
3
С?!
3
2
6
Сй
4
6
2
Априорные параметры операций обработки
Априорные параметры операций обработки
(рис. 7.10, а): агрегирование (укрупнение) параллельно выполняемых операций v^, и" обработки (рис. 7.10, б) и операций vr^3, vr"3 обмена (рис. 7.10, в). В результате агрегирования операции выполняются последовательно, а значения соответствующих параметров суммируются.
Пример недопустимого агрегирования: одна из операций выполняется в цикле, а другая — нет.
Примеры допустимых трансформаций: итеративное разворачивание циклов, если это предусмотрено целевой архитектурой (см. §5.1, рис. 5.2); кластеризация операторов программы на основе различных метрик «близости» (см. рис. 5.10-5.12).
Агрегирование может применяться в случаях, когда уровень доступных ресурсов ограничен и невозможно в максимальной степени реализовать параллелизм, заложенный в программе.
При трансформациях операционной модели необходимы согласованные правила изменения оценочных, априорных параметров операций. Так, суммирование параметров операций обработки в примерах на рис. 7.10 может интерпретироваться следующим образом. Пусть стоимость представляет собой функцию от объема и времени вычислений: чем больший (или меньший) объем вычислений выполняется за то же время, тем больше (меньше) стоимость вычислений. Пусть при агрегировании операций Fu v” (см. рис. 7.10, а, б) суммарный объем вычислений не изменяется (об исходных посылках такого допущения мы говорили в § 2.2). В результате последовательного выполнения операций и^ и" «внутри» операции щ, назначаемой на один процессор, длительности операций суммируются. Тогда мы вправе полагать, что стоимость операции щ равна сумме стоимостей и^ и и".
Возможны, разумеется, и другие правила пересчета априорных оценок процессов программы. Главное, чтобы они одинаково (согласованно) применялись во всех допустимых трансформациях по всей системе действий.
Таким образом, конфигурация вычислительных ресурсов (далее — альтернатива) может быть «извлечена» из исходной операционной модели путем ее трансформаций и масштабирования процессов, т. е. параметрических преобразований. В методах решения таких задач должны быть явно представлены механизмы генерации (синтеза) и выбора альтернатив. При этом априорная структуризация альтернатив невозможна, поскольку структура ресурсов как раз и является результатом трансформаций и масштабирования операционной модели.
Пусть Т* — множество исходных операционных моделей системы, X — множество альтернатив, получаемых из Т^ применением совокупности процедур масштабирования и трансформаций. В результате масштабирования и трансформаций порождаются соответствующие подмножества 8, Т С X. Любая альтернатива из Т описывается вектором внутренних (оценочных) параметров из области А С Еп, а альтернатива из 8 — вектором внешних параметров из области 5 С С Еп (здесь Еп — n-мерное евклидово пространство), причем 8 С А. Оценочные параметры вводятся для оценки качества, перспективности той или иной трансформации, а внешние параметры устанавливают фактические ограничения на выполнение программы, например крайний срок ее завершения или число доступных процессоров.
Отбор альтернатив из 8 и Т осуществляется на основе сравнения по бинарным отношениям F и G соответственно, при этом в общем случае F не является сужением G на 8^ т. е. F ^ G П S2. Цель масштабирования — преобразовать вектор оценочных параметров из А так, чтобы он находился в допустимой области 8. Таким образом, отбор альтернатив по G «поставляет» альтернативы для их сравнения по F.
Формально модель синтеза стратегии обработки определим как четверку (X,Tr, F, G), где X = S U Т, а Тг — конечное множество трансформаций. Когда мы говорим о конечности множества Тг, то ис
ходим из посылки, что число вариантов возможных укрупнений, детализаций и реструктурирований операционной модели ограничено. Так,
число возможных агрегирований операций естественно ограничивается
случаем чисто последовательных вычислений. Здесь модель синтеза так же, как и модель выбора в § 7.1, представляет собой частный вид
алгебраической системы.
Обозначим через Opt (5, F) множество оптимальных по отноше
нию F альтернативнию F альтернативРис. 7.11. Базовая рекуррентная схема синтеза стратегии обработкиРис. 7.11. Базовая рекуррентная схема синтеза стратегии обработкив модели выбора (S, F) и будем называть это множество стратегией обработки, понимая под этим не только множество вариантов масштабирования (планирования процессов), но и структурно различные модели программ.
нию F альтернатив
нию F альтернатив
Рис. 7.11. Базовая рекуррентная схема синтеза стратегии обработки
Рис. 7.11. Базовая рекуррентная схема синтеза стратегии обработки
Базовой рекуррентной схемой (рис. 7.11) назовем набор этапов
BS = (St0,Sti,...,StL),(7.5)
St0 = Т* ^SQ^ Ym= Opt(50, FY
St; = Tt ^St^Y^ Opt(yz_1 U Sb FY
Tt = Tz n Opt(T,_1 и S,-1 и Л, G) 0,
где Tq — множество исходных операционных моделей (начальное условие схемы); Т^ — результат допустимой трансформации множества X^i = Tj^ (J Si^i при переходе с этапа St/_i на этап St/; I = 1, . . . , L.
Ядром X* модели синтеза будем называть множества Xq или Х[ = Т^ U 8ь для которых не существует допустимой трансформации из Тг.
Таким образом, в схеме (7.5) с этапом St/_i связывается подмножество Tr/_i С Тг допусти
мых трансформаций, а со схемой в целом — соответствующее семейство Тг= {Тг/_ 11I = 1, . . . , LY Синтез по схеме (7.5) рекуррентно выполняется до тех пор, пока не будет выделено ядро, которое существует тогда и только тогда, когда Xq ^ 0. При этом на каждом этапе на основе сравнения по отношению F отбираются альтернативы с учетом результатов предыдущих этапов. Этапы Sto, St/ схемы будем называть условно оптимальными, если Уо ^ 0, У/ ^ 0.
Постановка задачи синтеза стратегии обработки по базовой рекуррентной схеме (7.5) заключается в том, чтобы при заданных множестве Т* С X исходных операционных моделей и модели синтеза (X, Тг, F, G^ найти стратегию Opt (5, F) либо ее приемлемую аппроксимацию, причем X* С X.
Обоснование базовой схемы выбора стратегии. Конечность множества Тг трансформаций не обеспечивает сходимости базовой схемы за конечное число этапов: важно, чтобы на очередном этапе не повторялись альтернативы из S и Т, полученные на предыдущих этапах.
Рассмотрим отношение на множестве пар альтернатив Т2 х Т2, описываемых оценочными параметрами пространства А2 х А2:
Н = {(Щ, х5М ^ь®1-Х е Т2 х Т2 I j, I € {1,..., L}, j < I},где Xj е Tj, Xj-i € Sj-r, $i E Tt, xi-i € Si-i-E^
Пусть (ж1, ж0) G G. Верхний срез [65] отношения (7.6):
Н+\х\ ж0] = {(ж;, Ж(-1) е Т2 | (ж;, Ж(-1) //(ж1, ж0) } .(7.7)
L
Пусть Н^ = (J Н_Дх^, ж^х], где Н^. [•] — верхний срез (7.7) отноше- /=1
ния (7.6), построенный на паре (х^ ж^-ф G G подходящего множества.
Теорема 7.1. Если подходящее множество пар {(х^ж^-Д!
/ = !,...,£} является внешне устойчивым в модели выбора (G, ЕХ1), где Н^1 — отношение, обратное (7.6), то схема (7.5) сходится за число этапов, равное L + 1, где L = |Тг|.
Доказательство. Если подходящее множество {(хДж^х)| / = !,...,£} внешне устойчиво в (G, Н™1), то Д+ = G и
xtH^Xj, х^фх^х, (xj,Xj_x) eGe (xh хщХ) G G. (7.8)
По сути (7.8) формально представляет принцип выбора альтернатив «по прецеденту». Мощность семейства Тг равна числу пар в подходящем множестве, т. е. L. Следовательно, число этапов синтеза равно £ + 1, что и требовалось доказать.
Конечную базовую схему (7.5) будем называть зафиксированной, если задано множество отображений tr^i: Х[~х -G Tr^i, где Tr^i G GTF, / = !,...,£.
Теорема 7.2. Пусть базовая рекуррентная схема (7.5) зафиксирована. Если X* = Хо, то Opt (5, F) = Уф Если же X* = Xl. то Opt (S, F) = YL = Opt (YL_x J Sl, F), причем Yi = Opt (УА1 U
Доказательство. Через P (S) обозначим множество всех допустимых последовательностей альтернатив, соответствующих этапам схемы синтеза и начинающихся на первом условно оптимальном этапе St9 (Yq ф 0, 0 q L). Пусть Sq1^ — подмножество множества Sq“\ полученного на этапе St9, такое что 5^^ Q Opt(5g2\F) = 0. Свяжем с bq , bq ' две одноэлементные последовательности pq ' = (5g j,
р^ = (Sq2^. Последовательности из г — q Г 1 элементов обозначим через pqT, где pqT = (^g, ^g+i,. . . , S^, г q, О < г L. Верхний индекс в обозначении р^ будем полагать равным 1, если множества последовательности р^ не содержат элементов, оптимальных по отношению F, и 2 в противном случае.
Пусть b (•) — начальный отрезок, а е (•) — сопряженный с ним конечный отрезок последовательности из P(S). На множестве Р (S) определим монотонно рекурсивный функционал Ф следующего вида:
ф(рД) < ф(р^2)),
(7-9) (Vpi,p2 € Р (S)) е (pi) =
= е (р2) Л Ф (6 (pi)) < Ф (6 (р2)) => Ф(Р1) < Ф(рг),
где 6(pi), Ь (р2) — начальные, a e(pi), е (р2) — сопряженные с ними конечные отрезки последовательностей pi, р2.
Из (7.9) следует, что Ф(р^) < Ф(р^)- Пусть Е(р^), R(j>q^ подмножества множества P(S^ допустимых последовательностей, заканчивающихся на L-м этапе синтеза. Пусть Р(р^), ^(Pqr) — совокупности всех конечных отрезков последовательностей из множеств Р(р^^, R(p^^ сопряженных соответственно с р^г , р^г • В силу того, что схема зафиксирована, а отображения tr^i, I = = !,...,£, задают трансформации всех альтернатив множеств X^i, включая Si^i, получаем Р(р^^ С P(p^Y
Согласно (7.9) на последовательностях из Р (S), приводящих на этапе St^ к множеству оптимальных по F элементов, функционал Ф достигает наименьшей верхней грани. В соответствии с принципом монотонной рекурсивности [42] таких последовательностей не может содержать множество R(p^y Это означает, что на q-м этапе из множества Sq = Sq2^ нужно отобрать альтернативы, принадлежащие множеству Opt (Sq, F), которые и будут учитываться при поиске стратегии Opt (S, F).
Пусть q = 0 и X* = Xq. Тогда Opt (S, F) = Opt (So, F) = Уд. Рассмотрим случай, когда X* = Хц I ^ 1. Полагая г = g + 1, г ^ 1, для двухэлементных последовательностей получаем
Opt(yg и ОрЩ(2Щ), F) = Opt (У, и Sq+11FY
По индукции
4 = Opt(y;_x и Opt(ShF),F) = Opt(y;_! и SbF\
Если X* = Xl, то Opt (S, F) = YL = Opt (Yl^i U Sl^ F), что и требовалось доказать.
При доказательстве теоремы 7.2 использован принцип монотонной рекурсивности, что не означает, тем не менее, так называемого пошагового конструирования вариантов [42]. На каждом этапе базовой схемы выполняются только допустимые трансформации и сразу же отбраковываются альтернативы, не являющиеся оптимальными по отношениям G и F.
Рассмотрим теперь вопрос о взаимосвязи этих бинарных отношений. Определим отображение у: S -0 X, являющееся гомоморфизмом моделей выбора (S', F) и (X, G):
(Mx.yES) xFy => у (ж) Gy (у) , у (ж), у (у) Е X. (7.10)
Пусть имеет место (7.10). Если Opt (X, G) = 0, то и Opt (5, X) = 0. Действительно, поскольку Opt (X, G) = 0, то (V/ = 1, . . . , L) Т^ = 0 и, значит, Si = 0. Предположим, что при этом Opt (5, F) ^ 0. Стратегией может быть только Уд. Пусть х* G Уд. В соответствии с (7.10)
(Vy е Уо) x*Fy => 7 (ж*) G7 (у),
где 7 (ж*), 7 (у) € Sq. Таким образом, Opt (X, G) = Opt (So, G) 0. Из полученного противоречия следует, что решения задачи синтеза, т. е. оптимальной стратегии обработки, не существует.
Пусть ст: X X есть эндоморфизм модели выбора (X, G), a F = = G П 52. Если Opt (X, G) П S 0, то Opt (5, F) С Opt (X, G). Пусть (Зх* Е Opt (5, X)) х* Opt (X, G). Это означает, что (Зу Е X) (ж*, у) Е G G. В силу эндоморфизма ст: X X справедливо (Зег (у) Е S^ ст (ж*), ст (у) Е F и Opt (5, X) = 0. Значит, Opt (5, X) С Opt (X, G).
Отношения G и X могут аппроксимироваться более простыми бинарными отношениями на соответствующих этапах синтеза. Пусть, например, L L
G= [JGh F= [J Fhi=i i=i
где G/, F[ — отношения для сравнения альтернатив из множеств Si^i и Ть и Si соответственно. Если у^: У^х U Si Si-i U Т[ являются гомоморфизмами моделей выбора (Yi-i IJ S^ Fi) и (5щ1 J TbGiY / = 1, • • •, Ь, a Opt (X, G) = 0, то Opt (S', X) = 0.
В заключение этого пункта необходимо заметить, что на некоторых этапах базовой схемы процедуры трансформаций либо масштабирования операций могут «пропускаться», т. е. соответствующие преобразования являются тождественными.
Примеры выбора стратегий обработки. Пусть отношение предшествования операций обработки и обмена данными представлено информационным графом, показанным на рис. 7.10, а. Там же приведены априорные значения длительности т^ и стоимости С^ выполнения операций обработки на j-m типе процессора, j = 1,2. Пред™
положим, что доступно по одному процессору каждого типа и один канал обмена. Заданы крайний срок t* = 7 завершения системы операций, являющийся внешним параметром, и неизменяемые значения длительности операций обмена: ТГ12 = 0,4; ТГ23 = 0,6; тг^3 = тг/3 = 1,0. Длительность и стоимость операций обработки могут изменяться в результате масштабирования и принимать значения т^-, C^j соответственно. Бинарное отношение F представляет собой полный порядок, определяемый на множестве 8 альтернатив функцией стоимости
NCF^C^expNCF^C^exp
NCF^C^exp
NCF^C^exp
обработки данных, где N — число операций обработки.
Пусть множество допустимых трансформаций включает агрегирование операций v” обработки (см. рис. 7.10, б) и операций vr^, vr"3 обмена (см. рис. 7.10, в).
Эффективность трансформации оценивается по отношению G^ которое так же, как и отношение F^ является полным порядком на множестве X альтернатив с оценочными параметрами. Отношение G формируется критерием w1 = 1/ Рг, где Рг — число параллельно работающих процессоров. Оценочным параметром является длительность / завершения операций для альтернатив из множества Т С X, причем / ^ /*, где /* = 8.
Задача синтеза стратегии обработки состоит в отыскании варианта системы с минимальной стоимостью обработки min СF и крайним сроком t* = 7 завершения программы.
На этапе Sto выполним агрегирование операций v^ v", «пропуская» процедуру масштабирования. В результате агрегирования значение критерия w1 возрастает с 1/2 до 1, и при наилучшем сочетании ресурсов выполняется неравенство f ^ f* (см. рис. 7.10, б). Однако при этом нарушается крайний срок t* для альтернатив из 8:
Т12 + тг12 + т^ + тг2з + т31 = 8.
На этапе Sti проведем масштабирование операций по методу критических работ, описанному в гл. 6, изменяя параметры Т1,Т2,т.з так, чтобы минимизировать С F при заданном I*. Результат масштабирования представлен диаграммой на рис. 7.12. В скобках рядом с символом операции указан тип используемого процессора. Легко убедиться, что никакая комбинация априорных параметров операций (см. рис. 7.10, б) не обеспечивает minCF = 13,6 при t* = 7.
При переходе на этап St2 выполним агрегирование операций обмена vr^3, vr/3 (см. рис. 7.10, в). Эта трансформация является допустимой, поскольку значение критерия w1 не уменьшается и по-прежнему достаточно одного канала для операций обмена. Масштаб операций обработки при этом не изменяется.
РаботыРаботы
Работы
Работы
vr12vr23 Время
01234567
Рис. 7.12. Результат масштабирования операций при выборе стратегии обра-ботки
Альтернативы, представленные графами на рис. 7.10, б, в и диаграммой на рис. 7.12, принадлежат ядру модели синтеза и образуют оптимальную стратегию обработки. Нельзя выполнить ни одного агрегирования операций обмена W12, wys или vr23? ^Ту^ без нарушения ограничения на внутренний параметр /.
Положим теперь, что отношение F на множестве 8 альтернатив формируется вектором частных критериев из k (s), s G 8 k = 1, . . . , К. Стратегия обработки может быть найдена с использованием метода декомпозиции, изложенного в § 7.1. Основная идея заключается в том, чтобы из 8 последовательным применением критериев (s) выделить подмножества 8ь такие что
/ к
ОрЦ8,Е^ С Opt! U sbw
кгде Ж — сужение F на (J 8k = ^ т.е. Ж = F Q Z2.
k=i
Рассмотрим бинарные отношения
wk = {(sn s2) | ^ G Sb Sk cSbkE S\Sb к = 1,.. ., КЗ . (7.11)
Напомним, что подмножество 8 к. одновременно внутренне и внешне устойчивое в модели выбора (S^Wk). называется стратегией, условно оптимальной по частному критерию wk (s).
к
Пусть 8к — условно оптимальные стратегии, Ж = U Wk. отноше- к=1
ния Wk являются антисимметричными. Поскольку 8 к внешне устойчивы, a Wk антисимметричны, то (3 s* G Opt (5, F)^ s* ^ Z. Поэтому W — сужение F на Z. Поскольку 8 к внутренне устойчивы, то
Opt (5, F) = Opt (Z. Ж) = Z.(7.12)
Пусть FW — отношения Парето, порождаемые критериями из к (s), а отношения Wk (7.11) таковы, что изкЗЗ 'ШкЗЗ- Пусть S^k — подмножества Парето в условно оптимальных стратегиях 8к. а 8^ — подмножество Парето в 8. Если (3s* G 83 s* ^ч то З^о G {1, . . . , К})
wko (s*) > ^ко (SX гДе 8 ^ Z. Антисимметричность Wk и внешняя устойчивость 8к не допускают существование альтернативы s*. При к
этом в общем случае Q 8^к ^ 0 (см. § 7.1 и § 7.2), причем
(3s' € Sk n sk.), к ^ к', l^k, к'
sk n Sk, ^0, s' e S^k. s' $ S„k,.
Следовательно,
^ = U S^. (3S E 8^ (V/ E 8^) wk (s) > wk (s'). k=i
Поскольку W — сужение F на Z, оптимальная стратегия обработки — это множество альтернатив вида
Opt (S, F) = и -^ = .^ с и Sk.(7.13)
к=1к=1
Поиск стратегий обработки (7.12), (7.13) сводится к формированию к
условно оптимальных стратегий 8к и выбору из Z = (J 8к альтерна- к=1
тив, оптимальных по W. Как показано в § 7.2, этот метод декомпозиции весьма эффективен с точки зрения сокращения мощности множества 8 генерируемых альтернатив.
Рассмотрим, как вышеописанная декомпозиция поиска стратегии обработки Opt (5, F) может быть реализована базовой рекуррентной схемой синтеза.
Итак, пусть F, G — отношения Парето. Операционная модель и множество трансформаций те же, что и в ранее рассмотренном примере (см. рис. 7.10). Отношение G порождается критериями w1 = 1/Рг, w2 = 1/f, a F — частными критериями wk (s), к = 1, . . . , К (примеры частных критериев w^ (•) рассматриваются в гл. 6 и § 7.1). Задача заключается в отыскании на 8 подмножества Парето 8^ при заданном крайнем сроке t* завершения программы.
Сначала на этапах Sto, Sti выполняются два допустимых агрегирования (см. рис. 7.10, б, в) без масштабирования операций обработки. Очевидно, что получаемые альтернативы с оценочными параметрами являются оптимальными по Парето: в результате агрегирования значение w1 увеличивается с 1/2 до 1, значение w2 уменьшается с 1/7,5 до 1/8. Затем, начиная с этапа St2, осуществляется масштабирование последовательным применением критериев wk (s) по вышеописанному методу декомпозиции. Тем самым на этапах St2, ..., St^+i порождаются множества S^ • • ■ , Sk^i альтернатив, условно оптимальных по критериям гщ (s) , . . . , wk (s) соответственно. Отношение W = F Q Z2,
К+1
где Z = |J S^ аппроксимируется совокупностью отношений W[ вида Z=2
Подмножества Si являются одновременно внутренне и внешне устойчивыми в моделях выбора (S^ Ж/), где S = Z a S^ С Z.
Обобщение базовой схемы синтеза стратегий. Подход к синтезу стратегий обработки по базовой рекуррентной схеме (7.5), естественно, нуждается в развитии. Реальный процесс выбора стратегии выполнения программы может включать итеративное применение базовой схемы с различными вариантами исходных операционных моделей и наборами трансформаций, параллельную проработку альтернатив по разным схемам. Наконец, могут применяться комбинации схем, их итераций и параллельных схем, приводящие к обобщению схем синтеза стратегий обработки.
В зафиксированной базовой схеме реализуется одно из возможных множеств последовательностей допустимых трансформаций и параметрических преобразований операционной модели. Пусть некоторая базовая схема BSq с начальным условием Tq0 содержит не менее двух этапов синтеза. После того как закончена проработка альтернатив по схеме BSq, т. е. достигнуто ядро на этапе то и выделено множество Yomo оптимальных альтернатив (оно может быть и пустым), осуществляется возврат на некоторый промежуточный или начальный этап схемы. В качестве начального выбирается то же или другое, отличное от Tq0 условие и реализуется последовательность трансформаций и параметрических преобразований по другой базовой схеме BSi.
Развитие этого процесса приводит к итеративно-рекуррентной схеме, показанной на рис. 7.13, на которой: То*о, Т-^, . . . , Т*о — начальные условия в базовых схемах BSq, BSi, • • • , BSs; Yomo> Yimi, . . . , Ysms — частные стратегии обработки; Ym — оптимальная стратегия обработки, полученная по итеративно-рекуррентной схеме.
Рис. 7.13. Итеративно-рекуррентная схема синтеза стратегии обработкиРис. 7.13. Итеративно-рекуррентная схема синтеза стратегии обработкиРис. 7.14. Параллельно-рекуррентная схема синтеза стратегии обработкиРис. 7.14. Параллельно-рекуррентная схема синтеза стратегии обработки
Рис. 7.13. Итеративно-рекуррентная схема синтеза стратегии обработки
Рис. 7.13. Итеративно-рекуррентная схема синтеза стратегии обработки
Рис. 7.14. Параллельно-рекуррентная схема синтеза стратегии обработки
Рис. 7.14. Параллельно-рекуррентная схема синтеза стратегии обработки
Формально итеративно-рекуррентная схема — это набор базовых схем (BSq, BSi, . . . , BSs), причем первые s схем содержат не менее двух этапов. Таким образом, в каждой из этих схем существует по крайней мере одна допустимая трансформация.
Еще один вид композиции — параллельно-рекуррентная схема, в которой каждая из схем Sq, Si, . . . , Ss может быть композицией базовых и итеративно-рекуррентных схем (рис. 7.14). При этом разные схемы Sp, р = 1, . . . , s, имеют в общем случае разные формы исходного представления, что определяется некоторой функцией Т^ Т^о, а оптимальная стратегия Ym отыскивается с учетом множеств частных стратегий Уото? • • • , Ysms полученных в схемах So, . . . , Ss.
Наконец, обобщенная рекуррентная схема представляет собой набор, в котором каждая из схем может быть композицией базовых, итеративно-рекуррентных и параллельно-рекуррентных схем (рис. 7.15),
Рис. 7.15. Обобщенная рекуррентная схема синтеза стратегий обработки
а оптимальная стратегия обработки выделяется с учетом частных стратегий, полученных в каждой из композиций.
Приведенные выше разновидности схем синтеза стратегий обработки представляют собой специальные случаи композиции базовых схем. В любой композиции можно выделить набор базовых рекуррентных схем, по которым отыскивается частная оптимальная стратегия обработки или ее приемлемая аппроксимация. Таким образом, базовые схемы — это те ячейки, на основе которых строятся более сложные композиции, которые мы и называем обобщенными рекуррентными схемами.
Теперь дадим обоснование обобщенной схемы. Пусть R — квазипорядок на множестве X альтернатив обработки, генерируемых по базовой схеме. Тогда отношение Ir эквивалентности, порожденное R, задает разбиение X на классы Xq, Х[ G X \Ir , I = 1, . . . , L, в соответствии с этапами синтеза.
Пусть Tq — общее начальное условие в двух зафиксированных базовых схемах, генерирующих множества Х\ X" альтернатив соответственно; R\ R" — квазипорядки на Х\ Xм порождающие отноше-
ния /д, /д эквивалентности. Если X' Q Xм = 0, то /^ U /^ — отношение эквивалентности на Xf J X". Это непосредственно следует из того, что прямая сумма отношений эквивалентности на непересекающихся множествах есть также отношение эквивалентности Ясно, что общее решение должно отыскиваться на объединении решений, полученных по базовым схемам с общим начальным условием Т^.
Пусть зафиксированы базовые схемы BSm, т = 1, . . . , М, каждой из которых сопоставлена модель синтеза (Хт, Trm, Fm, GmY ^o — множество исходных операционных моделей в базовых схемах. Формально обобщенную схему с начальным условием Т^ представим набором GS = (BSi, BS2, • • • , BSm), причем заданы отображения Лт: 2то* 2Т°.
Пусть S — семейство альтернатив, описываемых внешними параметрами и генерируемых по обобщенной схеме GS, a Sm — множества, получаемые по базовым схемам, образующим GS. Определены отображения /im: 2s 2Sm такие, что р^: 2Sm 2s, т = 1, . . . , М, представляют собой гомоморфизмы моделей выбора ^Sm, F^, (S, F) и их дополнений (ST(S, Fy
^U, V C sm) (UFmV => мД (U) F^1 (V)) Л
A (VFmU дД (V) T/z-1 (IT)) , (7.14)
где F m, F — дополнения отношений Fm, F на множествах Sm и семействе S альтернатив.
Смысл соотношения (7.14) заключается в том, что «лучшие» по Fm альтернативы обработки из 8т переходят в «лучшие» по F в семействе 8, а «нелучшие» из 8т не могут быть представлены «лучшими» в 8. Формальным обоснованием поиска стратегии обработки по обобщенной схеме является следующее утвеждение.
Теорема 7.3. Пусть заданы обобщенная схема GS и гомоморфизмы р^ (•) (7.14). Тогда оптимальной стратегией обработки, полученной по схеме GS, является множество
м
Opt(Щ
где Уьт = Opt (Sm, F^ — частная стратегия, полученная по базовой схеме BSm.
Доказательство. Основная идея доказательства строится на использовании обобщения принципа оптимальности динамического программирования для прообразов допустимых последовательностей альтернатив Р (8т), заканчивающихся на этапах Lm, т = 1, . . . , М, базовых схем (см. доказательство теоремы 7.2).
Обозначим через Р (5) семейство гомоморфных прообразов допустимых последовательностей Р (5т), образованных альтернативами
из Sm. На семействе Р (S) определим монотонно-рекурсивные функционалы (7.9) и обозначим их 991, 992, . . . , Фм- Пусть Р (S) — подсемейство последовательностей, образы которых заканчиваются на этапах £1, £2, • • • ? Ьм в соответствующих базовых схемах. Последовательности из Р (S), на которых каждый из функционалов 99^, т = = 1, . . . , М, достигает наименьшей верхней грани, в соответствии с теоремой 7.2, могут приводить к множествам, содержащим элементы стратегии Opt (S^ F).
Пусть Р (Sm) — подмножество множества допустимых последовательностей, на которых монотонно-рекурсивный функционал фт (7.9) достигает наименьшей верхней грани. Согласно (7.11) последовательности из прообраза множества Р (S^n)\P(Sm) в S' не могут приводить к Opt (S, F). Значит, оптимальные по F альтернативы нужно отыски- м
вать на семействе |J (Уьт), где
YLm = Opt (Sm, Fm) = Opt (Yl„-i U Sm, Fm),
что и требовалось доказать.
Итак, планирование и распределение вычислений в масштабируемых средах требует в общем случае выбора стратегии обработки на основе сочетания структурных и параметрических преобразований моделей программ. В данном параграфе рассмотрены регулярные процедуры, которые могут быть использованы для порождения такого рода стратегий. Регулярность схем синтеза стратегий позволяет с единых методологических позиций ставить вопрос об их компактной инструментальной реализации соответствующими программами- планировщиками и менеджерами ресурсов.
7.4. Комментарий и краткий обзор к главе 7
Вопросам согласованного распределения вычислений и данных в среде Grid, помимо упоминавшейся в § 7.1 работы [142], посвящена статья [83], авторами которой являются участники проекта AppLeS. (На сегодняшний день AppLeS трансформировался в другой проект — Grail, дополнительную информацию о котором можно найти по адресу http://grail.sdsc.edu.) В [83] рассматриваются различного рода эвристики для размещения файлов на сайтах с целью максимального повторного использования данных. В отличие от подхода [142], стратегия планирования, предлагаемая в [83], не предполагает динамической репликации данных.
В [145, 147] описываются экспериментальные результаты по прогнозированию времени выполнения больших комплексов программ в Аргоннской национальной лаборатории, Корнельском теоретическом центре и Суперкомпьютерном центре Сан Диего (США). Эти же комп™
лексы программ используются и для исследования эффективности стратегий резервирования ресурсов в работе [146], на результаты которой делаются ссылки в § 7.1. В прогнозных стратегиях используются различные метрики «близости» ранее выполнявшихся и вновь запускаемой программ. В [147], например, предлагается использовать неоднородную евклидову метрику, а для отбора параметров, по которым сравниваются программы, применяется генетический алгоритм [145].
Предложенный в [50, 51] метод совместного планирования и назначения процессов для оптимизации архитектурных решений вычислительных систем в статье [55] развивается для порождения стратегий выполнения программ на основе вектора критериев. При этом масштабируемые ресурсы и программное приложение можно рассматривать как единую среду, позволяющую перераспределять априорные оценки длительности процессов и стоимости использования ими ресурсов с целью оптимизации динамики программ. Стратегия порождается путем последовательного применения для всех частных критериев схемы, изложенной в [50]. Эта схема, основанная на понятии условной оптимальности из динамического программирования, позволяет генерировать лишь «полезные» альтернативы, принадлежащие условно оптимальным стратегиям. Метод весьма эффективен с точки зрения сокращения мощности исходного множества вариантов. Конкретный вариант масштаба из стратегии может выбираться программой- планировщиком в зависимости от наступления контрольных событий [16, 83, 109, 143].
В § 7.3 рассмотрена дальнейшая разработка метода [55], когда формирование стратегии выполнения программы предполагает не только масштабирование, но и структурные преобразования модели обработки. Основной математический аппарат, лежащий в основе поиска стратегий, представляет собой рекуррентные схемы синтеза, обоснованные в работе [57]. Рекуррентные схемы синтеза позволяют развить процедуры последовательного анализа вариантов [42] в многошаговые дискретные управляемые процессы. Формально эти процессы и моделируются рекуррентными схемами, которые могут быть эффективно реализованы алгоритмически. Одной из основных проблем является конструктивное описание множества альтернатив планирования и распределения ресурсов в заданной модели выбора. В схемах последовательного анализа на передний план выходит отбраковка неперспективных альтернатив, а механизм порождения альтернатив оказывается скрытым. Обычно в задачах синтеза различного рода систем предполагается возможность априорной структуризации свойств системы на уровне образующих ее компонентов. Методологической основой таких подходов, как правило, являются идеи морфологического анализа. Однако в ряде задач априорная структуризация альтернатив невозможна. Примером может служить генерация архитектурных решений вычислительных систем по операционной модели [6, 50, 51, 55]. Здесь вариант
системы является результатом трансформации отношения предшествования операций [6], их планирования и назначения на ресурсы [50, 51, 55]. Примеры структурных преобразований моделей обработки можно найти в [156]. В рекуррентных схемах синтеза стратегий выполнения программ конкретизируются механизмы формирования альтернатив. Рассмотренные схемы синтеза стратегий представляют собой механизмы направленной генерации и отбора альтернатив обработки. Теоремы 7.1-7.3 формально обосновывают базовую и обобщенную рекуррентные схемы синтеза, на основе которых могут быть реализованы иерархические схемы поиска стратегий выполнения прикладных программ в планировщиках для распределенных систем и метакомпьютинга.
ЗАКЛЮЧЕНИЕ
Назвав книгу «Модели распределенных вычислений», автор прежде всего имел в виду вопросы, связанные с выполнением распределенных программ в масштабируемых системах. Почему речь идет не о параллельных вычислениях вообще, а выделяется аспект, связанный с распределенностью процессов и данных? Причина заключается в том, что современные параллельные архитектуры характеризуются таким свойством, как масштабируемость. Прямое следствие масштабирования — распределение процессов обработки. Но ведь с распределенными системами и пользователи, и разработчики имеют дело уже давно. Однако масштабируемость, понимаемая как возможность наращивания ресурсов, предполагает и эффективные механизмы управления ими, что требует разработки новых принципов организации вычислений. В масштабируемых системах фактор высокой степени автономности параллельно протекающих процессов, которые должны взаимодействовать между собой, порождает целый комплекс проблем.
Известно, что чем менее строгая модель в смысле точного порядка выполнения инструкций принимается программистом, тем эффективнее и быстрее работают программы в распределенных системах. Например, разновидности модели общей памяти с ослабленными требованиями к согласованности данных являются более производительными, чем модель последовательной непротиворечивости. Но это — одна сторона медали. Другая ее сторона — недетерминизм процессов вычислений: возможны различные истории выполнения программы на одних и тех же исходных данных. Естественным ограничением в этих условиях является требование однозначности результата. В данной книге сделана попытка затронуть эту проблему, при этом сформулирован принцип взаимной транзитивности: любой допустимый процесс программы может быть началом или окончанием другого допустимого процесса.
Еще одна проблема распределенных вычислений — блокировки, причем, как оказывается, не все из них исчерпываются тупиками. В сложно организованных программах блокировки могут быть обусловлены и недетерминированным характером протекания процессов, и структурой программы, и структурой данных, которыми обмениваются процессы. Вопросы обнаружения и предотвращения таких ситуаций требуют специальных методов анализа свойств распределенных программ.
Наконец, при организации вычислений в масштабируемых системах и средах могут потребоваться особые алгоритмы управления ресурсами для эффективного планирования процессов. Здесь уже не «работа-
ют» классические расписания: прикладную программу и аппаратную платформу можно рассматривать как программно-аппаратную среду, которая соответствующим образом настраивается, конфигурируется для ускорения вычислений, балансировки загрузки процессоров и т. д.
В сущности эта книга и была написана для того, чтобы попытаться разобраться с подобными вопросами, возникающими при вычислениях в параллельных масштабируемых системах. Конечно же, материал книги не охватывает всей совокупности проблем, связанных с распределенной обработкой. Не обсуждались, в частности, вопросы надежности и защиты, технологии разработки распределенных приложений, файловых систем, систем распределенных документов и т. д. В одной книге это сделать трудно. Однако автор попытался обозначить те области в распределенных вычислениях, которые, на его взгляд, требуют внимания в настоящее время и будут влиять на характеристики масштабируемых вычислительных архитектур в будущем.
СПИСОК ЛИТЕРАТУРЫ
Абрамов С. М., Адамович А. И., Коваленко М. Р. Т-система — среда программирования с поддержкой автоматического динамического распараллеливания программ. Пример реализации алгоритма построения изображений методом трассировки // Программирование. — 1999. — №2. — С. 100-107.'
Аветисян А. И., Гайсарян С. С., Самоваров О. И. Возможности оптимального выполнения параллельных программ, содержащих простые и итерированные циклы, на неоднородных параллельных вычислительных системах с распределенной памятью // Программирование. — 2002. — №1. — С. 38-54.
Арапов Д. М., Калинов А. Я., Ластовецкий А. Л. и др. Язык и система программирования для высокопроизводительных параллельных вычислений на неоднородных сетях // Программирование. — 2000. — №4. — С. 55-80.
Байцер Б. Микроанализ производительности вычислительных систем. — М.: Радио и связь, 1983. — 360 с.
Балашов В. В., Капитонова А. ГД Костенко В. А. и др. Метод и средства оценки времени выполнения оптимизированных программ // Программирование. — 1999. — №5. — С. 52-61.
Барский А. Б. Параллельные процессы в вычислительных системах. Планирование и организация. — М.: Радио и связь, 1990. — 256 с.
Бочаров Н. В. Технологии и техника параллельного программирования // Программирование. — 2003. — № 1. — С. 5-23.
Бурцев В. С. Параллелизм вычислительных процессов и развитие архитектуры суперЭВМ. — М.: ИВВС РАН, 1997. — 152 с.
Воеводин В. В., Воеводин Вл. В. Параллельные вычисления. — СПб.: БХВ-Петербург, 2002. — 608 с.
Головкин Б. А. Расчет характеристик и планирование параллельных вычислительных процессов. — М.: Радио и связь, 1983. — 272 с.
Гэри М. Р., Джонсон Д. С. Вычислительные машины и труднорешаемые задачи. — М.: Мир, 1982. — 416 с.
Дийкстра Э. Взаимодействие последовательных процессов // Языки программирования. / Под ред. Ф. Женюи. — М.: Мир, 1972. — С. 9-86.
Дикарев Н. ЕД Шабанов Б. М. Реальная и пиковая производительности суперЭВМ // Автоматизация проектирования. — 2000. — № 1-2. — С. 3-15.
Ершов А. П. Об операторных схемах Янова // Проблемы кибернетики. Вып. 20. — М.: Наука, 1967. — С. 181-200.
Ершов А. П. Введение в теоретическое программирование (беседы о методе). — М.: Наука, 1977. — 288 с.
Игнатуи^енко В. В., Подшивалова И. Ю. Динамическое управление надежным выполнением параллельных вычислительных процессов для систем реального времени // Автоматика и телемеханика. — 1999. — >6. — С.142-157.
Капитонова Ю. В., Летичевский А. А. Математическая теория проектирования вычислительных систем. — М.: Наука, 1988. — 296 с.
Касьянов В. Н. Учет априорной информации при анализе свойств состояний программ // Математическая теория программирования. — Новосибирск: ВЦ СО АН СССР, 1985. - С. 150-157.
Клейнрок Л. Вычислительные системы с очередями. — М.: Мир, 1979. — 600 с.
Клини С. К. Введение в метаматематику. — М.: ИЛ, 1957. — 526 с.
Коваленко В., Коваленко Е., Корягин Д. и др. Управление заданиями в распределенной вычислительной среде // Открытые системы. — 2001. — >5-6. - С. 22-28.'
Коваленко В., Корягин Д. Эволюция и проблемы Grid // Открытые системы. — 2003. — > 1. — С. 27-33.
Коган Б. И. Экспериментальные исследования программ. — М.: Наука, 1988. - 184 с.
Конвей Р. В., Максвелл В.Л., Миллер Л. В. Теория расписаний. — М.: Наука, 1975. — 360 с.
Коновалов Н., Крюков В. Параллельные программы для вычислительных кластеров и сетей // Открытые системы. — 2002. — >3. — С. 12-18.
Корнеев В. В. Параллельные вычислительные системы. — М.: Нолидж, 1999. — 320 с.
Корнеев В. В., Киселев А. В. Современные микропроцессоры. — М.: Нолидж, 2000. — 320 с.
Корнеев В. Архитектуры с распределенной разделяемой памятью // Открытые системы. — 2001. — >3. — С. 15-23.
Костенко В. А., Смелянский Р.Л., Трекин А. Г. Синтез структур вычислительных систем реального времени с использованием генетических алгоритмов // Программирование. — 2000. — >5. — С. 63-72.
Котов В. Е. Сети Петри. — М.: Наука, 1984. — 160 с.
Котов В. Е., Сабелъфелъд В. К. Теория схем программ. — М.: Наука, 1991. — 248 с.
Кофман А. Введение в прикладную комбинаторику. — М.: Наука, 1975. — 480 с.
Крюков В. А., Удовиченко Р. В. Отладка DVM-программ // Программирование. — 2001. — >3. — С. 19-29.
Кук Д., Бейз Г. Компьютерная математика. — М.: Наука, 1990. — 384 с.
Лацис А. Как построить и использовать суперкомпьютер. — М.: Бестселлер, 2003. — 240 с.
Лекции по теории графов / В. А. Емеличев, О. И. Мельников, В. И. Сар- ванов, Р. И. Тышкевич. — М.: Наука, 1990. — 384 с.
Липаев В. В. Распределение ресурсов в вычислительных системах. — М.: Статистика, 1979. — 248 с.
Липский В. Комбинаторика для программистов. — М.: Мир, 1988. — 214 с.
Майника Э. Алгоритмы оптимизации на сетях и графах. — М.: Мир, 1981. .-------------- 328 с.
Мальцев А. И. Алгоритмы и рекурсивные функции. — М.: Наука, 1986. — 368 с.
Манна 3. Теория неподвижной точки программ / / Кибернетический сборник. Вып. 15. — М.: Мир, 1978. — С. 38-100.
Михалевич В. С.^ Кукса А. И. Методы последовательной оптимизации в дискретных сетевых задачах оптимального распределения ресурсов. — М.: Наука, 1983. — 208 с.
Оре О. Теория графов. — М.: Наука, 1980. — 336 с.
Смелянский Р. Л. Об инварианте поведения программ // Вестник Моск, ун-та. Сер. 15. Вычисл. матем. и кибернетика. — 1990. — № 4. — С. 54-60.
Танаев В. С.^ Гордон В. С.^ Шафранский Я. М. Теория расписаний. Одностадийные системы. — М.: Наука, 1984. — 384 с.
Таненбаум Э. Архитектура компьютера. — СПб.: Питер, 2002. — 704 с.
Теория расписаний и вычислительные машины / Под ред. Э. Г. Коффмана. — М.: Наука, 1984. — 334 с.
Топорков В. В. Структурно-динамические модели вычислений на метаоператорных сетях // Вестник МЭИ. — 1994. — № 2. — С. 68-73.
Топорков В. В. Реализуемость потоковых моделей распределенных программ // Программирование. — 2001. — № 5. — С. 18-25.
Топорков В. В. Совместное планирование и назначение процессов как метод оптимизации архитектурных решений вычислительных систем // Автоматика и телемеханика. — 2001. — № 12. — С. 107-116.
Топорков В. В. Генерация архитектурных решений вычислительных систем на основе масштабирования операций / / Автоматика и вычислительная техника. — 2001. -№6. - С. 42-51.
Топорков В. В. Функциональность недетерминированной модели распределенных вычислений // Информационные технологии. — 2001. — Ж 12. — С. 2-5.
Топорков В. В. Проблема разрешимости тупиков в недетерминированной модели распределенных вычислений // Информационные технологии. — 2002. -№L- С. 2-5.
Топорков В. В. Об оптимальном доопределении разбиений конечных множеств в проектировании дискретных систем // Информационные технологии. — 2002. — № 6. — С. 2-5.
Топорков В. В., Топоркова А. С. Оптимизация характеристик вычислительных процессов в масштабируемых ресурсах / / Автоматика и телемеханика. — 2002. — № 7. — С. 149-157.
Топорков В. В., Топоркова А. С.^ Богданов Д. В. Прямые измерения времени выполнения программ на RISC-процессорах // Информационные технологии. — 2002. — № 10. — С. 2-8.
Топорков В. В. Рекуррентные схемы синтеза проектных решений // Известия РАН. Теория и системы управления. — 2003. — Ж 2. — С. 134™ 140.
Топорков В. В. Разрешение коллизий параллельных процессов в масштабируемых вычислительных системах // Автоматика и телемеханика. — 2003.-Ж 5.-С. 180-189.
Топорков В. В. Проблема разрешимости задачи анализа потоковых моделей программ // Программирование. — 2003. — Ж 3. — С. 3-14.
Филд А., Харрисон П. Функциональное программирование. — М.: Мир, 1993.638 с.
Фостер Я., Кесселъман К., Тьюке С. Grid-службы для интеграции распределенных систем // Открытые системы. — 2003. — Ж 1. — С. 20-26.
Ху Т. С. Параллельное упорядочивание и проблемы линии сборки // Кибернетический сборник. Новая серия. Вып. 4. — М.: Мир, 1967. — С. 43-56.
Щербаков Е. С., Тихорский В. В. Влияние структурных особенностей модели процессора VLIW архитектуры на производительность моделирования // Высокопроизводительные вычислительные системы и микропроцессоры. Вып. 3. — М.: ИМВС РАН, 2002. — С. 96-105.
Элементы параллельного программирования / В. А. Вальковский, В. Е. Котов, А. Г. Марчук, Н.Н. Миренков; Под ред. В.Е. Котова. — М.: Радио и связь, 1983. — 240 с.
Юдин Д. Б. Вычислительные методы теории принятия решений. — М.: Наука, 1980. — 320 с.
Юи^енко Н. В. Оценка времени выполнения программ статико-динамическим методом // Программные системы и инструменты. Вып. 2 / Под ред. Л. Н. Королева. — М.: Изд-во МГУ. — 2001. — С. 157-167.
Adve 8. К, Gharachorloo К. Shared memory consistency models: a tutorial // IEEE Computer Magazine. — 1996. — V. 29, Ж 12. — P. 66-76.
Adve 8. K, Pai V. 8., Ranganathan P. Recent advances in memory consistency models for hardware shared memory systems // Proc, of the IEEE. — 1999. — V. 87, Ж 3. — P. 445-455.
Aho A. K, Johnson 8. C. Optimal code generation for expression trees // Journal of the ACM. - 1976. - V. 23, Ж 3. - P. 488-501.
Ahuja 8., Carreiro Щ Gelernter D. Linda and friends // Computer. — 1986. — V. 19, Ж 8. - P. 26-34.
Apt K. R., Plotkin G. D. Countable nondeterminism and random assignment // Journal of the ACM. — 1986. — V. 33, Ж 4. — P. 724-767.
Bakhmurov A. G., Kapitonova A. P., Smeliansky R. L. DYAN A: an environment for embedded system design and analysis // Tools and Algorithms for the Construction and Analysis of Systems (TACAS’99). LNCS. — V. 1579. — 1999. - P. 390-404.
Barros E., Rosenstiel Ж., Xiong X. A method for partitioning UNITY language in hardware and software // European Design Automation Conf.: Proc. — Grenoble, France: IEEE CS Press, 1994. — P. 220-225.
Benner Th., Ernst R., Osterling A. Scalable performance scheduling for hardware-software cosynthesis // European Design Automation Conf.: Proc. — Brighton, UK: IEEE CS Press, 1995. — P. 164-169.
Berman F, Wolski R. Scheduling from the perspective of the application // Proc, of Symposium on High Performance Computing. 1996. http://grail.sdsc.edu.
Berman F. High-performance scheduling // The Grid: Blueprint for a New Computing Infrastructure / Eds I. Foster, C. Kesselman. — San Francisco: Morgan Kaufmann, 1999. — P. 279-307.
Beynon M. D., Kure T., Sussman A. et al. Optimizing execution of component-based applications using group instances // Future Generation Computer Systems. — 2002. — V. 18. — P. 435-448.
Blickle T. Theory of evolutionary algorithms and application to system synthesis // Diss. ETH No. 11894 for degree of doctor of technical sciences. Swiss Fed. Inst, of Technology. 1996. — 272 p.
Bruno J., Coffman E. G., Sethi R. Scheduling independent tasks to reduce mean finishing time // Communications of the ACM. — 1974. — V. 17, № 7. — P. 382-387.
Bruno J. L., Lassagne T. The generation of optimal code for stack machines // Journal of the ACM. - 1975. - V. 22, № 3. - P. 382-396.
Buck J. T. Scheduling dynamic dataflow graphs with bounded memory using the token flow model // Technical Report UCB/ERL 93/69, Ph.D. Dissertation, Dept, of EECS, University of California, Berkeley, CA 94720. 1993. — 177 p. http:/ptolemy.eecs.berkeley.edu/publications.
Camposano R., Saunders L. F, Tabet R. M. VHDL as input for high-level synthesis // IEEE Design & Test of Computers. — 1991. -№3. - P. 43-49.
Casanova H., Legrand A., Zagorodnov D. et al. Heuristics for scheduling parameter sweep applications in Grid environment // Proc, of the 9th Heterogeneous Computing Workshop, 2000. — P. 349-363.
Casavant T. L., Kuhl J. G. A taxonomy of scheduling in general-purpose distributed computing systems // IEEE Trans, on Software Engineering. — 1988. - V. 14, > 2. - P. 141-154.
Coffman E. G., Graham R. L. Optimal scheduling for two processor systems // Acta Informatica. - 1972. - V. 1, > 3. - P. 200-213.
Coffman E. G., Sethi R. Algorithms minimizing mean flow-time // Acta Informatica. — 1976. — V. 6, № 1. — P. 1-14.
Crovella M. E. Performance evaluation with heavy tailed distributions // Lecture Notes in Computer Science. — 2000. — V. 1786. — P. 1-9.
De Turek E, Vanhastel S., Volckaert B. et al. A generic middleware-based platform for scalable cluster computing // Future Generation Computer Systems. - 2002. - V. 18. - P. 549-560.
DeMicheli G., Gupta R. K. Hardware/software co-design // Proc, of the IEEE. - 1997. - V. 86, № 3. - P. 349-365.
Dennis J. В. First version of a data-flow procedure language // Proc, of the Colloque stir la Programmation. LNCS. — Berlin: Springer, 1974. — V. 19. — P. 362-376.
Dijkstra E. W. Hierarchical ordering of sequential processes // Acta Informat™ ica.1971.V. 1, № 2. - P. 115-138.
Efe K. Heuristic models of task assignment scheduling in distributed systems // Computer. — 1982. — V. 15, № 6. — P. 50-56.
Foster L, Kesselman C., Tuecke S. The anatomy of the Grid: enabling scalable virtual organizations // Int. Journal of High Performance Computing Appli™ cations. - 2001. - V. 15, № 3. - P. 200-222.
Gao G. R., Sreedhar V. C., Lee Y.-F. A new framework for exhaustive and incremental data flow analysis using DJ graphs // ACM SIGPLAN’96 Conf, on Programming Language Design and Implementation (PLDI). June 1996. — P. 272-290.
Gao G. R., Sarkar V. On the importance of an and-to-end view of memory consistency in future computer systems / / Proc, of the Int. Symposium on High Performance Computing, Fukuoka, Japan, 1997. — P. 30-41.
Gao G. R., Sarkar V. Location consistency — a new memory model and cache consistency protocol // CAPSL Technical Memo 16, Dept, of Electrical and Computer Engineering, University of Delaware, Newark, Delaware. February 1998. — 35 p. ftp:/ftp.capsl.udel.edu/pub/doc/memos.
Garey M. R., Johnson D. S. Complexity results for multiprocessor scheduling under resource constraints // SIAM Journal on Computing. — 1975. — V. 4, >4. -P. 397-411.
Gharachorloo K, Lenoski D., Laudon J. et al. Memory consistency and event ordering in scalable shared-memory mutliprocessors // Proc, of the ISCA-17, Seattle, Washington. May 1990. — P. 15-26.
Gibbons R. A historical application profiler for use by parallel schedulers // Lecture Notes on Computer Science. — 1997. — V. 1297. — P. 58-75.
Gine F, Solsona F, Hernandez P. et al. Coscheduling under memory constraints in a NOW environment // Lecture Notes in Computer Science. — 2001. - V. 2221. - P. 41-65.
Graham S. L., Kessler P. B., McKusick M. K. gprof: a call graph execution profiler // ACM SIGPLAN’82 Symposium on Compiler Construction: Proc. — 1982. - > 17. - P. 120-126.
Hansen P. B. Model programs for computational science: a programming methodology for multicomputers //Concurrency: Practice and Experience. — 1993. - V. 5. - P. 407-423.
Hennesy J., Heinrich M., Gupta A. Cache-coherent distributed shared memory: perspectives on its development and future challengers // Proc, of the IEEE. - 1999. - V. 87, № 3. - P. 418-429.
High performance cluster computing / Ed. R. Buyya. V. 1. Architectures and systems. V. 2. Programming and applications. — New Jersey: Prentice Hall PTR, 1999.
Hill M. D. Multiprocessors should support simple memory-consistency models // Computer. — 1994. — № 31. — P. 28-34.
Hoare C.A.R. Communicating sequential processes // Communications of the ACM. 1978. - V. 21, № 8. - P. 666-677.
Horn W. A. Single-machine job sequencing with treelike precedence ordering and linear delay penalties // SIAM Journal on Applied Mathematics. —1972. — V. 23, № 2.P. 189-202.
Horn W. A. Minimizing average flow time with parallel machines // Operations Research. — 1973. — V. 21, № 3. — P. 846-847.
Ignatushchenko V. V. A principle of dynamic control of parallel computing processes on the basis of static forecasting // The 10th Int. Conf, on Parallel and Distributed Computer Systems. — New Orleans, USA, 1997. — P. 593-597.
Intel Itanium Architerture Software Developer’s Manual. V. 3: Instruction Set Reference. Revision 2.1. October 2002.958 p.
http: / / www. intel. com / design / itanium /.
Jackson D., Snell Q., Clement M. Core algorithms of the Maui scheduler // Lecture Notes in Computer Science. — 2001. — V. 2221. — P. 87-102.
Jones J. P., Brickell C. Second evaluation of job queuing / Scheduling Software: Phase 1 Report // NAS Technical Report NAS-97-013. — 1997. — 34 p. http://www.nas.nasa.qov/pubs/.
Kahn G. The semantics of a simple language for parallel programming // Information Processing 74. N.-H. Publishing Company. — 1974. — P. 471-475.
Kam J. B., Ullman J. D. Global flow analysis and iterative algorithms // Journal of the ACM. - 1976. - V. 13, № 1. - P. 158-171.
Kam J. B., Ullman J. D. Monotone data flow analysis frameworks // Acta Informatica. — 1977. - № 3. - P. 305-318.
Keller R. M. A fundamental theorem of asynchronous parallel computation // Proc, of the Sagamore Comput. Conf. Parallel Process. Lecture Notes on Computer Science. V. 24. — Berlin: Springer-Verlag, 1975. — P. 102-112.
Kildall G.A. A unifed approach to global program optimization // Conf. Records of the First ACM Symposium on Principles of Programming Languages. — Boston, MA, 1973. — P. 194-206.
Kleinrock L., Nilson A. On optimal scheduling algorithms for time-shared systems // Journal of the ACM. — 1981. — V. 28, № 3. — P. 477-486.
Kwok Y., Ahmad I. Parallel program scheduling techniques // High Performance Cluster Computing. V. 1 / Ed. R. Buyya. — New Jersey: Prentice Hall PTR, 1999. - P. 553-578.
Lamport L. Time, clocks, and ordering events in a distributed system // Communications of the ACM. — 1978. — V. 21, № 7. — P. 558-565.
Lamport L. How to make a multiprocessor computer that correctly executes multiprocess programs // IEEE Trans, on Computers. — 1979. — V. 28, № 9. — P. 690-691.
Lee E. A., Messerschmitt D.G. Synchronous data flow // Proc, of the IEEE. - 1987. - V. 75. - P. 1235-1245.
Lee E. A., Parks T. M. Dataflow process networks // Proc, of the IEEE. — 1995. -V. 83. -P. 773-801.
Lee Е. A., Sangiovanni- Vincentelli A. A framework for comparing models of computations // IEEE Trans, on CAD of Integrated Circuits and Systems. — 1998.V. 17, > 12.P. 1217-1229.
Lee E. A. What’s ahead for embedded software? // IEEE Computer. — 2000. - № 9. - P. 18-26.
Lee E. A. Embedded software // Advances in Computers. V. 56 / Ed. M. Zelkowitz. — London: Academic Press, 2002. — 33 p. http://ptolemy. eecs.berkeley.edu / publications / papers/02/embsoft.
Lenoski D., Laudon J., Joe T. et al. The DASH prototype: implementation and performance // Proc, of the ISCA-19, Gold Coast, Australia. May 1992. — P. 92-103.
Linpack. Translated to C by B. Toy on 5/88, modified on 2/25/94 // Netlib Repository at UTK and ORNL. http://www.netlib.org.
Linux Red Hat Russian 5.2. Kernel 2.4.0. http://www.linux.org.ru.
Liu G. L., Layland J. W. Scheduling algorithms for multiprogramming in a hard real-time environment // Journal of the ACM. — 1973. — V. 20, № 1. — P. 46-61.
Marlowe T. J., Ryder B. G. Properties of data flow frameworks: a unifed model // Acta Informatica. — 1990. — V. 28. — P. 121-163.
Masticola S. P., Marlowe T. J., Ryder B. G. Lattice frameworks for multisource and bidirectional data flow problems // ACM TOPLAS. — 1995. - V. 17, № 5. - P. 777-803.
McNaughton R. Scheduling with deadlines and loss functions // Management Science. — 1959. — V. 6, № 1. — P. 1-12.
Milner R. A theory of type polymorphism in programming // J. of Computer and System Sciences. — 1978. — V. 17. — P. 348-375.
Mosberger D. Memory consistency models // Operating Systems Reveiw. — 1993. - V. 27, № 1. - P. 18-26.
Mosberger D. Linux/Alpha or how to make your applications fly // Proc, of the Linux Expo’97, Raleigh, N.C. March 1997. — 19 p. http://www.mostang.com.
Najjar Ж. A., Lee E. A., Gao G. R. Advances in the dataflow computational model // Parallel Computing. — 1999. — V. 25. — P. 1907-1929.
Noe J., Nutt G. I. Macro E-nets for representation of parallel systems // IEEE Trans, on Computers. - 1973. - V. C. 22, № 8. - P. 718-727.
Park L-Ch.^ Kyung Ch.-M. FAMOS: an efficient scheduling algorithm for high-level synthesis // IEEE Trans, on CAD of Integrated Circuits and Systems. - 1993. - V. 12, № 10. - P. 1437-1448.
Paxson K, Floyd S. Wide-area traffic: the failure of Poisson modeling // IEEE / ACM Trans, on Networking. — 1995. - № 6. - P. 226-244.
Pfister G. Sizing up parallel architectures // DataBase Programming & Design OnLine. May 1998. http://www.dbpd.com/vault/9805feat.htm.
Ranganathan K., Foster I. Decoupling computation and data scheduling in distributed data-intensive applications // The 11th IEEE Int. Symposium on
High Performance Distributed Computing: Proc. Edinburgh, Scotland. 2002. http: / / www.globus.org/research / papers/.
Shao G., Wolski R., Berman F. Performance effects of scheduling strategies for master/slave distributed applications // UCSD CSE Technical Report № CS98-598. University of California, San Diego. 1998. — 13 p. http: / / www-cse.ucsd.edu/groups/hpcl / apples / apples.html.
Skjellum A., Dimitrov R., Lifka D. et al. Systems administration // Cluster Computing White Paper // Ed. M. Baker. — University of Portsmouth, UK, 2000. — P. 56-76. http://parallel.ru/ftp/computers/beowulf/.
Smith Ж., Foster I., Taylor V. Predicting application run times using historical information // Lecture Notes on Computer Science. — 1998. — V. 1459.P. 122-142.
Smith Ж., Foster I., Taylor V. Scheduling with advanced reservations // Proc, of the Int. Conf, on Parallel and Distributed Systems. — 2000. http: / / www.globus.org/research / papers.
Smith Ж., Wong P. Resource selection using execution and queue wait time predictions // NAS Technical Report. NAS-02-003. 2002. — 7 p. http://www.nas.nasa.gov/.
Sreedhar V. G., Gao G. R. An elimination-based approach to incremental data flow analysis // ACAPS Technical Memo 94, School of Computer Science, McGill University. 1995. — 35 p. http://www.acaps.cs.mcgill.ca/.
Srivastava M. B., Brodersen R. W. SIERA: a unifed framework for rapid-prototyping of system-level hardware and software // IEEE Trans, on CAD of Integrated Circuits and Systems. — 1995. — V. 14, № 6. — P. 576693.
Stankovic J. A., Sidhu I. S. An adaptive bidding algorithm for processes, clusters and distributed groups // The 4th Int. Conf, on Distributed Computing Systems: Proc, 1984. — P. 49-59.
Suh G. E., Rudolph L., Devadas S. Effects of memory performance on parallel job scheduling // Lecture Notes in Computer Science. — 2001. — V. 2221. — P. 116-132.
Toporkov V. V. Hardware-software cosynthesis by metaoperator net // Proc, of the VHDL-forum for CAD in Europe at the EURO-DAC’94, Grenoble, France, 1994. - P. 17-27.
Toporkov V. V. An adaptive strategy in hardware-software codesign for real-time embedded systems // Workshop on Design Methodologies for Microelectronics with Special Day on Co-operation and Vienna Industrial Day: Proc. — Institute of Computer Systems, Slovak Academy of Sciences. 1995. - P. 187-194.
Toporkov V. V. Performance-complexity analysis in hardware-software codesign for real-time systems // European Design Automation Conf.: Proc. — Brighton, UK: IEEE CS Press, 1995. — P. 340-345.
Toporkov V. V. The MPEI approach to heterogeneous system design: co-operation and technology transfer opportunities // Special Day on pan-European Co-operation and Technology Transfer: Proc. — Zakopane, Poland, IEEE CS Press, 1996. — P. 117-124.
Toporkov V. V. Dataflow-dominated system-level functional partitioning // 42nd International Scientific Colloquium. V. 1. Ilmenau, Germany, 1997. — P. 486-491.
Ullman J. D. Polynomial complete scheduling problems // Operating Systems Review. — 1973. — V. 7, № 4. — P. 96-101.
Vahid F, Gajski D.D. Closeness metrics for system-level functional partitioning // European Design Automation Conf.: Proc. — Brighton, UK: IEEE CS Press, 1995. - P. 328-333.
Woo N. S., Dunlop A. E., Wolf W. Codesign from cospecification // IEEE Computer. — 1994. — № 1. — P. 42-47.
Yoo A. B., Jette M. An efficient and scalable coscheduling technique for large symmetric multiprocessor clusters // Lecture Notes in Computer Science. — 2001. - V. 2221. - P. 21-40.
Zhang Y.^ Franke H., Moreira J. E. et al. An integrated approach to parallel scheduling using gang-scheduling, backfilling, and migration // Lecture Notes in Computer Science. — 2001. — V. 2221. — P. 133-158.
Zhou В. B., Brent R. P. On the development of an efficient coscheduling system // Lecture Notes in Computer Science. — 2001. — V. 2221. — P. 103-115.
предметный указатель
Актор 23, 85
Алгебра событий 75
Алгоритмы планирования:
— адаптивные 47
— балансировка нагрузки 42, 48
— бэкфилинг 51
— вероятностные 50
— динамическое назначение 50
— миграция 42, 50
— неадаптивные 48
однократное назначение 50
предложение цены (bidding) 49
связанного (gang-scheduling) 50
трассировка лучей 48, 262
Анализ программ на графах:
инкрементальный (incremental) 104
интерпретация схемы ПАСС 125
исключение переменных 101
исчерпывающий (exhaustive) 102
^-кратное окружение 105
последовательный анализ
свойств сети (ПАСС) 111
проблема разрешимости 128
решение задачи ПАСС 126, 129
— стандартное окружение 99
— схема ПАСС 125
Анализ программ статико-динамический 134
Архитектура команд:
— CISC-процессора 137
IA-32 138
- IA-64 139
— RISC-процессора 137
— Version 9 SPARC 138
— VLIW-процессора 137
Архитектура целевая:
— архитектурный признак 172
— критерий существования 198
— локализация области поиска 175
— описание 172
— основные этапы синтеза 186
— разбиение спецификации начальное 190
— разбиение спецификации с доопределением 202
— синтез и генетические алгоритмы 182
— частичное описание 172, 188
Барьер 28, 29
Блокировка вычислений:
дедлок (тупик) 25, 26, 83
ливлок (голодание) 83
представление М-сетью 94, 120
представление SDF-графом 85
проблема разрешимости 196
Буфер:
быстрого преобразования адреса (TLB) 163
— глубина 69, 89, 94
— ширина 69, 89, 94
FIFO 23, 89
Взаимодействие процессов:
— механизм 22, 61
— событийное описание 67
— среда 23, 61
Вычислительные системы:
- МВС-1000М 13
Alpha Server8xxx 20
Cray С90 18
Cray SuperServer6400 14
Cray SV1 12
- Cray T3D/3E 6, 16, 21, 44
Cray Y-MP 173^
-DDM 19
— DEC TruCluster 20
HP SPP1600 20
HP SuperDome 16
- KSR 19
NUMA-Q 16
Onyx2 7, 17
Origin 2000/3x00 7, 18, 21, 51
SP6, 12, 21,51
SUN S3.mp 19
SUN Ultra Enterprise6000 14
Гамак 120
Гомоморфизм:
динамический (подобие поведений программ) 77
маркированных графов 107
Графы:
информационно-логический 87
— маркированный потоковый 86
— потоковый 102
— равносильные маркированные 107
Дедлок в коммуникационной сети 83
Директивы ОрепМР 28, 33, 61, 79, 80
Длина истории 76, 78
Измерение времени выполнения
программ:
— методика 151
— побочные эффекты 162
Именованная система переходов
73
Инвариант поведения программ
77
История программы:
— операционная 64
— реализации 64
История процесса:
— операционная 65
— информационная 65
Канал:
— обмена данными 232
— передачи сообщений 23
Классификация:
— Фенга 173
— Флинна MIMD 7, 173
— Флинна MISD 7, 173
— Флинна SIMD 7, 173
— Флинна SISD 173
— Хендлера 173
Кластер 13
Кластер рабочих станций (COW) 44
Когерентность кэш-памяти 15, 31 Код:
— ассемблера 134, 136
— модельный 137
— на языке высокого уровня 134, 135
Команда:
— чтения содержимого контрольного счетчика (RDPMC) 148
— чтения содержимого счетчика временных меток (RDTSC) 159
— чтения счетчика процессорных циклов (грсс) 150
Коммуникатор MPI 25, 62 Коммуникационная среда:
Memory Channel 9, 229
Myrinet 229, 233
- SCI 7, 9, 229
Коммутация:
— каналов 83
— пакетов 83
Композиция процессов:
— в «едином времени» 67, 68
— событийная 66
Контекст 163, 164
Контрольные точки 43
Конфлюэнтность вычислений:
— глобальная 74
— локальная 74
Критерий:
— аддитивно-сепарабельный 239
— стационарности разметки 112
— существования целевой
— архитектуры 198
Критический интервал 28, 32, 105
Кэш-память 15, 19
Ловушка (trap) 163
Массово-параллельные системы (МРР) 20
Масштаб операций 237
Масштабирование:
компоненты моделей 232
— метафора 229
метод критических работ 239
погрешность планирования 258
разрешение коллизий процессов 250
Масштабируемость 6
Менеджер ресурсов 41
Метакомпьютинг 9, 40
Метаоператор М-сети 87
Миграция работ 42
Модель:
— вычислений 8
общей памяти 27
обмена сообщениями 21
Г. Кана 23
потоковая распределенной программы 82
— прямого доступа к удаленной памяти (RDMA) 33
Р. Милнера (CCS) 22
Ч. Хоара (CSP) 22
SDF 24
Модель (система) программирования:
DVM 39
- HPF 39
— Linda 27, 38
— mpC 80, 231, 235
- MPI 8, 25, 38, 62, 63
OpenMP 8, 28, 60, 78
PUL 40
PYM 8, 38
— Т-система 38
Мультикомпьютер 12
Наименьшая неподвижная точка
80, 126, 127
Нить 21, 28, 33, 60
Однозначность результата вычислений 73
Операции кода программы:
— неотображаемые 140
— отображаемые 140
Операционная модель 281
Операционная система:
— Digital UNIX 150
HP-UX 51
- LINUX 150, 164, 167
- MS DOS 165
— Solaris 159
- UNIX 23, 27, 137, 164
— Windows 137
Windows NT 23, 164 Отношение:
передачи информации 66
— передачи управления 66
— переходов 66
Очередь работ:
— исполнительная 43
— маршрутизирующая 43
Парадигма программирования:
— конвейеризация данных 36
— одна программа - множественные данные (SPMD) 35, 48
«разделяй и властвуй» 36
распределение задачи (task farming, или master/slave) 34,48
спекулятивный параллелизм 36 Передача сообщений:
— асинхронная 23
асинхронно/синхронная 23
синхронная 23
Планирование:
вычислений в среде Grid 53
классификация задач 46
на уровне приложений (AppLeS) 53, 54
— работ 42
— типы алгоритмов 47 Планировщик:
— внешний 54
— данных 54
— локальный 54
— системы управления ресурсами 41
— Maui 42, 51, 54, 214
Поведение процессов 61
Погрешность:
— оценки модельного кода 141
— планирования 257
— прямых измерений времени выполнения программ 167
Порождение процессов:
— динамическое 60
— статическое 60
Прерывание системное 163
Протокол:
— наблюдения 15
— справочника 16
- LDAP 45
Профиль программы 135
Процесс:
— детерминированный 69
— как множество событий 64
— недетерминированный 70
— непрерывный 80
— однозначный 70
Процессор:
с полным набором команд (CISC) 137
с сокращенным набором команд (RISC) 137
— со сверхдлинным командным словом (VLIW) 137
— Alpha 149
— Itanium 139
— Pentium 148
- UltraSPARC II 138
Разметка:
— графа программы 99
— М-сетей 113
— правила 111
— неизбыточная 107, 111
— стационарная 100, 111
Расписания:
— модели составления 218
— со свободными параметрами 224
— с преобразованным графом программы 226
Распределения с «тяжелыми хвостами» 58
Распределенные вычисления:
— блокировки 60
— недетерминизм 59
— однозначность результата 59
Распределенные среды:
— глобальная Grid 40, 44
— локальные 40
— управление ресурсами 41, 45
Режимы обмена сообщениями:
блокирующий 22
неблокирующий 22
Семантика:
денотационная 70, 81
модели обмена сообщениями 75
операционная 71, 75
Семафоры 83, 105
Сеть:
метаоператорная (М-сеть) 87
— процессов с очередями 88
— L-уровневая 108
Сеть рабочих станций (NOW) 58
Симметричный мультипроцессор
(SMP, UMA) 14
Система с распределенной разделяемой памятью (DSM):
— ccNUMA 16
СОМА 19
NUMA 16
NUMAflex 18
™ RM 20
S2MP 17
Система управления ресурсами:
CODINE 43
Condor 44, 215
DQS 43, 215
^LL 43
- LSF 44
— NQE 44
PBS 44, 215
Сложность:
— кода 140
кода минимальная 141
кода оптимальная 142
Службы Grid:
архитектура OGSA 44, 45
инструментарий Globus Toolkit 45
инфраструктуры безопасности (GSI) 45
метадиспетчер 46
— распределения и управления ресурсами (GRAM) 45
— сбора метаданных (GIS) 45
MDS 45
Событие:
— заключительное 69
— как пара «тег, состояние» 64
— начальное 69
— особое 69
Согласованность памяти:
— конвейеризованной (PRAM) 31
— кэш-памяти 31
— по входу 33
— последовательная 30
— причинная 30
— процессорная 32
— свободная 32, 69
— слабая 32
— строгая 29
Сообщение 69, 86
Спецификация программы 171
Стратегия:
задача выбора 284
задача порождения 268
— обработки 284
— оптимальная 269
— планирования и распределения ресурсов 55, 216, 262
— прогнозирования времени выполнения программ 266
распределения вычислений и данных 264
резервирования ресурсов 267
— условно оптимальная 270
Схема выбора стратегии обработки:
— базовая 284
— итеративно-рекуррентная 292
— обобщенная 292
— параллельно-рекуррентная 292
Счетчик:
— временных меток (TSC) 147
— контрольный 148
— частотный 134
Теорема:
— Клини о рекурсии 80, 126
— Тьюринга 128
Тест М-сети 87
Тест Linpack 164
Токен 23, 69
Транзитивность:
— отношения переходов 66
— переходов взаимная 71
Удаленный вызов процедуры (RPC) 22
Узел процессорный 16-20
Уравнение:
— баланса 24
— потоковое 100
функциональное 123-125
Уровень привилегий (CPL) 148
Фрагментация:
исходного кода 151
спецификации программы 186
Функции:
приведения свойств вершин 110
разметки дуг 110
MPI 25, 26, 62, 63
Эквивалентное преобразование М-сети:
раскрытие цикла 109
репликация входов гамака 121
Явный параллелизм в обработке команд (EPIC) 139
Язык спецификации ресурсов (RSL)45
AppLeS, application level scheduling 10, 54, 262
ccNUMA, cache coherent NUMA 16
CCS, calculus of communicating systems 22
CISC, complete instruction set computer 137
CMS, cluster management software 40
CODINE, computing in distributed networked environments 43
COMA, cache only memory architecture 19
CORBA, common object request broker 22,26
COW, cluster of workstations 44
CLP, current privilege level 148
CSP, communicating sequential processes 22
DCOM, distributed component object model 22, 26
DIMM, dual inline memory module
164
DQS, distributed queueing system 43
DSM, distributed shared memory 6
DVM, distributed virtual machine (memory) 39
EPIC, explicitly parallel instruction computing 139
ERC, eager release consistency 32
FCFS, first come first serve 43
FIFO, first in first out 23
CIS, Grid information service 45
GRAM, Grid resource allocation and management 45
GSI, Grid security infrastructure 45
HPF, high performance Fortran 39
J MS, job management system 40
LAN, local area network 13
LDAP, light directory access protocol 45
LL, load leveler 43
LRC, lazy release consistence 32
LSF, load sharing facility 44
LWF, least work first 43
MDS, metacomputing directory service 45
MIMD, multiple instruction multiple data 7
MISD, multiple instruction single data 7
MMX — multimedia extensions 164
MPI, message passing interface 8
MPP, massively parallel processing
6
MSIMD, multiple SIMD 7, 173
NOW, network of workstations 58
NQE, net queueing environment 44
NUMA, non-uniform memory access 16
OGSA, open Grid services architecture 45
PBS, portable batch system 44
PRAM, pipelined random access memory 31
PVM, parallel virtual machine 8
RDMA, remote direct memory access 21, 33
RDPMC, read performance-monitoring counters 148
RDTSC, read time-stamp counter 159
RISC, reduced instruction set computer 137
RM, reflective memory 20
RMS, resource management system
40
RPC, remote procedure call 22 rpcc, read processor cycle count 150
RSL, resource specification language 45
S2MP, scalable shared memory multiprocessing 17
SCI, scalable coherent interface 7
SDF, synchronous data flow 24
SGA, simple genetic algorithm 183
SIMD, single instruction multiple data 7, 173
SMP, symmetrical multiprocessing 6, 14
SPMD, single-program multipledata 35
TLB, translation lookaside buffer 163
TSC, time stamp-counter 147
UMA, uniform memory access 14
VLIW, very long instruction word
137
WAN, wide area network 13
¥.¥. TOPORKO¥
MODELS OF DISTRIBUTED COMPUTATIONS
FIZM AT LIT
Moscow, 2004, 320 pages
About the author
¥ictor ¥. Toporkov is a well-known researcher in the field of distributed computer systems and information control complexes, Professor, Doctor of Technical Sciences. At present he is a Head of Computer Science Department at Moscow Power Engineering Institute (Technical University). His biography is included in Marquis “Who’s Who”, USA and “2000 Outstanding Scientists of the 21st Century”, IBC, Cambridge, England. Main research interests focus on architectural solutions of computer systems, analysis problems for models of distributed programs and scheduling of computational processes.
Summary
The monograph is devoted to distributed computations in scalable resources such as multicomputers, clusters, symmetrical multiprocessors, distributed shared memory and metacomputing systems. Developers of distributed software for scalable systems must contend with tasks not encountered during sequential and parallel programming: non-determinism and one-valued result of computing problems, communication, data/processing partitioning and distribution, process interlocks, shared memory, heterogeneity and resource management. Those are really new challenges. The discussion is primarily concerned with diverse forms of the message passing model and its fulfilment by scalable architectures including computers with shared memory. Some aspects of semantics, the one™valued computing result problem and interlock situations for distributed computations are investigated. The author considers methods for analyzing dataflow graphs of programs and studies algorithmic decidability of the dataflow analysis problem. Principles proposed for program run-time prognostication are important for process scheduling and program structure confirming to some target architecture. Approaches to computational processes scheduling in scalable systems are suggested and validated.
This book is primarily written for the researchers and postgraduates interested in the area of parallel and distributed computer systems, programming and computer software. However, it may be useful for the students and practitioners in industry.
CONTENTS
Preface
PART I
MODELS OF COMPUTATIONS
Particularity of Computing in Scalable Systems
. Scalable Parallel Computer Architectures
Key Characteristics and Types. 1.1.2. Multicomputers.
Clusters. 1.1.4. Symmetric Multiprocessors. 1.1.5. Distributed Shared Memory Systems. 1.1.6. Massively Parallel Processors.
1.2. Computation and Communication in Scalable Systems
Message Passing Model. 1.2.2. Shared Memory Model.
Remote Direct Memory Access. 1.2.4. Programming Paradigms.
Programming Models.
1.3. Resource Management in Distributed Environments
Resource Management Systems and Services. 1.3.2. Scheduling Algorithms: Taxonomy and Types. 1.3.3. Resource Allocation and Scheduling in Grid.
. Commentary and Bibliographic Review for Chapter 1
Scalable Computer Systems. 1.4.2. Models of Computing and Programming Models. 1.4.3. Resource Management and Scheduling of Distributed Computations.
Eventual and Dataflow Forms of the Message Passing Model
. Processes, Events, Messages
Taxonomy of Communicating Processes. 2.1.2. Eventual Representation of Communicating Processes. 2.1.3. Asynchronous Message Passing and Attending Challenges.
2.2. One-valued Result Problem and Semantics of Computations in the Message Passing Model
Enough Condition for One-Valued Computing Result. 2.2.2. Operational Semantics of Computations. 2.2.3. Invariants of Program Behavior. 2.2.4. Concordance of Operational and Denotational Semantics of Computations.
2.3. Dataflow Models of Distributed Computations
Dataflow Models and the Interlock Problem in Computations. 2.3.2. Marked Dataflow Graphs. 2.3.3. Interdependence of Non-determinism and Interlock Situations in Computing.
. Commentary and Bibliographic Review for Chapter 2
Searching and Preventing of Interlock Situations for Distributed Computations
. Marking of M-nets and Analyzing Dataflow Models
Dataflow Analysis of Programs Using Marked Graphs.
Methods of Dataflow Analysis. 3.1.3. Statement of the M-net Marking Problem. 3.1.4. Stability and Irredundancy of Marking.
. Examples of M-nets Marking
Marking of Elementary Fragments. 3.2.2. Marking of Parallel Threads. 3.2.3. Alternative Marking. 3.2.4. Inaccessibility of Stable Marking.
3.3. Decidability of the Analysis Problem for Dataflow Models of Distributed Programs
Formalization of the Analysis Scheme. 3.3.2. Interpretation of the Analysis Scheme. 3.3.3. Solution of the SANP (Sequential Analysis of Net Properties) Task. 3.3.4. Decidability of the Analysis Problem.
3.4. Commentary and Bibliographic Review for Chapter 3
Program Run-Time Prognostication
Static and Dynamic Analysis of Programs
Levels and Stages of Analysis. 4.1.2. Error Estimation for Modeling Code. 4.1.3. Influence of a Target Architecture upon Estimations of Code Complexity.
Direct Investigation of Program Run-Time
Tools of Investigations. 4.2.2. Partitioning of Source Program Code. 4.2.3. Experimental Studies of Partitioned Programs.
Side Effects in Experimental Studies of Programs
Influence of the Operating System and the Processor Architecture. 4.3.2. Examples of Program Complexity Studies. 4.3.3. Error of Direct Inrestigation.
Commentary and Bibliographic Review for Chapter 4
PART II
MODELS OF RESOURCE MANAGEMENT
Choice of a Target Architecture
. Program Mapping onto Resources
Program Specification and Its Representation by a Target Architecture. 5.1.2. Localization of Search Space under Choice of a Target Architecture. 5.1.3. Architecture Synthesis and Genetic Algorithms.
Basic Stages of Target Architecture Synthesis.
. Criterion of the Target Architecture Existence
Scheme for Searching of the Partial Architecture Description.
Initial Partitioning of Specification. 5.2.3. Criterion of the Architecture Description Existence. 5.2.4. Complexity of Description Searching.
5.3. Partitioning of Program Specifications
The Refinement Problem. 5.3.2. Main Steps of the Refinement Procedure. 5.3.3. Foundation of the Optimal Refinement Procedure.
5.4. Commentary and Bibliographic Review for Chapter 5
Brief Summary of Necessary Foundations from Combinatorial and Graph Theories. 5.4.2. Methods of Target Architecture Choice.
Resource Scalability and Distribution of Computations
Models of Process Scheduling and Mapping onto Resources
Particularity of Resource Allocation in Scalable Systems.
Components of Scheduling Models. 6.1.3. Scheduling Models with Arbitrary Parameters. 6.1.4. Transformation of a Graph-Based Program Model. 6.1.5. Scheduling using a Scalable Model of Computations. 6.1.6. Main Components of Models for Scaling.
Generic Scheme of Resource Scaling
Method of Critical Jobs. 6.2.2. Model Example: Minimization of the Cost of Completion of Processing.
Resolution of Parallel Processes Collisions
Statement of the Problem. 6.3.2. Conditionally Optimal and Approximate Resolution of Collisions. 6.3.3. Error of Planning.
Commentary and Bibliographic Review for Chapter 6
Models of Scheduling. 6.4.2. Scalable Models for Scheduling.
Chapter 7. Strategies of Process Scheduling and Resource Management
. Strategies of Distributed Computations
Why Scheduling Strategies Need? 7.1.2. Examples of Strategies of Distributed Computations. 7.1.3. The Problem of Strategy Generation. 7.1.4. Decomposition of the Problem of Search for an Optimal Strategy. 7.1.5. Generation of Conditionally Optimal Strategies.
. Model Examples of Optimal Computation Strategies Search
Generation of the Pareto-Optimal Strategy Using Three Criteria. 7.2.2. Strategies for Computations with Regular Structures.
7.3. Choice of the Processing Strategy
Statement of the Choice Problem. 7.3.2. Validation of the Base Scheme for Choice. 7.3.3. Examples of Choice of Processing Strategies.
Generalization of the Base Scheme of Strategy Synthesis.
7.4. Commentary and Bibliographic Review for Chapter 7
Conclusion Bibliography Index
Научное издание
ТОПОРКОВ Виктор Васильевич
МОДЕЛИ РАСПРЕДЕЛЕННЫХ ВЫЧИСЛЕНИЙ
Редактор Е.Ю. Ходан
Оригинал-макет: Е.В. Третьяков
ЛР №071930 от 06.07.99. Подписано в печать 12.07.04.
Формат 60x90/16. Бумага офсетная. Печать офсетная. Усл. печ. л. 20. Уч.-изд. л. 24,44. Тираж 1100 экз.Заказ №
Издательская фирма «Физико-математическая литература»МАИК «Наука/Интерпериодика»
117997, Москва, ул. Профсоюзная, 90
E-mail: fizmat@maik.ru, fmlsale@maik.ru
http://www.fml.ru
Отпечатано с готовых диапозитивовв ОАО «Московская типография № 6»115088, Москва, Ж-88, ул. Южнопортовая, 24
ISBN 5-9221-0495-0
УДК 681.3.06+519.68
ББК 32.973
Т58
Топорков В. В. Модели распределенных вычислений. — М.: ФИЗМАТЛИТ, 2004. - 320 с. - ISBN 5-9221-0495-0.
Монография обобщает результаты исследований в области распределенных вычислений в масштабируемых средах, к которым можно отнести мультикомпьютеры, кластеры, симметричные мультипроцессоры, системы с распределенной памятью и ресурсы метакомпьютинга. Основное внимание уделяется различным формам модели обмена сообщениями и ее реализуемости, в том числе архитектурами с общей памятью. Рассматриваются вопросы семантики, однозначности результата и блокировки вычислений. Изучаются методы анализа свойств распределенных программ на маркированных графах и исследуется проблема алгоритмической разрешимости задачи анализа. Обосновываются принципы прогнозирования времени выполнения программ и их отображения на целевую архитектуру. Предлагаются методы планирования параллельных процессов в распределенных средах на основе масштабируемых моделей обработки.
Для специалистов по распределенным и параллельным вычислениям. Может быть полезна аспирантам и студентам, обучающимся по направлениям «Информатика и вычислительная техника», «Прикладная математика и информатика».
Рецензенты:
академик РАН В. С. Бурцев, член-корреспондент РАН Л. Н. Королев
© ФИЗМАТЛИТ, 2004
ISBN 5-9221-0495-0ISBN 5-9221-0495-0© В. В. Топорков, 2004
ISBN 5-9221-0495-0
ISBN 5-9221-0495-0
ОГЛАВЛЕНИЕ
ЧАСТЬ IМОДЕЛИ ВЫЧИСЛЕНИЙ
Глава 1. Особенности обработки в системах с масштабируемой архитектурой ........................... 11 §1.1. Масштабируемые параллельные системы ............ 11 1.1.1. Общая характеристика и типы (И). 1.1.2. Мультикомпьютеры (12). 1.1.3. Кластеры (13). 1.1.4. Симметричные мультипроцессоры (14). 1.1.5. Системы с распределенной разделяемой памятью (16). 1.1.6. Массово-параллельные системы (20).
. Вычисления и обмен данными в масштабируемых системах . .21
Модель обмена сообщениями (21). 1.2.2. Модель общей памяти (27). 1.2.3. Прямой доступ к удаленной памяти (33). 1.2.4. Парадигмы программирования (34). 1.2.5. Модели программирования (37).
. Управление ресурсами в распределенных средах ........40
Системы и службы управления доступом к ресурсам (40).
Классификация задач и типы алгоритмов планирования (46). 1.3.3. Планирование вычислений в среде Grid (53).
1.4. Комментарий и краткий обзор к главе 1 ............ .56
Масштабируемые вычислительные системы (56). 1.4.2. Модели вычислений и модели программирования (56). 1.4.3. Управление ресурсами и планирование распределенных вычислений (57).
Глава 2. Событийные и потоковые модели обмена сообщениями ................................... 59 § 2.1. Процессы, события, сообщения .................. 59 2.1.1. Таксономия систем взаимодействующих процессов (59).
Событийное описание взаимодействующих процессов (63).
Асинхронный обмен сообщениями и связанные с ним проблемы (69).
Однозначность и семантика вычислений в модели обмена сообщениями ................................71
Достаточное условие однозначности результата вычислений (71). 2.2.2. Операционная семантика вычислений (75).
Инварианты в поведении программ (77). 2.2.4. Согласованность операционной и денотационной семантик вычислений (80).
Потоковые модели распределенных вычислений ........82
Потоковые модели и проблема блокировки вычислений (82). 2.3.2. Маркированные потоковые графы (86).
Связь проблем недетерминизма и блокировки вычислений (92).
Комментарий и краткий обзор к главе 2 ............ .96
Глава 3. Обнаружение и предотвращение блокировок распределенных вычислений ........................99
Разметка М-сетей и анализ реализуемости распределенных вычислений ...............................99
Анализ свойств программ на размеченных графах (99).
Методы анализа (101). 3.1.3. Постановка задачи разметки М-сетей (106). 3.1.4. Стационарность и неизбыточность разметки (111).
Примеры разметки М-сетей .................... 113
Разметка элементарных фрагментов (113). 3.2.2. Разметка параллельных ветвей (114). 3.2.3. Альтернативные разметки (116). 3.2.4. Недостижимость стационарной разметки (118).
Разрешимость задачи анализа потоковых моделей распределенных программ ............................ 122
Формализация схемы анализа (122). 3.3.2. Интерпретация схемы анализа (125). 3.3.3. Решение задачи ПАСС (126).
Проблема разрешимости задачи анализа (128).
Комментарий и краткий обзор к главе 3 ............ . 131
Глава 4. Прогнозирование времени выполнения программ . . 134
Статический и динамический анализ программ ......... 134
Уровни и этапы анализа (134). 4.1.2. Погрешность оценок модельного кода (138). 4.1.3. Влияние вида целевой архитектуры на оценки сложности кода (144).
Прямые измерения времени выполнения программ . ...... 147
Средства измерений (147). 4.2.2. Фрагментация исходного кода программы (151). 4.2.3. Эксперименты с фрагментированной программой (159).
Побочные эффекты в экспериментальных исследованиях программ ................................. 162
Влияние особенностей операционной системы и архитектуры процессора (162). 4.3.2. Примеры исследования сложности программ (163). 4.3.3. Погрешность прямых измерений (167).
Комментарий и краткий обзор к главе 4 ............ . 169
ЧАСТЬ II
МОДЕЛИ РАСПРЕДЕЛЕНИЯ РЕСУРСОВ
Глава 5. Выбор целевой архитектуры ................ 171 § 5.1. Отображение программы на ресурсы ............... 171
Спецификация программы и ее представление целевой архитектурой (171). 5.1.2. Локализация области поиска целевой архитектуры (175). 5.1.3. Синтез архитектуры и генетические алгоритмы (182). 5.1.4. Основные этапы синтеза целевой архитектуры (186).
. Критерий существования целевой архитектуры ......... 188
Схема поиска частичного описания архитектуры (188).
Начальное разбиение спецификации (190). 5.2.3. Критерий существования описания архитектуры (196). 5.2.4. Сложность поиска описания (200).
. Разбиение спецификации программы ...............
Задача доопределения (202). 5.3.2. Основные этапы доопределения (203). 5.3.3. Обоснование процедуры оптимального доопределения (205).
5.4. Комментарий и краткий обзор к главе 5 ............ .
Краткая сводка необходимых сведений по комбинаторике и теории графов (207). 5.4.2. Методы выбора целевой архитектуры (211).
Глава 6. Масштабирование ресурсов и распределение вычислений ................................... §6.1. Модели планирования и распределения вычислений ......
Особенности распределения ресурсов в масштабируемых системах (214). 6.1.2. Компоненты моделей составления расписаний (217). 6.1.3. Модели составления расписаний со свободными параметрами (224). 6.1.4. Преобразование графовой модели программы (226). 6.1.5. Планирование на основе масштабируемой модели вычислений (229). 6.1.6. Основные компоненты моделей масштабирования (232).
Общая схема масштабирования ..................
Метод критических работ (239). 6.2.2. Модельный пример: минимизация стоимости завершения обработки (243).
Разрешение коллизий параллельных процессов .........
Постановка задачи (250). 6.3.2. Условно оптимальное и приближенное разрешение коллизий (253). 6.3.3. Погрешность планирования (257).
Комментарий и краткий обзор к главе 6 ............ .
Модели составления расписаний (259). 6.4.2. Масштабируемые модели планирования вычислений (260).
Глава 7. Стратегии планирования процессов и распределения ресурсов ................................. §7.1. Стратегии распределенных вычислений .............
Зачем нужны стратегии планирования (262). 7.1.2. Примеры стратегий распределенных вычислений (264). 7.1.3. Задача порождения стратегии (268). 7.1.4. Декомпозиция задачи поиска оптимальной стратегии (270). 7.1.5. Генерация условно оптимальных стратегий (271).
Модельные примеры поиска оптимальных стратегий вычислений ...................................
Генерация Парето-оптимальной стратегии по трем критериям (273). 7.2.2. Стратегии для вычислений с регулярной структурой (278).
Выбор стратегии обработки ....................
Постановка задачи выбора (281). 7.3.2. Обоснование базовой схемы выбора стратегии (285). 7.3.3. Примеры выбора стратегий обработки (287). 7.3.4. Обобщение базовой схемы синтеза стратегий (291).
Комментарий и краткий обзор к главе 7 ............ .
Заключение .................................. Список литературы
202202207207214214239250259262262214214239250259262262273273281281294297299309294297299309Предметный указатель ...........................
202
202
207
207
214
214
239
250
259
262
262
214
214
239
250
259
262
262
273
273
281
281
294
297
299
309
294
297
299
309
ПРЕДИСЛОВИЕ
Вопросы, связанные с распределением процессов вычислений, привлекают к себе внимание уже не один десяток лет. Однако с появлением и активным использованием масштабируемых архитектур многие проблемы приходится переосмыслить и взглянуть на них по- новому. Масштабируемостъ наряду с надежностью, соотношением стоимость/производительность, совместимостью и мобильностью программного обеспечения является одним из важнейших требований к современным вычислительным системам. Она подразумевает возможность наращивания количества процессоров, объемов памяти и независимость пропускной способности коммуникационной подсистемы от числа процессорных узлов, участвующих в вычислениях.
В настоящее время вопросы масштабирования находятся в поле зрения пользователей и разработчиков как параллельных систем, так и распределенной среды метакомпьютинга. В таких системах поддержка образа общего ресурса сочетается с высокой степенью автономности процессорных узлов, не говоря уже о том, что в глобальной среде Grid на отдельных сайтах могут применяться различные локальные планировщики и отсутствует единая политика администрирования вычислительных ресурсов. Все это приводит к необходимости исследования принципов организации вычислений и распределения ресурсов, обеспечения однозначности результата выполнения распределенных программ и эффективного планирования параллельных процессов.
К параллельным масштабируемым системам можно отнести мультикомпьютеры, вычислительные кластеры, симметричные мультипроцессоры с общей памятью (SMP — symmetrical multiprocessing), системы с распределенной разделяемой памятью (DSM — distributed shared memory) и массово-параллельные системы (МРР — massively parallel processing). Подобное деление основывается на проявлении функциональных возможностей систем с точки зрения конечного пользователя и ни в коей мере не претендует на классификацию по структурно-функциональным признакам. Более того, известные МРР- архитектуры могут быть отнесены к таким разновидностям масштабируемых систем, как мультикомпьютеры (семейство SP фирмы IBM) и подклассы DSM^NUMA (суперкомпьютеры Cray T3D/3E) и ccNUMA (компьютеры компании SGI Onyx2, Origin 2000/3x00). Некоторые авторы подразделяют масштабируемые параллельные системы на МРР, SMP, ccNUMA, кластеры и распределенные системы [104].
В литературе можно найти различные подходы к построению струю турно-функциональной систематизации компьютеров. Так, на основе классификации Флинна различаются следующие параллельные архитектуры: SIMD (Single Instruction Multiple Data), MIMD (Multiple Instruction Multiple Data), MISD (Multiple Instruction Single Data) и MSIMD (Multiple SIMD). Кроме этого, особо выделяются векторные и конвейерные системы, которые часто относят к подклассам SIMD (MSIMD) или MISD. Иногда к современным MIMD-архитектурам причисляют МРР-, SMP-системы и кластеры, причем кластеры и МРР- системы в основном различаются по степени согласованности набора прикладных программ и характеристикам коммуникационных сред [26].
Нужно сказать, что систематизация Флинна, а также позднее появившиеся классификации Хокни, Фенга, Хендлера и Скилликорна [9] не делают различий в организации распределенных вычислений с учетом взаимодействия процессов. Общим свойством, обеспечивающим возможность повышения производительности масштабируемых систем, как раз и является распределенность процессов вычислений и данных. Это свойство характерно и для SMP-архитектур, если принять во внимание типичную иерархию «кэш процессора — основная память — подсистема ввода/вывода». Неудивительно, что не так давно появившиеся спецификации InfiniBand, RapidlO, развивающие идеи стандарта SCI (Scalable Coherent Interface) и спецификаций Next Generation I/O, Future I/O, основаны на моделях распределенной обработки. Выигрыш от распределения вычислений и данных определяется степенью параллелизма, организацией взаимодействия и планированием процессов.
По параллельным и распределенным системам имеется обширная библиография. Появились работы [8, 9, 26, 35, 46, 104], систематизирующие и развивающие отдельные положения в этой области х). В данной книге описываются новые результаты, полученные автором в двух основных направлениях. Одно из них — построение моделей распределенных вычислений, наиболее адекватных особенностям масштабируемых архитектур. Другое — выбор конфигурации ресурсов и планирование процессов на основе масштабируемой модели обработки с целью эффективной реализации прикладных программ.
Излагаемый в книге материал освещает вопросы, подробно не затрагиваемые в имеющихся публикациях. Еще один довод, которым
Когда работа над рукописью данной книги была практически завершена, в серии «Классика computer science» вышел фундаментальный курс Э. Таненбаума и М. ван Стеена «Распределенные системы. Принципы и парадигмы» (СПб., Питер, 2003, 880 с.) Основное внимание в этой работе уделяется вопросам создания распределенных приложений, в том числе и в среде Web: систем объектов в рамках CORBA, DCOM, Globe, файловых систем, систем документов.
руководствовался автор при определении круга рассматриваемых проблем, состоит в следующем. Часто в литературе по параллельной обработке смешиваются или отождествляются понятия моделей (технологий, систем) программирования и моделей выполнения программ, т. е. моделей вычислений. В общем случае это приводит к тому, что детальный анализ структуры алгоритма и особенностей компьютерной архитектуры, на которой он реализуется, подменяется поиском системы программирования без учета того, насколько она адекватна архитектуре и решаемой задаче.
Модель вычислений служит связующим звеном между архитектурой и моделью программирования и в распределенных системах должна отражать взаимодействие процессов. Это взаимодействие представляется явно в некоторых моделях программирования и может быть организовано с помощью стандартных коммуникационных библиотек, например, MPI (Message Passing Interface) или PVM (Parallel Virtual Machine). Другие, высокоуровневые модели освобождают программиста от выраженного управления параллельными процессами, примитивами передачи сообщений или синхронизации. Так, стандарт ОрепМР может рассматриваться как модель программирования систем с разделяемой памятью и надстройка над библиотеками нитей pthreads, организуемыми с помощью интерфейса POSIX. Модель вычислений должна помогать в поисках ответа на вопрос: насколько эффективно реализуется программа на данной архитектуре? Эффективность реализации может интерпретироваться как сбалансированность загрузки процессоров, согласованность степени параллелизма и трафика обмена данными, длительность простоя процессоров из-за отсутствия данных и т. д.
Несмотря на большое разнообразие моделей выполнения программ, в масштабируемых системах чаще всего используются раздичные формы модели обмена сообщениями и модели общей памяти (промежуточная форма — прямой доступ к удаленной памяти). Особенности моделей, однако, не предполагают их реализации на архитектурах соответствующего типа. Так, первая может быть надстроена над любой архитектурой. Вторая чаще всего применяется в SMP- и DSM- архитектурах, где программа рассматривается как система нитей, взаимодействующих через общие переменные и примитивы синхронизации. При этом программист имеет дело с привычным для него единым адресным пространством. Основная проблема — обеспечение согласованного состояния памяти. Модель обмена сообщениями позволяет избавиться от проблем разделения памяти и может быть надстроена над архитектурами с общей памятью. Реализация модели разделяемой памяти над архитектурами с передачей сообщений значительно сложнее.
В части I книги рассматриваются недетерминированные модели распределенной обработки, когда процессы взаимодействуют через асинхронный обмен сообщениями. Недетерминизм означает, что могут иметь место разные истории выполнения программ на одних и тех
же входных данных. Помимо поддержки недетерминизма, эти модели обогащаются таким свойством, как произвольная структурированность (неоднородность) сообщений. В модели общей памяти обмен осуществляется строго структурированными данными: слово, кэш-строка, страница и т. д. В неоднородных сообщениях возможно различное число компонентов (например, пакетов), а также различие компонентов по числу операндов. В частности, транзакции в SCI предусматривают передачу пакетов с блоками данных фиксированной и переменной длины. В среде Memory Channel пакеты данных могут иметь длину от 4 до 256 байтов.
Недетерминированный обмен неоднородными сообщениями адекватно представляет многие черты функционирования масштабируемых систем, такие как массовый параллелизм, взаимодействия типа «точка-точка», коммутация пакетов. Однако подобное сочетание свойств требует исследования реализуемости моделей (проблем однозначности результата и блокировки вычислений) и алгоритмической разрешимости задач их анализа.
Глава 1 носит вводный характер и посвящена особенностям функционирования масштабируемых систем, а также анализу требований к моделям вычислений и распределения ресурсов в таких системах. В главах 2 и 3 рассматриваются различные формы модели обмена сообщениями, исследуются вопросы семантики и реализуемости вычислений. Существует ряд задач, для решения которых необходима оценка времени выполнения программ или их фрагментов, например, прогнозирование динамики программ целевой архитектуры на основе моделирования в инструментальной среде, планирование и управление параллельными процессами и т. д. В главе 4 описываются методы оценивания времени реализации фрагментированных программ.
Часть II книги посвящена задачам распределения ресурсов и планирования процессов на основе масштабируемой модели обработки. В главе 5 обосновываются комбинаторные методы выбора целевой архитектуры вычислительных ресурсов по заданной спецификации (модели) прикладной программы. Эти методы могут использоваться для автоматизации отображения программ на архитектуру.
Планирование процессов в масштабируемых средах, рассматриваемое в главе 6, принципиально отличается от составления расписаний на заданной архитектуре и связано с конфигурированием ресурсов под конкретную прикладную программу до начала вычислений, например в ходе компиляции. Эта идея хорошо согласуется с парадигмой метакомпьютинга, согласно которой пользователь должен иметь полную иллюзию использования чужих ресурсов исключительно в интересах своего программного приложения. При этом, естественно, острой становится проблема эффективного использования дорогостоящих ресурсов путем обоснованного планирования вычислительных процессов. Один из возможных путей практической реализации этого подхода представлен проектом AppLeS (Application Level Scheduling) [75, 76,
83, 143]: агент-планировщик формирует и координирует выполнение расписания для повышения эффективности работы приложения с точки зрения конечного пользователя. Для «настройки» ресурсов, как правило, используются эвристические подходы, дающие весьма приближенное решение.
Иной путь — совместное планирование процессов и масштабирование ресурсов. В главе 7 эта идея развивается для порождения стратегии (множества вариантов) выполнения программы на основе совокупности критериев, включающей, например, стоимость и загрузку процессоров. Конкретный вариант плана процессов может выбираться из стратегии в зависимости от временных параметров контрольных событий, наступление которых обусловлено динамикой загрузки процессорных узлов и коммуникаций, пространственно-временной конкуренцией различных программ и т. п. Таким образом, несмотря на априорный характер формирования стратегии управление ресурсами может осуществляться динамически. В этой же главе излагается общий формализм, в рамках которого согласованно выполняются структурные преобразования и масштабирование модели вычислений.
В основном тексте книги даются ссылки на источники, в которых описаны те или иные оригинальные результаты, в конце каждой главы приводятся комментарий и краткий библиографический обзор по соответствующей тематике.
В рамках одной книги вряд ли возможно охватить все проблемы, связанные с моделями вычислений и распределения ресурсов в масштабируемых системах. Также ясно, что нельзя предложить некую универсальную модель распределенной обработки. В этом смысле представленный в книге материал, с одной стороны, дополняет публикации последних лет, посвященные параллельным вычислениям и архитектурам параллельных вычислительных систем, а с другой — позволяет обозначить недостаточно изученные области в распределенных вычислениях.