Научная статья на тему 'Графический метод проектирования и исследования свойств параллельных программ с использованием асинхронной событийной модели вычислений'

Графический метод проектирования и исследования свойств параллельных программ с использованием асинхронной событийной модели вычислений Текст научной статьи по специальности «Компьютерные и информационные науки»

CC BY
280
28
i Надоели баннеры? Вы всегда можете отключить рекламу.

Аннотация научной статьи по компьютерным и информационным наукам, автор научной работы — Востокин С. В.

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

i Надоели баннеры? Вы всегда можете отключить рекламу.
iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.

Graphical method for designing and analyzing of parallel programs with asynchronous event-based model

The method for describing parallel program design patterns, program verification, and effectiveness analysis is given. The method uses a graphical presentation of asynchronous event-based programming model. Sample design case of parallel computation of finite element method (Gauss-Seidel iterative method) is studied in detail. The sample presents an advantage of asynchronous control pattern comparing with trivial non-asynchronous control pattern. Results of computational experiments confirming with formal analysis of control patterns are given.

Текст научной работы на тему «Графический метод проектирования и исследования свойств параллельных программ с использованием асинхронной событийной модели вычислений»

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

Востокин С.В. (easts@mail.ru ) (1) (1) Самарский государственный аэрокосмический университет

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

ВВЕДЕНИЕ

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

Повышение эффективности программ, работающих на компьютерах MIMD архитектуры с распределенной памятью, часто достигается путем совмещения во времени обменов и вычислений и использования асинхронных коммуникаций [1]. При этом в инструкциях по применению библиотек распространенного стандарта MPI обычно указывается, что асинхронные коммуникации следует использовать с осторожностью. Как следствие, в практике параллельного программирования используются более надежные, но менее эффективные модели управления вычислениями, такие как последовательно-параллельное управление и синхронные вычисления [2].

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

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

В статье рассматривается графический метод проектирования и исследования свойств параллельных программ с использованием асинхронной событийной модели вычислений. Назначение этого метода — достижение цели проектирования: построение надежных и эффективных параллельных программ с асинхронным управлением. Описанный метод лежит в основе визуального языка параллельного и распределенного программирования ГРАФ ПЛЮС [3].

МЕТОД ПРЕДСТАВЛЕНИЯ ЛОГИЧЕСКОЙ МОДЕЛИ ПАРАЛЛЕЛЬНЫХ ПРОГРАММ

Предлагаемая модель вычислений относится к группе асинхронных моделей программирования с событийным управлением [4]. Модель программы представляет собой диаграмму. Все обозначения, используемые при моделировании программ, показаны на Рис.1.

Рисунок 1 — Обозначения, используемые в логической модели программ

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

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

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

При анализе свойства «живости» программ используются следующие допущения.

1) Если в некоторый момент времени произошло событие активации процедуры A, то существует некоторый поздний момент времени, в который произойдет событие завершения процедуры A.

2) Если в некоторый момент времени произошло событие завершения процедуры A (или №ое событие завершения процедуры A для вершины синхронизации), и в модели задано отношение непосредственного следования между A и B, то существует некоторый поздний момент времени, в который произойдет событие активации процедуры B. При этом начальное событие рассматривается как произошедшее событие завершения процедуры.

3) Работа любой процедуры атомарная в том смысле, что если в некоторый момент времени произошло событие активации процедуры A, то в некоторый следующий

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

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

ОПИСАНИЕ ТЕСТОВОЙ ЗАДАЧИ

Рассмотрим задачу решения систем линейных уравнений методом Гаусса-Зейделя, получающихся при дискретизации стационарного уравнения Лапласа методом конечных разностей для двумерного случая [5]. Пусть область, для которой ищется решение, имеет прямоугольную форму. Если принять в качестве условия остановки вычислительного процесса выполнение заданного числа итераций, то алгоритм решения задачи описывается следующей программой на языке Си:

#define SCAN_CUR (i*hight+j) #define SCAN_UP (i*hight+j-1) #define SCAN_DOWN (i*hight+j+1) #define SCAN_LEFT ((i-1)*hight+j) #define SCAN_RIGHT ((i+1)*hight+j)

// инициализация пропущена int i,j,t;

for(t=0;t<maxcount;t++)// число итераций до остановки for(i=1;i<width-1;i++)// цикл по ширине

for(j=1;j<hight-1;j++)// цикл по высоте {

matrix[SCAN_CUR]=0.25*(// значение в точке i j matrix[SCAN_UP]+// значение в точке i j-1 matrix[SCAN_DOWN]+// значение в точке i j+1 matrix[SCAN_LEFT]+// значение в точке i-1 j matrix[SCAN_RIGHT]// значение в точке i+1 j

) ;

}

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

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

Рисунок 2 — Пятиточечный шаблон и направление обхода матрицы

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

Рисунок 3 — Разбиение матрицы на четыре области и процедуры пересчета областей

На основе разбиения области данных, проведем декомпозицию алгоритма на процедуры. Процедура CB1 выполняет однократный пересчет всех элементов левого сегмента матрицы, используя направление обхода элементов, показанное на Рис.2, начиная с верхнего левого, заканчивая правым нижним элементом. Процедура ОЬ1 выполняет однократный пересчет левого столбца сверху вниз. Процедура ОЬ2 выполняет однократный пересчет правого столбца по направлению сверху вниз. Наконец, процедура CB2 выполняет однократный пересчет всех элементов правого сегмента матрицы аналогично процедуре CB1. Связь процедур и сегментов матрицы показана на Рис.3. Нетрудно заметить, что,

выполняя в цикле последовательность процедур CB1, ^1, ^2, CB2, получим исходный алгоритм пересчета.

Если в нашем распоряжении имеется два компьютера с распределенной памятью, то разбиение области данных будет выглядеть следующим образом. На Рис. 4 показано, что первые две области матрицы (считая слева направо) будут размещены в локальной памяти одного компьютера, а вторые две области — в памяти другого компьютера. Кроме этого, для того, чтобы шаблоны процедур и ^2 оставались внутри матриц, соответствующие области расширены так называемыми «теневыми» столбцами.

Рисунок 4 — Разбиение матрицы на непересекающиеся области памяти

Набор процедур для случая распределенной памяти расширен процедурами T1 и T2. Назначение этих процедур — управлять синхронизацией теневых столбцов со столбцами, копии значений которых они содержат. Процедура T1 выполняет копирование значений из столбца, находящегося слева, в «теневой» столбец, находящийся справа. Процедура T2 выполняет копирование значений из столбца, находящегося в области памяти справа, в «теневой» столбец, находящийся с области памяти слева. Направление копирования показано на Рис.4. Можно заметить, что аналогично случаю с общей памятью, выполняя в цикле последовательность процедур CB1, T2, CL1, T1, CL2, CB2, получим исходный алгоритм пересчета.

Передача значений между разными областями памяти организуется путем посылки сообщений. Заметим, что в случае разделяемой памяти в процессе счета также присутствуют «теневые» области и передача данных. Сам процесс реализуется не алгоритмически, а аппаратурой SMP компьютера, а роли локальных, по отношению к процессору областей памяти, выполняют кэш-памяти процессоров. Поэтому разбиение на процедуры, показанное на Рис.4, представляет собой обобщение архитектур с общей и распределенной памятью применительно к нашей задаче.

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

МОДЕЛЬ ПОСЛЕДОВАТЕЛЬНО-ПАРАЛЛЕЛЬНОГО ВЫЧИСЛИТЕЛЬНОГО ПРОЦЕССА

Модель последовательно-параллельного вычислительного процесса представлена на Рис.5. Для объяснения модели вновь обратимся к Рис. 3 и 4. Рассмотрим две соседние по времени итерации алгоритма. Можно заметить, что когда шаблон первой из итераций проходит середину области данных, шаблон следующей итерации может начинать движение в левой части области данных, не дожидаясь завершения первой итерации. Так как области данных, обрабатываемые процедурами CB1 и CB2 независимы, эти процедуры можно запускать одновременно. При этом CB2 досчитывает текущую итерацию, а CB1 начинает вычислять следующую итерацию.

Последовательно-параллельный алгоритм Рис.5 состоит из двух параллельно исполняющихся ветвей, которые запускаются событием завершения процедуры ОЬ2. Параллельные ветви содержат процедуры CB1 и CB2. Дополнительно, правая ветвь выполняет обмен ^2) и вычисляет правый столбец в разбиении данных (ОЬ1). Процедура-пустышка S2 используется для пометки вершины синхронизации. Активация ^ происходит только после каждого второго завершения S2, то есть после завершения работы двух параллельных ветвей. Процедуры ^ и ОЬ2 образуют последовательную часть алгоритма и служат для пересчета стыка областей данных. Итерации вычислительного процесса начинаются с работы только левой ветки, так как процесс еще не распространился на правую подобласть данных.

Рисунок 5 — Модель последовательно-параллельного вычислительного процесса

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

МОДЕЛЬ АСИНХРОННОГО ВЫЧИСЛИТЕЛЬНОГО ПРОЦЕССА

Модель асинхронного вычислительного процесса представлена на Рис.6. Аналогично последовательно-параллельной модели исполнения источником параллелизма является возможность одновременного вычисления двух соседних итераций алгоритма процедурами CB1 и CB2.

Рассмотрим последовательность рассуждений, на основе которых строится модель Рис.6. В начале определяем все процедуры вычислительного процесса и размещаем их на поле диаграммы. Последовательно рассматриваем все процедуры и соответствующие им события активации. Для каждого события активации на основании логики работы алгоритма находим события завершения тех процедур, которые должны являться причиной данного события активации. Если такое событие завершения одно, то строим дугу, ведущую из вершины события завершения к дуге рассматриваемого события активации. Если событий завершения несколько, то 1) строим вершину синхронизации и присваиваем ей имя; 2) соединяем вершину синхронизации дугой, ведущей к вершине рассматриваемого события активации; 3) указываем число обнаруженных событий завершения в вершине синхронизации; 4) от вершины каждого выявленного события завершения процедуры проводим дугу к вершине синхронизации. После определения всех отношений непосредственного следования между процедурами, находим начальные события активации процедур и соединяем соответствующие вершины с вершиной начального события.

Рисунок 6 — Модель асинхронного вычислительного процесса

В случае нашего алгоритма, на основании Рис. 4, порядок рассуждения может быть таким. Процедуру CB1 можно запустить сразу по завершению СЬ1. Строим дугу СЬ1—CB1. Процедуру СЬ1 можно запустить сразу по завершению CB1 и T2. Строим дополнительную вершину S 1(2) и проводим дуги CB1—S1, T2—S1, S1—CL1. Процедуру CB2 можно запустить сразу по завершению СЬ2. Строим дугу СЬ2—CB2. Процедуру CL2 можно запустить сразу по завершению CB2 и Т1. Строим дополнительную вершину S2(2) и проводим дуги CB2—S2, T1—S2, S2—СЬ2. Процедуру T1 можно запустить после СЬ1, а T2 можно запустить после СЬ2. Строим дуги СЬ1—T1 и СЬ2—T2. Завершаем построение, соединяя вершины CB1, T2 и S2 с начальной вершиной.

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

АНАЛИЗ ВЫЧИСЛИТЕЛЬНЫХ ПРОЦЕССОВ ПО ГРАФИЧЕСКИМ МОДЕЛЯМ

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

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

произошедшие в определенном интервале времени.

Утверждение 1. Для каждого события, определяемого моделью Рис.6, существует интервал времени (^Дг), в котором оно произойдет.

Утверждение 2. Для каждого события, определяемого моделью Рис.6, если существует интервал времени (^Дг), в котором оно произошло, то существует и более поздний интервал времени (^'Дг'), в котором рассматриваемое событие произойдет снова.

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

1) Сверху располагается вершина начального события.

2) Любая вершина помещается ниже вершин, являющихся причиной события активации данной вершины.

3) К уже построенным вершинам добавляется новая вершина, если сложились условия ее события активации, согласно правилам «живости» логической модели.

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

Утверждение 1 очевидно следует из выполненного построения. Каждое из показанных на Рис.6 событий может произойти хотя бы один раз.

Рассмотрим интервал времени (^Дг), определяемый событиями активация(СВ1), активация(Т2), активация(СЫ) и активация((С\2).

Пусть ^=шт(активация(СВ1),активация(Т2)) и существует событие активация(^1), возникающее после событий активация(СВ1) и активация(Т2) согласно правилам «живости».

Пусть t2=акmuвацuя(CL2), где событие активация(С^1) — первое событие активации ^2, следующее по правилам «живости» после события акmuвацuя(CL1). На Рис.7 видно,

что в данном интервале произошли события активация(СВ1), активация(Т2) и активация($2).

Рассмотрим интервал времени (^'Д2').

Пусть t1'=акmuвацuя(CL1). Пусть ^'=активация1 (CL2) (не показано на Рис.7), где событие активация1(С^2) следует по правилам «живости» после рассмотренного события активация(СС\2).

Из того что:

1) по построению интервал 0^'Д2') является более поздним, чем интервал 0^Д2);

2) события активация(СВ1), активация(Т2) и активация($2) происходят в интервале 0^Д2), а события активация.1(СВ1), активация1 (Т2) и активация 1 ($2) происходят в интервале (^'Д2');

3) любые другие события, определяемые моделью Рис.6, по правилам «живости» наступают после событий активация(СВ1), активация(Т2) и активация($2);

следует, что Утверждение 2 так же верно.

Заметим, что аналогичные рассуждения для последовательно-параллельного алгоритма можно выполнить непосредственно по Рис.5, не прибегая к дополнительным построениям.

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

Для выполнения оценки эффективности определим длительность(Х), как длительность интервала времени между соседними событиями активация(Х) и завершение(Х). Положим равными по длительности следующие интервалы времени:

Т=длительность(Т1)=длительность(Т2), CL=длumельносmь (CL1)=длumельносmь (CL2),

ВС=длительность(СВ1)=длительность(СВ2).

Положим длительность следующих интервалов времени пренебрежимо малой:

длительность($1)=длительность($2)^0.

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

По модели Рис.5, с учетом введенных обозначений, получаем величину длительности цикла равной:

Т1=Т+СЬ+шях(СВ+Т+СЬ,СВ)=2Т+2СЬ+СВ.

Анализ длительности цикла асинхронного алгоритма выполним по Рис.7. Определим длительность интервала времени между каждым вторым событием активации/завершения вершины Б2. Рассмотрим все цепочки событий, связывающих пару вершин Б2 на Рис.7. Таких цепочек две: ^2—СВ2 и СЬ2—Т2——СЬ1—Т1. Цепочка, выполняющаяся дольше, будет определять период времени между каждым вторым повторением события активации/завершения вершины Б2:

T2=mаx(CL+CB,CL+T+CL+T)=CL+mаx(CB,2T+CL).

Следует заметить, что вторая цепочка проходит через вершину синхронизации. Поэтому, данное отношение верно, если вершина синхронизации во второй цепочке выполнится второй раз после события завершение(Т2). Это возможно при выполнении ограничения СВ>2Т+^, как видно из Рис.7. Окончательно получим Т2=СЬ+СВ. В силу симметрии нашей модели и введенных обозначений величина Т2 определяет длительность цикла всей асинхронной программы.

Рисунок 7 — Модель для анализа асинхронного вычислительного процесса

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

ПЕРЕХОД ОТ МОДЕЛЕЙ К ПРОГРАММАМ. ВЫЧИСЛИТЕЛЬНЫЙ ЭКСПЕРИМЕНТ

На основе графических моделей Рис.5 и 6 построим параллельные программы. В качестве целевой платформы будем использовать двухпроцессорный SMP компьютер под управлением операционной системы Microsoft Windows 2000. Параллельное исполнение в данной архитектуре организовано на основе потоков или нитей (threads). Поток исполняет

процедуру, процедуры разных потоков могут обращаться к одним и тем же данным и синхронизировать свою работу при помощи функций синхронизации операционной системы. В параллельной программе, таким образом, нужно 1) использовать, по крайней мере, два потока; 2) разделить код на две процедуры; 3) организовать синхронизированную работу процедур.

Для выделения дополнительной процедуры в модели последовательно-параллельного алгоритма необходимо ввести дополнительную вершину синхронизации S1, как показано на Рис.8. Несложно убедиться, что данная программа эквивалентна исходной программе Рис.5. Процедура первого потока тогда будет исполнять вершины S1, CB1, T2, CL1. Процедура второго потока будет исполнять вершины T1, CL2, CB2, S2.

В любой современной операционной системе, управляющей SMP компьютером, есть функции синхронизации при помощи событий. Для OC Microsoft Windows 2000 вершины синхронизации будут соответствовать объектам «событие» (event) и вызовам функций WaitForSingleObject(hEventR,INFINITE) и WaitForSingleObject(hEventL,INFINITE). Связи между процедурами потоков по дугам CL2—(2)—S1 и CL1—(1)—S2 будут отображаться в вызовы функций синхронизации SetEvent(hEventR) и SetEvent(hEventL).

Т1

Рисунок 8 — Модель последовательно-параллельного вычислительного процесса с разделением на подпроцессы

Для асинхронной модели Рис.6 процедуры CB1, CL1, S1 будут исполняться одним потоком, а CB2, CL2, S2 — другим потоком. При этом процедуры обмена данным T1 и T2 будут исполняться аппаратурой SMP компьютера. Если потребуется перенести код для исполнения в архитектуре с распределенной памятью, они отобразятся в вызовы функций передачи сообщений.

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

Мы провели четыре серии из 81-ого вычислительного эксперимента. Размер области расчета изменялся от 10x80 точек до 800x80 точек. Разбиение исходной области выполнялось поровну вдоль размерности 80. В каждом эксперименте проводилось по 10000 итераций до остановки. Результаты вычислительных экспериментов показаны на Рис.9.

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

Время счета по методу Зейделя для различных способов организации вычислений

Размер матрицы по Х

Рисунок 9 — Время счета для различных способов организации вычислений

По Рис.9 можно проследить, что в интервале примерно от 10 до 410 точек времена счета последовательного и параллельных алгоритмов отличаются в 1,5 — 2 раза и равномерно растут. Далее эффективность последовательного алгоритма резко падает. Можно также видеть, что при достижении размера в 800 точек эффективность параллельных алгоритмов также начинает падать.

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

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

Из Рис.9 можно сделать вывод, что для нашего компьютера рассмотренный последовательный алгоритм подходит только для матриц размером не более 80x400 точек, а параллельные алгоритмы — для матриц размером не более 80x800 точек. Для матриц больших размеров требуется разрабатывать специальные эффективные алгоритмы с большей «локальностью» обращения к памяти. Разработка таких алгоритмов — предмет специального изучения. Адекватное же сравнение наших алгоритмов возможно в диапазоне 10 — 400 точек.

2,00 1,80 1,60 1,40

1,20

ш

X

Ф

а 1,00

о

¡£

О >.

0,80 0,60 0,40 0,20

N <3 ^ ^ ^ г ф1 ^ ^ 4 ^ ^ V <оЧ

Размер матрицы по Х

Рисунок 10 — Значения ускорений для различных способов организации вычислений

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

л /

I

ускорение оптимизированного асинхронного алгоритма —•—ускорение последовательно-параллельного алгоритма —■—ускорение неоптимизированного асинхронного алгоритма

г

Сравним алгоритмы в диапазоне от 10 до 400 точек по критерию ускорения. Под ускорением будем понимать отношение времени счета последовательного алгоритма к времени счета параллельного алгоритма. Значения ускорений показаны на Рис.10. На Рис.9 и 10 дополнительно приведены результаты для «не оптимизированного» асинхронного алгоритма. Это модель программы автоматически построенной по графической модели алгоритма. Такое построение используется в языке ГРАФ ПЛЮС [3]. При этом мы ввели в код избыточную синхронизацию в виде доступа к объекту взаимного исключения в каждой итерации и применили явное копирование областей памяти, причем через буферную область. По рис.10 видно, что такая программа более эффективна по сравнению с последовательно-параллельной программой.

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

ВЫВОДЫ

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

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

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

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

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

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

БИБЛИОГРАФИЧЕСКИЙ СПИСОК

1. Воеводин Вл.В., Научно-исследовательский вычислительный центр МГУ. Курс лекций "Параллельная обработка данных" (http://parallel.ru).

2. Вальковский В., Котов В., Марчук А., Миренков Н. Элементы параллельного программирования. М.: Радио и связь, 1983.

3. Востокин С.В. Спецификация языка программирования ГРАФ ПЛЮС. - Самара, СНЦ

РАН, 2003.

4. Нестеренко Б., Марчук В. Основы асинхронных методов параллельных вычислений. -Киев: Наук. Думка 1989.

5. Самарский А.А., Николаев Е.С. Методы решения сеточных уравнений. М.,1978.

i Надоели баннеры? Вы всегда можете отключить рекламу.