Граф-схемное потоковое параллельное программирование (Граф-схемное потоковое параллельное программирование 2), страница 7
Описание файла
Файл "Граф-схемное потоковое параллельное программирование" внутри архива находится в папке "Граф-схемное потоковое параллельное программирование 2". PDF-файл из архива "Граф-схемное потоковое параллельное программирование 2", который расположен в категории "". Всё это находится в предмете "параллельные системы и параллельные вычисления" из 9 семестр (1 семестр магистратуры), которые можно найти в файловом архиве НИУ «МЭИ» . Не смотря на прямую связь этого архива с НИУ «МЭИ» , его также можно найти и в других разделах. Архив можно найти в разделе "остальное", в предмете "параллельные системы и параллельные вычисления" в общих файлах.
Просмотр PDF-файла онлайн
Текст 7 страницы из PDF
Данная библиотека может далее использоваться для реализации любого модуляна этом языке программирования. Библиотека предоставляет программисту модулейфункции высокого уровня, такие как запись данных на конъюнктивную группу выходов,завершение процесса граф-схемы и т.д. Подобная стратегия (рис. 14) позволяетпрограммировать модули на разных языках программирования и даёт возможность выборанаиболее подходящего языка.Рис.
14. Взаимодействие процесса модуля с системойВзаимодействие между локальными компонентами системы управленияосуществляется при помощи протокола TCP/IP посредством передачи сообщенийопределённого формата. Каждое сообщение имеет имя и тело сообщения. При получениисообщения компонент системы Service Manager по имени сообщения определяет сервис,которому предназначено это сообщение и передаёт его найденному сервису, которыйвыполняет обработку данного события. Список сообщений, обрабатываемых сервисом,предоставляется системе самим сервисом. По такому же сценарию проходит взаимодействиесистемы с модулями и внешними системами. У каждого типа сообщений есть наборметаданных, который включает вид возможных отправителей для данного сообщения:локальный компонент системы, модуль или внешняя система.Функции системы по управлению выполнением граф-схем распределены междунесколькими сервисами.
Набор этих сервисов должен присутствовать на каждом узлекластера, участвующем в вычислениях. Список данных сервисов следующий:− сервис выполнения. Данный сервис отвечает за запуск граф-схем, управлениепроцессами, индуцируемыми при выполнении. Этот сервис осуществляет также всевзаимодействия между процессами модулей, получает запросы на выполнениефункций WRITE, READ, CHECK, KILL, OUT, KILL,− сервис управления буферами. Данный сервис реализует функции WRITE, READ,CHECK и OUT,− сервис планирования.
Осуществляет планирование выполнения граф-схемы, а именноопределяет узлы кластера, на которых будут выполняться процессы модулейДля того чтобы понять принципы взаимодействия данных сервисов, приведёмнесколько сценариев:Запуск граф-схемы: Пользователь инициирует команду запуска граф-схемы, котораяпередаётся на выполнение сервису выполнения.
Этот сервис создаёт контекст выполненияграф-схемы. Контекст содержит идентификатор контекста и имя граф-схемы. Контекстнеобходим для того, чтобы пользователь имел возможность выполнять несколько граф-схемв системе.Запись данных на висящие входы граф-схемы: Пользователь инициирует командузаписи данных на висящие входы граф-схемы, которая перенаправляется сервисувыполнения. Сервис выполнения определяет контекст выполнения и запрашивает у сервисапланирования узел кластера или компьютер, на котором должен располагаться буфер дляданного модуля.
На указанном узле или компьютере создаётся буфер и в него записываютсяданные. Данные действия выполняет сервис управления буферами на этом узле.Запись данных в буфер: При записи данных сервис управления буферами проверяетналичие в буфере готовых кортежей данных. Если в буфере есть кортеж, данный сервиссообщает об этом сервису управления. После получения уведомления от сервиса управления20буферами о наличии готового кортежа данных, сервис выполнения запрашивает у сервисапланирования компьютер, на котором должен выполняться процесс для этого набораданных.
Далее сети сервис выполнения запускает процесс модуля по соответствующейконъюнктивной группе входов.ЗаключениеВ настоящее время завершена разработка инструментальной среды и созданэкспериментальный вариант программных средств для параллельного выполнения накластерных системах.Этот экспериментальный вариант системы управления реализован на языкепрограммирования JAVA. Выбор языка Java обусловлен в первую очередь такимтребованием к системе, как поддержка различных операционных систем.
К плюсам данногоязыка программирования можно отнести поддержку параллельного программирования исинхронизации, а также простоту документирования системы. Минусом является то, чтопрограммы на языке Java работают медленнее, чем программы на таких языкахпрограммирования как C/C++.
В дальнейшем предполагается перепрограммированиекритических компонентов системы или всей системы на более “быстрых” языкахпрограммирования для нескольких популярных операционных систем, в частности дляплатформ Win32 и Unix/Linux.Отметим, что средства описания потоковых вычислений, реализованные в ЯГСПП,уже эффективно использовались для построения программного обеспечения распределенныхсистем: гибких автоматизированных систем [22], систем управления военными действиями идр. По-видимому, они могут оказаться также вполне конкурентоспособными при реализациираспределенных вычислений, представляемых в виде объектно-ориентированных программ.Для этого достаточно сравнить средства языка UML и ЯГСПП для описания параллельной ираспределенной обработки информации.Приложение 1. Примеры программ на ЯГСПП1. Использование пространственного параллелизмаПостроим ГСПП решения нелинейного уравнения xраций с заданной точностью ε и начальным приближением х0.ГС программы:= ae x + bx 3 − c x методом простых ите-GenDataГенерация исх.
данныхMult1Умножение a на exMult2Умножение b на x3CheckCondПроверка критерияокончания вычисленийOutputВывод результата21Mult3Умножение c на √xНа ГС модуль GenData задает значения x0 и ε и передает их на входы модуля CheckCond, а значения a,b, c на входы модулей Mult1, Mult2, Mult3 соответственно. Начальное значение x0 передается на входы модулейMult1, Mult2, Mult3, CheckCond. Модули Mult1, Mult2, Mult3 перемножают передаваемые им данные иотправляют результаты на входы модуля CheckCond, который в свою очередь вычисляет новое приближение,когда сравнивает его со старым и, в зависимости от результата сравнения, либо передает полученный результатна следующую итерацию, либо результат передается модулю Output.
В данном примере модули Mult1, Mult2,Mult3 являются информационно-независимыми и поэтому могут выполняться параллельно.Описание подпрограмм каждого модуля на языке C:Модуль GenData:void startup(){float data[5];int place[5] = {1,2,3,4,5};GenFloat(data[0],100);GenFloat(data[1],100);GenFloat(data[2],100);GenFloat(data[3],10);GenFloat(data[4],0.1);out(1,0,place,data);}void GenFloat(float &x,float p){x=(float)rand()/(float)RAND_MAX;x*=p;}Модуль Mult1:void Multiplication1(int tag,float x1,float x2){float data[2];data[0] = x1;data[1] = x1*exp(x2);//вычисление а * ехint place[2] = {1,2};out(1,0,place,data);}Модуль Mult2:void Multiplication2(int tag,float x1,float x2){float data[2];data[0] = x1;data[1] = x1*pow(x2,3); //вычисление b * х3int place[2] = {1,2};out(1,0,place,data);}Модуль Mult3:void Multiplication3(int tag,float x1,float x2){float data[2];data[0] = x1;data[1] = x1*pow(x2,0.5); //вычисление c * √xint place[2] = {1,2};out(1,0,place,data);}Модуль CheckCond:void Eval(int tag,float x1,float x2,float x3,float x4,float x5){float xnew,data1[2],data2[1];xnew = x2 + x3 - x4;//вычисление новой итерацииint place1[2] = {1,2},place2[1] = {1};if(fabs(xnew-x1)<x5)//проверяем критерий окончания{data1[0] = xnew; data1[1] = x5;out(1,0,place1,data1);22}else{data2[0] = xnew;out(2,0,place2,data2);}}void StartEval(int tag,float x1){int place[1] = {1};float data[1];data[0] = x1;out(1,0,place,data);}Модуль Output:void PrintRes(int tag,float x1){printf(“Корень уравнения равен %d”,x1)}2.
Использование параллелизма SIMD – применения одной программы кмножеству различных данныхПустьтребуетсяорганизоватьодновременноерешениемножествауравненийx = a i e + bi x − c i x (i=1,..,n) методом простых итераций с заданной точностью ε и начальнымx3приближением х0.Графическое и текстовое представления ГС в данном случае аналогично соответствующимпредставлениям в примере 1.Т.к.
в данном примере необходимо осуществить одновременное решение множества уравнений,воспользуемся механизмом тегирования данных. Для однозначной идентификации наборов данных будемсопоставлять с каждым набором уникальный тег, который будет «приклеен» к “порождаемым” в процессевычислений данным. При межмодульном взаимодействии в процессе выполнения ГСПП, тег передается вместес набором данных, который он идентифицирует.Рассмотрим, как изменится описание подпрограмм каждого модуля, описываемых на языке C:Модуль GenData:void startup(){float data[5];int place[5] = {1,2,3,4,5};//GenFloat – генерирует случайное вещественное число в промежутке от 1 до NGenFloat(data[0],100);GenFloat(data[1],100);GenFloat(data[2],100);GenFloat(data[3],10);GenFloat(data[4],0.1);int TAG = GenTag(); //Генерируем новый уникальный тегout(1,TAG,place,data); //Связываем тег с данными и передаем их на выход КГВых модуля}void GenFloat(float &x,float p){x=(float)rand()/(float)RAND_MAX;x*=p;}Модуль Mult1:void Multiplication1(int tag,float x1,float x2){float data[2];data[0] = x1;data[1] = x1*exp(x2);//вычисление а * ехint place[2] = {1,2};out(1,tag,place,data);//Выходные данные передаем с тем же тегом, с которым были получены входные данные23}Модуль Mult2:void Multiplication2(int tag,float x1,float x2){float data[2];data[0] = x1;data[1] = x1*pow(x2,3); //вычисление b * х3int place[2] = {1,2};out(1,tag,place,data); //Выходные данные передаем с тем же тегом, с которым были получены входные данные}Модуль Mult3:void Multiplication3(int tag,float x1,float x2){float data[2];data[0] = x1;data[1] = x1*pow(x2,0.5); //вычисление c * √xint place[2] = {1,2};out(1,tag,place,data); //Выходные данные передаем с тем же тегом, с которым были получены входные данные}Модуль CheckCond:void Eval(int tag,float x1,float x2,float x3,float x4,float x5){float xnew,data1[2],data2[1];xnew = x2 + x3 - x4;//вычисление новой итерацииint place1[2] = {1,2},place2[1] = {1};if(fabs(xnew-x1)<x5)//проверяем критерий окончания{data1[0] = xnew; data1[1] = x5;out(1,tag,place1,data1); //Выходные данные передаем с тем же тегом, с которым были получены входныеданные}else{data2[0] = xnew;out(2,tag,place2,data2); //Выходные данные передаем с тем же тегом, с которым были получены входныеданные}}void StartEval(int tag,float x1){int place[1] = {1};float data[1];data[0] = x1;out(1,tag,place,data); //Выходные данные передаем с тем же тегом, с которым были получены входные данные}Модуль Output:void PrintRes(int tag,float x1){printf(“Корень уравнения равен %d”,x1)}3.
Использование потокового параллелизмаСледующий пример иллюстрирует использование потокового параллелизма в задаче нахожденияNскалярного произведения двух N-мерных векторов (т.е. вычисления∑a bi =1i i). Предполагается, что в модулеGenN осуществляется задание значения N, которое передается на входы модулей GenA, GenB и Sum. МодулиGenA и GenB генерируют значения ai и bi (i=1,..,n) соответственно, которые последовательно (асинхронно)передаются на входы модуля MultAB.