Московский Государственный Университет им. М.В. Ломоносова, факультет ВМиК Прототип системы автоматического распараллеливания “Parus” Докладчик: Алексей Сальников salnikov@angel.cs.msu.su Цели проекта Выяснить возможность программирования в терминах графов. Разработать набор программных утилит, для этой цели. Исследовать возможность автоматического распараллеливания. Предлагаемый подход По программе на языке C строится граф алгоритма. for(i=0i<10;i++) { … По графу и данным о производительности процессоров и сети строится расписание. Граф преобразуется в программу с MPI вызовами. Полученная программа выполняется на процессорах. Программа на MPI Предлагаемый подход Человек пишет программу в терминах графа изначально. По графу и данным о производительности процессоров и сети строится расписание. Граф преобразуется в программу с MPI вызовами. Полученная программа выполняется на процессорах. Программа на MPI Компоненты и связи C программа parser network_test Граф алгоритма Исходные коды узлов графа graph2c++ graph2sch Исходные коды ядра инструментальной системы Расписание compiler Многопроцессорная система Результаты работы программы. Скорости передачи данных processor_test Производите льность процессоров viewer parser – по C программе строит граф алгоритма. graph2c++ – по графу алгоритма строит программу на C++ с MPI вызовами. graph2sch – по графу алгоритма и результатам тестов строит статическое расписание выполнения программы на многопроцессорной системе. network_test – производит тестирование коммуникаций в многопроцессорной системе. processor_test – производит тестирование процессоров в многопроцессорной системе. viewer – отображает граф алгоритма на мониторе компьютера. compiler – обычный компилятор MPI с помощью которого компилируется программа. Автоматическое получение графа алгоритма. source Анализатор Граф Пример 1 Текст исходной программы for(a=0; a<4; a++) d[a] = a*a; b = 1; a = b+2; c = d[2]*b/a; Пример 1 Визуальное представление графа d[0]=0; d[1]=1; d[2]=4; a=b+1; c=d[2]*b/a; d[3]=9; b=1; Понятие графа алгоритма. Граф алгоритма - ориентированный, с пометками на дугах и вершинах. Направление дуги задает порядок следования операторов, метка - передаваемые данные. Граф алгоритма - сильно ацикличен: Отсутствуют дуги между вершинами одного яруса Отсутствуют дуги “снизу-вверх” - от вершин яруса с большим номером к вершинам яруса с меньшим номером. Ярусы нумеруются по возрастанию. Метки (операторы) вершин, расположенных в одном ярусе могут быть выполнены одновременно. при отображении на мультипроцессор. Узел графа сложный, в вычислительном смысле, набор операторов. Операторы узла графа явно обращаются только к локальной памяти процессора многопроцессорной системы. Операторы узла графа, выполняются только в тот момент времени, когда получены все данные, входящие в вершину графа по дугам графа. Данные по дугам могут приходить в произвольном порядке, асинхронно. Типы информационных зависимостей Прямая зависимость по данным «out-in» Обратная зависимость по данным «in-out» Зависимость по выходам «out-out» Прямая информационная зависимость Самый простой и очевидный тип зависимости между операторами: первый меняет данные, второй - читает измененные данные. Меняем «a» a = 1; «a» Читаем «a» b=a+1; Обратная информационная зависимость Первый читает данные, второй - меняет данные. Очевидно, порядок менять нельзя - изменится результат. Передача данных не происходит. Читаем «a» b=a+1; «» Меняем «a» a = 1; Зависимость по выходам Это тип зависимости возникает при повторном изменении данных. Последовательный вариант a = 1; a=1 a = 1; a=2 a=2; Параллельный вариант a = 2; aa = = 2? Зависимость по выходам без передачи данных Подобный тип зависимости может вызывать передачу данных, однако не всегда. Присваиваем 1 a = 1; Нет передачи Присваиваем 2 a=2; Узел графа алгоритма head – код содержит описания переменных и начальную инициализацию данных необходимых узлу. Время head body – код выполняемый после получения всех необходимых данных. tail – код содержит действия по подчистке памяти и утилизации данных. Приём данных по рёбрам body Упаковка данных для передачи tail Граф алгоритма и переменные программы. Все переменные, общие для различных узлов графа, должны быть описаны глобально. В специальном узле графа (root) должна быть описана та часть программы, которая должна быть выполнена на всех процессорах до вызова узлов графа алгоритма. В специальном узле графа алгоритма (tail) должна быть описана та часть программы, которая должна быть выполнена перед завершением программы. Переменные необходимые только данному узлу графа должны быть описаны в поле (head) узла графа алгоритма. Расписание исполнения графа алгоритма. Описание Расписания Список элементов si=(Ti, Pi, ti), где: Ti – задача, описанная в вершине графа. Pi – процессор, исполняющий задачу Ti ti – время старта задачи Ti. Требования к рассписанию. Расписание должно быть допустимым 1) 2) 2 узла графа не могут быть одновременно вызваны на одном процессоре, должен соблюдаться порядок приёма и передачи данных. Расписание должно быть минимальным (или близким к минимальному) 1) быть таким, что программа построенная по графу выполнится за минимальное время. Процесс исполнения графа алгоритма на многопроцессороной системе. Функции управляющего процессора. Определяет какие узлы графа на каком процессоре вызвать. Определяет по каким рёбрам графа пора вести передачу данных, а по каким нет. Определяет закончена ли передача данных по тому или иному ребру и посылает сигнал об освобождении буферов памяти. Функции остальных процессоров. Инициализируют передачу данных другим процессорам по команде от управляющего процессора. Вызывают узел графа. В узле графа принимают данные по ребрам от других узлов графа на других процессорах. Выполняют код узла. Накапливают в памяти выработанные данные необходимые другим узлам графа. Узлы графа. Рёбра графа Расписание процессорами. Processor 0 Processor 1 Processor 2 NODE_CLE AN Regime (NODE) NODE_ QUESTION (0) NODE_CLE AN Regime (NODE) NODE_ QUESTION (1) NODE_CLE AN Regime (EDGE) Edges_send (E=1,P=2) Regime (NODE) NODE_ QUESTION (2) DATA (E=1) RECV_INFO RECV_INFO EDGES_PLACE Recv_edge_finished (E=1) NODE_CLE AN Regime (EDGE) Edges_send (E=2,P=1) EDGES_PLACE DATA (E=2) Recv_edge_finished (E=2) NODE_CLE AN Regime (STOP) Regime (STOP) Тестирование многопроцессорной системы. Тесты производительности процессоров и сети. Производительность процессора проверяется на неоднократном локальном перемножении матриц фиксированной размерности. Производительность сети измеряется на обменах типа точка - точка в 4-х различных режимах: Режимы тестирования сети Замер времени блокированного приёма сообщения. Замер времени между посылкой и приёмом сообщения той же длинны, отправляемого процессором по приёму первого. Processor i Processor j Processor i Processor j Замер времени в случае одновременной передачи сообщений навстречу друг другу. Замер времени между инициализацией приёма и приёмом сообщения от процессора в случае общения всех со всеми. Processor i Processor k Processor j Processor l Представление результатов тестов. Производительность процессоров представляется в виде вектора. Производительность сети представляется в виде набора матриц по длинам сообщений, где элемент матрицы – среднестатистическое время передачи сообщения между процессорами. Результаты Результаты Разработана структура и набор программных утилит. Проведены некоторые элементарные тесты показывающие работоспособность системы в целом. Выявлен ряд существенных недостатков, которые помогли определить стратегию развития системы в будующем. Пример 2 (поиск минимума в wav файле) Пример 2 (поиск минимума в wav файле) Перспективы и пути развития. Что предполагается сделать в будущем. Изменить узел графа алгоритма, с целью борьбы с детерменизмом. Усовершенствовать редактор графа алгоритма, с целью предоставления возможности редактирования графа через графический интерфейс. Подключение всей системы в целом как узла GRID (Подключение авторизации, и набора эталонных задач). Добавить циклы и условное ветвление. Добавить перепланировщик графа, который будет учитывать особенности архитектуры. Узел графа алгоритма (в будущем. ) code – код содержит описания переменных и начальную инициализацию данных необходимых узлу, обработку данных, утилизацию данных если они больше не нужны. Data change block – код связанный с получением или передачей данных. Генерируется автоматически . Время code Data change block code Data change block code Data change block Авторы приносят благодарности члену корреспонденту РАН, профессору Льву Николаевичу Королёву и доктору физ. мат. наук, доценту Нине Николаевне Поповой за консультации при создании данной системы. Данная работа выполняется в рамках студенческой лаборатории Intel МГУ. При поддержке гранта РФФИ 02-07-90130 и гранта РФФИ 02-07-06104. Спасибо за внимание salnikov@angel.cs.msu.su