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

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

CC BY
341
72
i Надоели баннеры? Вы всегда можете отключить рекламу.
Ключевые слова
ПАРАЛЛЕЛЬНЫЙ АЛГОРИТМ / ДЕЦЕНТРАЛИЗОВАННОЕ УПРАВЛЕНИЕ / РАСШИРЕННАЯ ПРИСОЕДИНЕННАЯ МАТРИЦА / ADJOINT / СИСТЕМА MATHPAR / SPMD ВЫЧИСЛИТЕЛЬНАЯ ПАРАДИГМА / MPI / МНОГОПОТОЧНОСТЬ / HYBRID PARALLEL PROGRAMMING MODEL / C++ / GMP / PARALLEL ALGORITHM / DECENTRALIZED CONTROL / ADJUGATE MATRIX / SYSTEM MATHPAR / SPMD COMPUTATIONAL PARADIGM / MULTITHREADING

Аннотация научной статьи по математике, автор научной работы — Ильченко Евгений Александрович

Дается описание общей схемы распараллеливания блочных рекурсивных алгоритмов, которая рассматривается на примере вычисления присоединенной матрицы, приводятся результаты экспериментов на вычислительном кластере «МВС-100K».

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

ABOUT EFFECTIVE METHODS OF PARALLELIZING BLOCK RECURSIVE ALGORITHMS

We describe an algorithm for the decentralized control of parallel computing process which is based on the SPMD computational paradigm and present the results of experiments on a cluster «MVS-100K».

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

Иванов Дмитрий Владимирович, Самарский государственный университет путей сообщения, г. Самара, Российская Федерация, кандидат физико-математических наук, доцент кафедры ме-хатроники в автоматизированных производствах, e-mail: dvi85@list.ru

Ivanov Dmitrii Vladimirovich, Samara State University of Transport Communications, Samara, the Russian Federation, Candidate of Physics and Mathematics, Associate Professor of the Mechatronics in Automated Production Department, e-mail: dvi85@list.ru

Ширинов Ильдар Раджабович, Самарский государственный университет путей сообщения, г. Самара, Российская Федерация, аспирант кафедры мехатроники в автоматизированных производствах, e-mail: shirinov89@mail.ru

Shirinov Ildar Radzhabovich, Samara State University of Transport Communications, Samara, the Russian Federation, Post-graduate Student of the Mechatronics in Automated Production Department, e-mail: shirinov89@mail.ru

УДК 519.6

ОБ ЭФФЕКТИВНОМ МЕТОДЕ РАСПАРАЛЛЕЛИВАНИЯ БЛОЧНЫХ

РЕКУРСИВНЫХ АЛГОРИТМОВ

© Е.А. Ильченко

Ключевые слова: параллельный алгоритм; децентрализованное управление; расширенная присоединенная матрица; Adjoint; система Mathpar; SPMD вычислительная парадигма; MPI; многопоточность; hybrid parallel programming model; C++; GMP. Дается описание общей схемы распараллеливания блочных рекурсивных алгоритмов, которая рассматривается на примере вычисления присоединенной матрицы, приводятся результаты экспериментов на вычислительном кластере «<МВС-100К».

Рассмотрим пример блочного рекурсивного алгоритма. Даны две матрицы A, В , требуется найти их произведение. Разобьем матрицы А и B размером n = 2k на четыре равных блока:

% АЛ (Bo ВЛ = (Co Cl чА2 A3) Х VB2 Вз) VC2 Сэ,

Введем префиксное обозначение для функции матричного умножения m(A, B) = С , тогда получим:

m(A B)= (m(Ao,Bo)+ m(Ai,B2) m(Ao,B1)+ m(AbB3)\ (1)

m(A,B ) \m(A2, Bo) + m(A3,B2) m(A2,Bi)+ m^^V (±)

Таким же образом можно поступить с каждым из восьми умножений в правой части равенства (1), рисунок 2 показывает параллельную реализацию этого алгоритма.

Рассмотрим блочный алгоритм обращения матрицы, имеющий сложность матричного

умножения [1,2]. Если M = ^^ является обратимой матрицей и А ее обратимый

блок, то верно равенство:

ы-1- (I -А-1С\ (I 0 \ ( I 0\ (А-1 0

M = 1 ~ I ) х vo (D - BA-1C)-V х V-B i) х V 0 I

где I - единичная матрица. Раскрывая скобки, получим:

'а-1 + Л-1с(о - ВА-1Сс) ВА-1 -Л-1с(б - БА-1с) -Б -ВЛ-1С) В Л-1 Б-ВЛ-1С

1

Обозначим обращение матрицы как функцию в(М) = Е, тогда полученная формула примет вид:

В0 В1

в(М ) =

В2 Ва

где

Во = в(Л) + ш(ш(ш(в(Л), т(С, Ва)), в) , в (Л)), В1 = -ш(в(Л), т(С, В3)), В2 = -ш(Ва,ш(В, в(Л))) ,Ва = в(Б - т(т(В, в(Л)),С)).

Рис. 1. Граф алгоритма для нахождения обратной матрицы

Номер типа X Описание вершины Входные данные I Результат Я Форма вершины (на рисунке) Цвет

0 А х В, или т(А, В) две матрицы I = {А, В} матрица К = {С} окружность

1 А-1, или д(А) матрица I = {М} матрица К = {М-1} треугольник

Таблица 1. Описание типов вершин для алгоритма нахождения обратной матрицы

Как мы видим, в формуле для нахождения д(М) в различной форме встречается суперпозиция функций т и в . Рассмотрим один из случаев, например т(В, й(А)) , что означает матричное умножение В х А-1 . Чтобы выполнить матричное умножение, сначала нужно вычислить А-1 . Эту и другие зависимости порядка вычислений одних функций от других можно представить в виде графа, где вершинами будут все функции, из которых состоит рекурсивный алгоритм, а связи будут задавать порядок вычислений вершин. К примеру, если между вершинами а и Ь есть дуга (а, Ь), то это означает, что вершина Ь должна быть посчитана строго после вершины а . Обозначим -А-1 = V , V х С = X , В х V = У , У х С = О , (Б + О)-1 = Z , Z х У = Ш , тогда формула для нахождения обратной матрицы будет выглядеть следующим образом:

М-1 = (Х х Ш+ А-1 Х* Z). (2)

Для алгоритма нахождения обратной матрицы мы имеем два типа вершин — функции т и в.

Номер вершины Номер типа Входные данные Постобработка Описание вершины и (к) Ш (к)

0 1 1о = А До = -До V = -А-1 - -

1 0 1А = До, I? = с - X = V х С 0 -

2 0 1£ = В, I? = До - У = В х V 0 -

3 0 1зА = Д2, I? = с - ф = У х С 2 -

4 1 14 = В + Дз - И = (В + ()-1 3 -

5 0 1А = Д4, I? = Я2 - Ш = И х У 4 -

6 0 1А = Я1, I? = Я4 - X х И 1,4 -

7 0 I? = Д1, I? = Еь Ду = Ду - До X х Ш 1,5 -

Таблица 2. Описание вершин для алгоритма нахождения обратной матрицы.

А, В

С

Рис. 2. Граф алгоритма для блочного матрчиного умножения

Номер вершины Номер типа Входные данные Постобработка Описание вершины и (к) Ш (к)

0 0 = А0, 1В = В0 - Ао х Во - -

1 0 /А = Ах, 1В = В2 Дх = Дх + До Ах х В2 - 0

2 0 = Ао, 1В = Вх - Ао х Вх - -

3 0 /А = Ах,/В = Вз Дз = Дз + Д2 Ах х Вз - 2

4 0 = А2, 1В = Во - А2 х Во - -

5 0 = Аз, = В2 Д5 = Д5 + Д4 Аз х В2 - 4

6 0 = А2, = Вх - А2 х Вх - -

7 0 /оА = Аз, /В = Вз Д7 = Д7 + Дб Аз х Вз - 6

Таблица 3. Описание типов вершин для алгоритма блочного рекурсивного матричного

умножения

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

она может быть посчитана параллельно. Если же некоторую последовательность операций алгоритма нет смысла выполнять параллельно, мы не будем выделять эти действия в отдельную вершину или создавать для них отдельную задачу, а вынесем эти действия в предварительную или постобработку данных для некоторой вершины. Рассмотрим вершину с номером 0 для алгоритма нахождения обратной матрицы. Входные данные для задачи — матрица А, выходными будет й(А) = А-1 . Но поскольку нам нужна матрица -А-1 , а не А-1 , то после того, как эта вершина будет посчитана, необходимо выполнить некоторые преобразования матрицы А-1 . Действия, заключающиеся в некотором преобразовании выходных данных вершины, мы будем называть постобработкой. Действия, заключающиеся в инициализации входных данных вершины, мы будем называть инициализацией вершины. Инициализация происходит в тот момент, как только вершина становится доступной — т. е. тогда, когда все зависимые для нее вершины посчитаны. Постобработка происходит в тот момент, как только получены выходные данные для этой задачи и данные, необходимые для постобработки этой вершины. Входные данные для вершины с номером к будем обозначать как , результат будем обозначать как Д (под результатом понимаются данные, полученные по завершению постобработки вершины). Если входные данные вершины некоторого типа состоят более чем из одного элемента, верхним индексом будем обозначать какой-то конкретный элемент, например . Если результат некоторой вершины состоит более чем из одного элемента, тогда верхним индексом будем обозначать конкретный элемент результата, например Д§ . Номер типа для вершины с номером к будем обозначать как Т(к) , множество зависимых вершин для нее будем обозначать как и (к) . Множество зависимых вершин, необходимых для постобработки, будем обозначать Ш(к) . Нужно заметить, что множества зависимых вершин для инициализации и постобработки в общем случае не будут совпадать, но в Ш(к) мы не будем указывать вершины, которые уже присутствуют в и (к) . Тогда, принимая во внимание описание вершин из таблицы 2, уравнение (2) можно записать в виде:

При определении инициализации и постобработки для некоторой вершины будем соблюдать следующее правило: если для выходных данных некоторой вершины k необходимо некоторое преобразование, причем оно одинаково для всех вершин, которые будут зависеть от k , тогда это преобразование F(R) будем всегда выносить в постобработку этой вершины ( k ). Пример одной из наиболее оптимальных разбивок на вершины алгоритма блочного рекурсивного умножения приводится в таблице 3. Зависимые вершины для инициализации (U(k)) на рисунках будем обозначать стрелками, необходимые вершины для постобработки (W(k)) будем обозначать пунктирными стрелками. Граф блочного матричного умножения, соответствующий разбиению на вершины из таблицы 2, приводится на рис. 2.

Классической схемой для параллельной реализации подобных алгоритмов является схема с диспетчером (Manager-Workers method). Роль диспетчера выполняет один из узлов кластера, на остальных разворачивается дерево рекурсивного алгоритма (например, в случае блочного матричного умножения в определенный момент времени каждому узлу кластера будет сопоставлено вычисление некоторого матричного произведения Ax х By ). Изначально все процессоры (узлы кластера) являются свободными и находятся в соответствующем списке, который хранит диспетчер. К нему будет поступать 2 вида запросов:

- предоставить некоторому узлу M свободных процессоров, при этом он исключает их из списка свободных процессоров;

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

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

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

Другой способ динамической реализации алгоритма - создание диспетчера на каждом узле кластера. Такое управление вычислительным процессом будет децентрализованным. Это можно сделать в многопоточном режиме — один поток будет диспетчером, остальные потоки будут использоваться для вычисления подзадач. Пусть на узле кластера имеется 8 ядер, тогда наиболее рационально будет использовать одно ядро для диспетчера, остальные семь ядер для счетных потоков. Таким образом, если на узле кластера N ядер, мы будем создавать N-1 счетных потоков для наиболее полного использования вычислительных ресурсов. Далее речь пойдет именно о таком способе организации параллельных вычислений. При этом мы продолжаем исследования, начатые в работах [4-12], посвященных динамическим алгоритмам управления параллельным вычислительным процессов. И непосредственно опираемся на работы [4] и [8], также посвященные данной тематике исследований.

Рассмотрим работу диспетчера более подробно. Диспетчерский поток имеет список свободных процессоров, список дочерних процессоров и список задач, отправленных на дочерние узлы. Диспетчерский поток реализован в виде бесконечного цикла и имеет 3 режима:

0 — режим ожидания задачи. В этом режиме ожидается задача от любого другого процессора. Может прийти одно из двух сообщений: либо задача, которую необходимо решить и результат вернуть отправителю, либо сигнал к завершению. Сигнал к завершению отсылается корневым узлом, т. е. тем, на котором была запущена стартовая задача. Если получен сигнал к завершению, происходит выход из цикла. Иначе выполняются действия по приему данных задачи, затем она полностью передается счетному потоку и происходит переход в режим 1;

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

• получение свободных процессоров от родительского узла;

• опрос дочерних узлов о завершенности работы;

• прием данных от дочерних узлов, завершивших работу;

• создание новых дочерних узлов;

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

• проверка того, что вся задача, полученная от родительского узла решена.

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

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

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

На четвертом шаге создаются новые дочерние узлы. Как один из вариантов управления параллельным вычислительным процессом, диспетчер может иметь настраиваемый параметр, который определяет максимальное количество дочерних узлов (тахЭ). Он может, например, экспериментально подбираться для каждого алгоритма. Но это число не может быть меньше двух. Слишком большое значение этого параметра также может приводит к ухудшению работы системы. Если число имеющихся дочерних узлов меньше тахЭ, будут созданы новые. Обозначим общее количество имеющихся свободных процессоров через число дочерних узлов — через Dnodes. Допустим, имеется возможность создать еще Ь дочерних узлов. Ь определяется как минимум из 3 величин: maxD-Dnodes, ^^ и количества задач, имеющихся в очереди. Затем произвольным образом из списка свободных процессоров берется Ь номеров, отсылается им ровно по одной задаче и эти процессоры помещаются в список дочерних узлов.

На пятом шаге все имеющиеся свободные процессоры делятся на Dnodes групп. Затем каждая группа отсылается соответствующему дочернему узлу. Это означает, что мы всегда будем отдавать номера свободных процессоров поровну для всех дочерних узлов (ну или если количество свободных процессоров не кратно числу дочерних, какие-то из дочерних получат на единицу меньше). Номера свободных процессоров отсылаются только тогда, когда мы не можем создать из них новые дочерние узлы (т. е. когда число дочерних узлов достигло заранее заданного максимума MaxD).

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

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

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

Для тестирования производительности этого метода был выбран алгоритм для нахождения расширенной присоединенной матрицы [3].

Пусть дана матрица А и некоторое число ¿о , тогда матрицы А, Е и число й назовем

расширенным присоединенным отображением для матрицы М :

Аехг(М,й0) = (А,Б,Е,й)•

М имеет размер п х п , где п = 2к . Если М = 0 : АеХ:(0, ¿0) = (¿01, 0, 0, ¿0) , где I — единичная матрица. Если к = 0 и М = а = 0: Aext(a,d0) = (¿0,а, 1,а). Если к > 0 и М = 0 разобьем матрицу М на четыре равных блока М = (М]), г,] € 1, 2 :

М=

М11 ММ 12 М21 М22 У '

Введем обозначения:

А] = Ег] Eij , А? = 1 — А? I Уг] = Ег] Бг] — ¿г^'11 ^ ] € 1 2

Л -Ч] — J-/гj^-Jlj "г]-1

Пусть Обозначим

Пусть

Обозначим

Пусть Обозначим

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

Аех4(МШ4) = (А11,^11,Е11,Й11).

1 А11М12 „.1 М21У11 „-1 М22^11 - М21Е?1М112

М112 =

¿0

, М211 = -

¿0

М212 =

¿0

А^/цМ^и) = (А^^Е^,^), Аех^М^йи) = (А21, Б 21, Е21, ¿21) •

„,2 _ А21М2У2 _ ¿21^12

М22 =--73—-, а« =

(¿11)2

d

11

Аех^ЫМ^, ds) = (А22, Б22, Е22, ¿22).

М121 = - ^, М?2 = ¿11

511М212-111М12^21

¿ц

У12 + $12^1

3 _ М12У22 „,3

МЗ2 = -

¿8

М22 = ^22 -

/21М222У22

¿8

¿11

А1 = А12АЦ, А2 = А22А

22 А21,

ь

1 ^М^А1

А1

¿11

¿11

¿22, Р =

А2 _ ЫМ^Е^А2

¿21

^ = -

( 511е221А21 jd22 + ^12^22у

V ¿ц

М?о Е2 А2

(М21ЕТ1А1Л d + М22Е22А1 ¿о ^12 + ¿11

¿в

А=

¿12

¿21

С = -

¿

11

РС р ¿12 /

Б =

'М^22 ¿21 S21¿22 " ¿21

М132

М232

Е=

Е11 Е12

Е21 Е22

Аехь(М, ¿о) = (А, Б, Е, ¿22).

в

Используемые в алгоритме матрицы Е^ имеют особое строение — в каждой строке может стоять только один ненулевой элемент, причем он всегда будет равен единице. Поэтому вместо явного хранения матрицы Е^ можно иметь 2 одномерных массива, в первом будем хранить номера строк, где находятся единичные элементы (Е^), во втором номера столбцов (Е^ ). Рассмотрим матричные умножения вида А = Е^ х М: строки матрицы М с номерами Е^ [к] должны быть скопированы в матрицу А, и будут в ней иметь номера Ег[к] . В случае умножения вида А = ЕТ х М нужно просто обменять массивы Е^ и Еролями. Из алгоритма видно, что умножения на матрицу Ец всегда можно выполнять только слева, поэтому случай А = М х Е^ рассматривать не будем. Умножения вида А = х М выполняются так: строки матрицы М с номерами Е^[к] должны быть скопированы на строки с теми же номерами в матрицу А (нужно заметить, что матрица Е^ может иметь полностью нулевые строки, поэтому матрица А не будет точной копией матрицы М. Ввиду особого строения матриц Е^ и Б^ , нахождение У^ = ЕТБ^ — I можно также выполнять более быстрым образом. Матрицу ЕТБ^ найдем способом, описанным выше. Далее необходимо построчно скопировать матрицу ЕТБ^ в У^ , соблюдая следующие правила: если текущая строка матрицы ЕТБ^ имеет одни нули, тогда в У^ эта строка также будет содержать нули кроме столбца с номером, равным номеру текущей строки — на этой позиции будет элемент — й. Если текущая строка имеет какие-то ненулевые элементы, то они должны быть просто скопированы в У^ , при этом необходимо отбросить элемент с номером столбца, равным номеру строки — таким образом, в У^ он будет равен нулю. Умножения вида А = х М выполняются так: пусть Е^ будет дополнением для множества Е^ (например, если текущий размер блоков матриц равняется 4, и Ei содержит элементы [2,0], тогда дополнением будет массив [1,3]). Далее необходимо выполнить рассмотренное выше умножение А = х М , взяв в качестве массив Е^ .

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

Номер типа Т Описание вершины Входные данные I Результат Я Форма вершины (на рисунке) Цвет

0 А х В две матрицы I = {А, В} матрица Я = {С} окружность

1 АхВ а две матрицы и делитель I = {А,В,й} матрица Я = {С} треугольник

2 Аехь(И, й) матрица и входной параметр I = {М, й} три матрицы и выходной параметр Я = {А,Я,Б,й} квадрат

Таблица 4. Описание типов вершин для алгоритма присоединенной обратной матрицы

Умножение А х В будем выполнять в блочном виде, разделив матрицы А и В на четыре части, как показано в таблице 3 и изображено на рисунке 2. Умножение выполняется аналогично умножению А х В , за тем исключением, что к результату применяется постобработка вида С/й .В таблице 5 приводится описание использумых при реализации вершин в соответствии с алгоритмом для нахождения расширенной присоединенной матрицы (поскольку вершина с номером типа 2 и есть сам алгоритм для вычисления расширенной присоединенной матрицы, это описание также относится и к ней). Матричные умножения, одним из сомножителей которых являются матрицы , I^ ,Е^ или не имеет смысла вычислять параллельно, поэтому такие умножения не будут выноситься в отдельную вершину. Матрица У^ также должна быть вычислена последовательно.

№ Т (к) Входные данные Постобработка Описание вершины и (к) Ш (к)

0 4 1оМ = Мц,^ = йо - А1иМц ,(1о) - -

1 2 1А = я£,1В = М12, I? = ^ - М112 0 -

2 2 IА = М21,1В = Уи, I? = ^ Я 2 = -Я2 М211 0 -

3 0 1А = М21, IВ = яЕт Я1 Я М22Л^-Д3 Я3 = М212 1 -

4 4 Iм = /11Я1,I? = Я? - АЦ^цМ^^ц) 1 -

5 4 тМ _ г» тО _ г»? 1ь = Я2, 1ь = Я0 - А&М^йи) 2 -

6 0 ^ = ЯА, Iв = Лз - А21М22 3, 5 -

7 2 1А = Яв,^ = У12, I? = (йц)2 Я7 = -Я7 М222 4, 6 -

8 4 - АЦг^М^ ,йв) 7 -

9 2 I9A = Яо = У21, ?? !9 = ЯО Я _ -Й9-Й8 Я9 = М^О 22 °21 5 8

Таблица 5. Описание вершин для алгоритма нахождения присоединенной матрицы

(А, 5, Е, с/)

Рис. 3. Граф алгоритма вычисления расширенной присоединённой матрицы

№ T (k) Входные данные Постобработка Описание вершины U (k) W (k)

10 2 rA _ pS rB _ PET PA 110 _ p0 ,^10 _ p5 r5 jd _ pd 110 _ p0 - (Я11)Х(ЕТ1А21) 5 -

11 0 -in _ Äl0,lfl _ Ä3 о R11 —111 Ri Rd pll _ Rd Ro 1 е21 А21 М1 г и 1 Л ¿21 и22 111 и12 л21 3, 10 -

12 0 Il2 _ Rll ZlB- _ Yl2 p R12+R4 R5 pl2 _ Rd R0 м?2 4, 11 -

13 2 Ii3 _ Rl2, 1l3 _ Y22 _ ds p13 _ -p13 м32 8, 12 -

14 2 Il4 _ I2^7,^14 _ Y22 Id4 _ ds p14 _ p8 - p14 м232 8 -

15 0 rA _ pA rB _ pA 11 5 _ p4 , 11 5 _ p0 - А1 4 -

16 0 i^A _ pA rB _ pA 1l6 _ p8 , ^16 _ p5 - А2 8 -

17 2 1l7 _ JllÄl,jfr _ ÄE Äl5, dd 117 _ p0 PIT _ ( Д1"даД17 )P1 ь 8, 15 -

18 2 1l8 _ I21P7 , ^ls _ PE Pl6, ^18 _ ds PI8 _ Д1вдаД18 R5 р 16 -

19 2 rA _ pS rB _ pET pA 1l9 _ p0 , J19 _ p5 p5 dd 119 _ p0 - (Я11)х(Е2™1А21) 5 -

20 2 I20 _ PI2 , 120 _ Pe PI6 ld0 _ ds p R19R8 + R20 p20 _ R5 12, 16 19

21 2 I21 _ M21, /Bl _ PE PA idl _ d0 - (М21)Х(ЕТ1А11) Ло 0 -

22 2 122 _ P3, I22 _ PE PI5 dd 122 _ p0 p R21R| + R22 p22 _ Rd R0 О 3, 15 21

23 0 I23 _ P20, I23 _ P22 P23 _ R1RR23 Л12 20,22 17

24 2 rA _ p т1 _ pd 124 _ p18 ,124 _ p4 , I24 _ p21 - РС Л12 18,22 -

Таблица 5 (продолжение). Описание вершин для алгоритма нахождения присоединенной

матрицы

Для исследований алгоритма была написана программа на С++. Для реализации мно-гопоточности была выбрана библиотека РЛгеаёв, для реализации арифметики многократной точности была взята библиотека СЫР. Эксперименты проводились на кластере «МВС-100К». В качестве исходной матрицы генерировалась случайная матрица размером 512x512, не имеющая нулевых элементов. Сами элементы матрицы генерировались по модулю 8 (3 бита). На рисунках 2, 3, 4 приводятся зависимости времени вычислений от количества

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

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

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

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

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

Заключение

Описанный подход является одним из возможных вариантов организации параллельных вычислений с децентрализованным управлением. Данная работа развивает идеи, изложенные в [3, 4]. Для исследования эффективности данного метода была написана программа на С++, в качестве реализуемой задачи был выбран алгоритм нахождения присоединенной матрицы, поскольку он требует больших объемов вычислений и характеризуется доволь-ко сложной постобработкой вершин. Была проведена серия экспериментов для алгоритмов компьютерной алгебры на кластере МВС-100К Межведомственного суперкомпьютерного центра РАН. Дальнейшее развитие изложенной концепции заключается в более рациональ-

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

ЛИТЕРАТУРА

1. Strassen V. Gaussian Elimination is not optimal. Numerische Mathematik. 1969. V. 13. P. 354-356.

2. Малашонок Г.И. Матричные методы вычислений в коммутативных кольцах. Тамбов: Изд-во Тамбовского университета, 2002.

3. Malaschonok G.I. О вычислении ядра оператора действующего в модуле // Вестник Тамбовского университета. Серия Естественные и технические науки. Тамбов, 2008. Т. 13. Вып. 1. С. 129-131.

4. Malaschonok G., Ilchenko E. Decentralized control of parallel computing // International conference Polynomial Computer Algebra. St. Petersburg, PDMI RAS, 2012. P. 57-58.

5. Бетин А.А. Эксперименты с параллельным алгоритмом вычисления присоединённой матрицы и параллельным умножением файловых матриц // Вестник Тамбовского университета. Серия Естественные и технические науки. Тамбов, 2010. Т. 15. Вып. 1. С. 341-345.

6. Бетин А.А. Эксперименты с параллельным алгоритмом вычисления присоединённой матрицы // Вестник Тамбовского университета. Серия Естественные и технические науки. Тамбов, 2010. Т. 15. Вып. 6. С. 1748-1754.

7. Малашонок Г.И. Компьютерная математика для вычислительной сети // Вестник Тамбовского университета. Серия Естественные и технические науки. Тамбов, 2010. Т. 15. Вып. 1. С. 322-327.

8. Малашонок Г.И. Управление параллельным вычислительным процессом // Вестник Тамбовского университета. Серия Естественные и технические науки. Тамбов, 2009. Т. 14. Вып. 1. С. 269-274.

9. Малашонок Г.И., Валеев Ю.Д. Организация параллельных вычислений в рекурсивных символьно-численных алгоритмах // Труды конференции ПаВТ'2008 (Санкт-Петербург). Челябинск: Изд-во ЮУрГУ, 2008. С. 153-165.

10. Г.И. Малашонок, Ю.Д. Валеев. Рекурсивное распараллеливание символьно-численных алгоритмов // Вестник Тамбовского университета. Серия Естественные и технические науки. Тамбов, 2006. Т. 11. Вып. 4. С. 536-549.

11. Малашонок Г.И., Валеев Ю.Д. Динамическое распределение заданий в вычислительном кластере по графу алгоритма // 11 Державинские чтения. Тезисы докладов. Тамбов: Изд-во ТГУ им. Г.Р. Державина, 2006. С. 38-47.

12. Г.И. Малашонок, Ю.Д. Валеев. О некоторых подходах к построению параллельных программ // Вестник Тамбовского университета. Серия Естественные и технические науки. Тамбов, 2005. T. 10. Вып. 1. С. 154-156.

13. Malaschonok G.I. Effective Matrix Methods in Commutative Domains // Formal Power Series and Algebraic Combinatorics. Berlin: Springer, 2000. P. 506-517.

БЛАГОДАРНОСТИ: Автор выражает благодарность своему руководителю Г.И. Мала-шоноку за постановку задачи. Работа выполнялась при частичной поддержке гранта РФФИ № 12-07-00755-а.

Поступила в редакцию 1 июня 2015 г.

Ilchenko E.A. ABOUT EFFECTIVE METHODS OF PARALLELIZING BLOCK RECURSIVE ALGORITHMS

We describe an algorithm for the decentralized control of parallel computing process which is based on the SPMD computational paradigm and present the results of experiments on a cluster «MVS-100K».

Key words: parallel algorithm; decentralized control; Adjugate matrix, the system Mathpar, SPMD computational paradigm, adjoint, MPI, multithreading, hybrid parallel programming model, C++, GMP.

Ильченко Евгений Александрович, Тамбовский государственный университет им. Г.Р. Державина, г. Тамбов, Российская Федерация, аспирант кафедры математического анализа, e-mail: ilchenkoea@gmail.com.

Ilchenko Evgeni Aleksnadrovich, Tambov State University named after G.R. Derzhavin, Tambov, the Russian Federation, Post-graduate Student of the Mathematical Analysis Department, e-mail: ilchenkoea@gmail.com

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