Научная статья на тему 'Управление параллельным вычислительным процессом'

Управление параллельным вычислительным процессом Текст научной статьи по специальности «Математика»

CC BY
205
35
i Надоели баннеры? Вы всегда можете отключить рекламу.
Ключевые слова
ПАРАЛЛЕЛЬНЫЙ ВЫЧИСЛИТЕЛЬНЫЙ ПРОЦЕСС / УПРАВЛЕНИЕ ВЫЧИСЛИТЕЛЬНЫМ ПРОЦЕССОМ / АЛГОРИТМЫ КОМПЬЮТЕРНОЙ АЛГЕБРЫ

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

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

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

Текст научной работы на тему «Управление параллельным вычислительным процессом»

1. Малашонок Г.И. Матричные методы вычислений в коммутативных кольцах. // Монография. Тамбов: Изд-во ТГУ им. Г.Р. Державина, 2002. 214 с. С.78-82.

2. Малашонок Г.И. О вычислении ядра оператора, действующего в модуле. Вестник Тамбовского университета. Сер. Естественные и технические науки. Том 13, вып. 1, 2008. С. 129-131.

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

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

© Г.И. Малашонок

Ключевые слова: параллельный вычислительный процесс, управление вычислительным процессом, алгоритмы компьютерной алгебры.

Аннотация

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

1 Введение

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

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

Развиваются автоматизированные средства создания параллельных программ, такие как High Performance Fortran, Фортран-DVM и Си-DVM [1] . Известны подходы, в которых осуществляется конструирование программ из типовых алгоритмических структур [2] - [5] и из частичных проектных решений (design patterns) [6]. Системы программирования, которые используют типовые проектные решения, - это FrameWorks [7], DPnDP [8, 9], Enterprise [10], CO2P3S [11]. Известен опыт создания динамических параллельных систем в Институте программных систем РАН, разработанный здесь пакет, носит название Т-системы [12].

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Будем говорить, что процессор является свободным, если он в данный момент не вычисляет 1 [О,:¡дерево алгоритма. Если вычисления в вершине дерева алгоритма не начинались, то будем говорить, что вершина остается свободной.

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

3 Вершина дерева

Основным классом задания является класс Task. В поле numbOfVTypes этого класса хранится число различных типов вершин в дереве задания, а в массиве VType - описание каждого типа вершины. Тип вершины определяется номером этого типа в массиве VType.

В классе типа вершины typeOfVertix определены следующие поля: количество numb Of Daughters и типы daughterType дочерних вершин, число пучков numbOfSheaves и число поддеревьев sheafVolume в каждом пучке. В массиве daughterType содержатся типы всех дочерних вершин, его длина numb Of Daughters равна сумме объемов всех пучков из массива shaefVolume, а тип каждой вершины -это ее порядковый номер в массиве VType.

Темпорированное дерево алгоритма будет определено, если определить какого типа вершина является корневой. Естественно положить, что корневой является вершина стоящая первой в массиве VType.

Для хранения данных в этой вершине, в поле data располагается массив объктов для сохранения данных.

Одновременно один процессор может обслуживать много вершин. Поэтому в классе задания Task должен находится массив указателей pointerOnV на все открытые вершины, в которых находится данный процессор. Изначально это массив из 16 элементов, который при необходимости автоматически удваивается. Для учета свободных элементов в этом массиве в классе Task имеется равновеликий массив freePointers, организованный как стек, в котором сохраняются номера свободных элементов в массиве pointOnV. Изначально он представляет из себя список из чисел 0,1,..., 15. Указатель freePlace, который изначально равен 0, указывает на позицию в стеке firstFP, в которой записан первый свободный адрес в массиве pointOn V.

При создании новой Вершины указатель на нее сохраняется в массиве pointerOnV по адресу freePointers\firstFP], а при завершении вычислений в этой Вершине этот указатель обнуляется, а Вершина теряется. При обнулении указателя, номер освободившегося элемента в массиве pointerOn Vдописывается в стек свободных номеров freePointers. Этот номер будет использован при захвате следующей вершины.

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

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

Еще одно поле fathers Vertix в классе Task предназначено для списка всех отцовских вершин, которые расположены в других процессорах. Изначально этот массив содержит 16 пустых записей. Каждая запись предназначена для хранения трех чисел: номера отцовского процессора fatherProc, адреса отцовской вершины в этом процессоре fatherAddress и адреса дочерней вершины в данном процессоре myAddress.

При получении нового задания в список fathers Vertix добавляется новая запись, а при завершении вычислений, и отсылке результата, эта запись вычеркивается. Если список превышает отведенный максимальный объем, то объем списка удваивается.

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

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

Для режима "Save Тгее"в списке fathersVertix нужно хранить четвертое поле - номер поддерева myTreeNumber из пучка отцовской веошины.

4 Захват вершины процессором

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

Поле fathersVertix в главном процессоре остается пустым. Этот факт можно использовать как признак главного процессора и условие завершения всех вычислений.

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

5 Состояние вычислений в вершине

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

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

При каждой Вершине V создается список свободных процессоров (ССП) procList. Номер текущего пучка сохраняется в поле sheaflndex, а число деревьев в пучке - в поле sheafVolume. При вычислении деревьев очередного пучка создается регистр состояния treeFlags. В этом регистре для каждого дерева пучка хранится его флаг F и номер процессора Р, который отвечает за вычисление данного дерева.

Каждый флаг F принимает значения -2, -1, 0, 1, 2,.... Флаг 0 означает, что данные по этому дереву еще не передавались. Флаг -1 означает, что данные переданы в поддерево, но состояние вычислительного процесса либо не определено, либо начаты вычисления всех листовых вершин данного поддерева, т.е у данного дерева отсутствуют поддеревья, которые ждут свободных процессоров. Флаг -2 означает, что закончено вычисление данного дерева и результат возвращен в корневую вершину. Флаги, выраженные натуральными числами I = 1,2,..., означают, что данные переданы процессору Р, отвечающему за вычисление данного дерева, а кратчайший путь до свободной нелистовой вершины этого дерева равен I.

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

Соответствующие четыре счетчика iV_ 2, iV-i, N0 и Ni фиксируют количество флагов со значением -2, -1, 0 и количество флагов lmin. Когда число флагов со значением -2 становится равным числу поддеревьев пучка, то вычисления переходят к пучку следующего веса, а если завершены вычисления в пучке старшего веса, то результат возвращается отцовской вершине, а настоящая Вершина теряется.

Главный процессор получает корневую вершину дерева, входные данные и список свободных процессоров 1,2,..,п. Рассмотрим поведение произвольного процессора s.

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

Пусть первый пучек деревьев вершины V состоит из DNi деревьев. Если PN < DNi, то каждому процессору z из ССП передается по одному дереву из первого пучка и список ССП, состоящий из одного процессора z. Если PN > DNi, то список ССП делится на DN\ частей. Размеры частей отличаются не более чем на 1. Сам процессор s будет первым процессором в первой части. Первому процессору в каждой из частей передается одно дерево пучка и вся часть списка ССП, в которой он сам находится.

В каждом процессоре организовано два потока: Streamin и Streamout. Поток Strearriin - это основной счетный поток, который определяет движение данного процессора от корня дерева алгоритма к листьям. Через фиксированные промежутки времени этот поток останавливается и передает управление потоку Streamoui . Этот поток отвечает за обратное движение по дереву алгоритма - от листьев

к корневой вершине, он же обслуживает все обмены сообщениями с другими процессорами. Когда поток Streamout закончит все задания, обработает все сообщения, после этого он возвращает управление потоку Stream^.

У каждой вершины Vertix имеется четыре специальных поля: поля myAddress и father Address для хранения своего адреса и адреса отцовской вершины в массиве pointOnV, поле fatherProc для номера отцовского процессора и поле myTreeNumber для номера своего дерева в текущем пучке отцовской вершины. Три этих поля передаются от отцовской вершины дочерней вершине при отправке задания. Поле myAddress заполняется в момент создания вершины,

6 Движение свободных процессоров

Рассмотрим возможные варианты движения свободных процессоров.

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

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

3. Приход списка свободных процессоров вызывает выполнение процедуры distribFreeProc, которая распределяет свободные процессоры.

Эта процедура проверяет состояние счетчиков No и N\, а затем распределяет свободные процессоры следующим образом:

- Если TVo = N1 = 0, то все свободные процессоры пересылаются отцовской вершине. Если отцовской вершины нет, то есть данная вершина является главной, то дополняется ее список ССП.

- Если Лг0 = 0, Ni > 0, то все свободные процессоры делятся на Ni частей и пересылаются тем вершинам, чьи флаги равны lmin-

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

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

7 Установка флагов

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

После обработки сообщения от дочерней вершины могут изменится значения Щ и lmin- Рассмотрим возможные варианты.

Если состояние Nq > 0 сохраняется, то сообщения отцовской вершине не посылаются.

Если Nq > 0 сменилось на А/о = 0, то при Ni > 0 посылается сообщение об установке флага +1,

а при A i = 0 посылается сообщение об установке флага (-1).

Если равенство А/о = 0 сохраняется, a lmin меняется, то при Ni > 0 и lmin > 0 посылается сообщение о новом флаге 1ты + 1, а при N\ = 0 и 1тт = 0 - сообщение о новом флаге (-1).

8 Получение сообщения от дочерней вершины

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

зультаты записываются в соответствующие поля результатов, флаг этой дочерней вершины принимает значение (— 2), меняются счетчики флагов, а процессоры распределяются процедурой distribFreeProc.

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

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

Если же вычисление пучка не окончено, то распределяются свободные процессоры процедурой distribFreeProc. После этого трек потока Streamout завершается.

Работа выполнена при частичной поддержке грантов РФФИ (проект 08-07-97507) и программы "Развитие потенциала высшей школы"(проект 2.1.1/1853).

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

1. Коновалов И.А., Крюков В.А., Михайлов С.Н., Погребцов Л.A. Fortran-DVM - язык разработки мобильных параллельных программ. // Программирование. 1995. № 1. 17. С. 49-54.

2. Берзигияров П.К. Программирование на типовых алгоритмических структурах с массивным параллелизмом. Вычислительные методы и программирование. 2001. Т.2. С. 1-16.

3. Berzigyarov Р.К. Static Pipelines for Divide-and-Conquer Functions: transformation and Analysis. Preprint IV ¡ AN. Moscow, 1995. N 8-391.

4. Campbell D.K.G. Towards the Classification of Algorithmic Skeletons. Technical Report YCS 276. Department of Computer Science, University of York. York, 1996.

5. Cole M.I. Algorithmic Skeletons: Structured Management of Parallel Computation. Massachusetts, Cambridge. Boston: MIT Press, 1989.

6. Gamma E., Helm R., Johnson R., Vlissides J. Design Patterns: Elements of Reusable Object-Oriented Software. Reading-Amsterdam-Tokyo: Addison-Wesley, 1995.

7. Sinqh A., Schaeffer J., Szafron D. Views on template-based parallel programming /7 Proc. of CASCON’96. Toronto, 1996. C. 1-12.

8. Siu S. Openness and Extensibility in Design-Pattern-Based Parallel Programming Systems. Master of Applied Science Thesis. University of Waterloo. Ontario. Canada. Waterloo, 1996.

9. Siu S., De Simone М., Goswami D., Singh A. Design patterns for parallel programming // Parallel and Distributed Processing Techniques and Applications. California. Pasadena, 1996. C. 230-240.

10. MacDonald S. Design patterns in enterprise /7 Proc. of CASCON’96. Toronto, 1996. C. 1-10.

11. MacDonald S., Szafron D., Schaeffer J., Bromling S. Generating parallel program frameworks from parallel design patterns / /' Proc. of EuroPar’2000. Berlin: Springer-Ver lag, 2000. C. 95-104.

12. Abramov S., Adamovitch A., Kovalenko M. T-system: programming environment providing automatic dynamic parallelizing on IP-network of Unix-computers. Report on 4-th International Russian-Indian seminar and exibition. Sept. 15-25. Moscow, 1997.

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

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

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

© О.Н. Переславцева

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

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