120 likes | 349 Views
Преобразование программ на языке C-DVM в программы для кластеров. выполнила: студентка 527 группы Коваленко Алина Игоревна научный руководитель: профессор, д. ф.-м. н. Крюков Виктор Алексеевич Москва, 2012. Возможности описания параллельного выполнения программы на языке C-DVM.
E N D
Преобразование программ на языке C-DVM в программы для кластеров выполнила: студентка 527 группы Коваленко Алина Игоревна научный руководитель: профессор, д. ф.-м. н. Крюков Виктор Алексеевич Москва, 2012
Возможности описания параллельного выполнения программына языке C-DVM • распределение элементов массива между процессорами; • распределение витков цикла между процессорами; • спецификация параллельно выполняющихся секций программы (параллельных задач) и отображение их на процессоры; • организация эффективного доступа к удаленным (расположенным на других процессорах) данным; • организация эффективного выполнения редукционных операций - глобальных операций с расположенными на различных процессорах данными (например, суммирование или нахождение максимального или минимального значения).
программанаязыке C-DVM компилятор C-DVM этап 1 программа на языке C с вызовами функций библиотеки Lib-DVM компилятор C + коммуникационная библиотека MPI этап 2 исполняемый модуль Компиляция программы на языке C-DVM
Постановка задачи дипломной работы Создать компилятор C-DVM, который будет решать следующие задачи: • синтаксический и семантический анализ программы, генерация промежуточного представления; • преобразование прагм DVM в вызовы функций системы поддержки Lib-DVM; • генерация кода на языке C. Компилятор должен распознавать следующие конструкции: • описательные прагмы; • выполняемые прагмы. Должны быть заменены на вызовы соответствующих функций Lib-DVM; • неявные (т.е. не отмеченные явно DVM-прагмами): • создание и уничтожение распределенных массивов; • доступ к распределенным данным; • функции ввода-вывода; • инициализация и завершение параллельного выполнения.
Инструментальные системы для создания компиляторов Инструментальные системы: • DMS; • LLVM; • Sage++; • ROSE. Критерии: • портируемость инструментальной системы; • доступность; • наличие поддержки; • front-end и back-end для программ на языке C.
middle-end • дереворазбора исходный код • front-end ROSE • back-end ROSE целевой код • новоедереворазбора Архитектура инструментальной системы ROSE Система ROSE состоит из трёх основных частей: • front-end – лексический и синтаксический анализаторы, генерация внутреннего представления исходных кодов программы в виде AST; • middle-end – инструменты для анализа, оптимизации и трансформации дерева разбора программы; • back-end – генерация бинарных файлов или файлов на высокоуровневых целевых языках из внутреннего представления.
дерево разбора • дерево разбора + информация из прагм и данные о массивах • дерево разбора + информация из прагм прагмы DVM этап 1 • анализатор прагм • анализатормассивов • преобразование неявных конструкций, замена описательных и выполняемых прагм • новое дерево разбора + информация из прагм этап 2 • добавление вызовов функций для описательных прагм этап 3 middle-end • новое дереворазбора Схема работы компилятора C-DVM
Экспериментальное исследование. Текст программы на языке C-DVM Формат макросов Формат прагм #define DO(v,l,h,s) for(v=(l); v<=(h); v+=(s)) #define L 8 inti, j; DVM(DISTRIBUTE [BLOCK][BLOCK]) double A[L][L]; int main(int an, char **as) { printf(“SOR STARTED\n"); DVM(PARALLEL [i][j] ON A[i][j] ) DO(i, 0, L-1, 1) DO(j, 0, L-1, 1) { if(i==0 || j==0 || i==L-1 || j==L-1) A[i][j]=0.; else A[i][j]=1.+i+j; } return 0; } #define DO(v,l,h,s) for(v=(l); v<=(h); v+=(s)) #define L 8 inti, j; double A[L][L], B[L][L]; #pragmadvm distribute ([block][block] : A); int main(intargn, char **args) { printf(“SOR STARTED\n"); #pragmadvm parallel( [i][j] on A[i][j]) for (i = 0; i < L-1; i++) for (j = 0; j < L-1; j++) { if(i==0 || j==0 || i==L-1 || j==L-1) A[i][j]=0.; else A[i][j]=1.+i+j; } return 0; } double A[L][L], B[L][L]; #pragmadvm distribute ([block][block] : A); DVM(DISTRIBUTE [BLOCK][BLOCK]) double A[L][L]; #pragmadvm parallel ([i][j] on A[i][j]) DVM(PARALLEL [i][j] ON A[i][j])
Экспериментальное исследование. Выход компилятора C-DVM Существующий Реализованный #define L 8 static char _SOURCE_[]="jac1d.cdv"; #define MAIN_IS_HERE #include "cdvm_c.h” static char _SOURCE_[]="jac.c"; #define MAIN_IS_HERE #define L 8 #include "cdvm_c.h” #define DO(v,l,h,s) for(v=(l); v<=(h); v+=(s)) #define L 8 static char _SOURCE_[]=“sor1d.cdv"; #define MAIN_IS_HERE #include "cdvm_c.h“ long A [ 3 ] = { 0 } ; int main ( int an , char * * as ) { DVM_INIT ( 29 - 1 , an , as ) ; { {{ DVM_CREATE_TEMPLATE ( 23 , 0 , DVM_AMV , 2 , ( L , L ) ) ; DVM_MULTBLOCK ( 23 , DVM_AMV , 2 , ( 1 , 1 ) ) ; DVM_DISTRIBUTE ( 23 , DVM_AMV , 0 , 2 , ( 1 , 2 ) ) ; } DVM_MALLOC ( 23 , A , 2 , sizeof ( double ) , ( L , L ) , ( 1 , 1 ) , ( 1 , 1 ) , 3 ) ; DVM_ALIGN ( 23 , A , DVM_AMV , 2 , ( 1 , 2 ) , ( 1 , 1 ) , ( 0 , 0 ) ) ; } } dvm_void_printf ( “SOR STARTED\n" ) ; { DVM_PARALLEL ( 32 , 1 , 2 ) ; DVM_DO_ON ( 32 , 1 , 2 , ( 0 , 0 ) , ( 0 , 0 ) , ( L - 1 , L - 1 ) , ( 1 , 1 ) , A , 2 , ( 1 , 2 ) , ( 1 , 1 ) , ( 0 , 0 ) ) ; { DVM_DOPL ( 1 ) { DVM_FOR_1 ( 33 , 1 , i , 0 , DO ( i , 0 , L - 1 , 1 ) ) { DVM_FOR_1 ( 34 , 1 , j , 1 , DO ( j , 0 , L - 1 , 1 ) ) { ; { if ( i == 0 || j == 0 || i == L - 1 || j == L - 1 ) DVMda2 ( A , double , i , j ) = 0. ; else DVMda2 ( A , double , i , j ) = 1. + i + j ; } } } } } DVM_END_PARALLEL ( 32 , 1 ) ; } { DVM_RETURN ( 59 , 0 ) ; return 0 ; } } static char _SOURCE_[]=“sor1d.c"; #define MAIN_IS_HERE #define DO(v,l,h,s) for(v=(l); v<=(h); v+=(s)) #define L 8 #include "cdvm_c.h“ long A[3] = {0}; int main(intan,char **as) { DVM_INIT(28,an,as); { { { DVM_CREATE_TEMPLATE ( 23 , 0 , DVM_AMV , 2 , ( 8 , 8 )); DVM_MULTBLOCK (23 , DVM_AMV , 2 , ( 1 , 1 )); DVM_DISTRIBUTE(23,DVM_AMV,0,2, (1,2)); } DVM_MALLOC(23,A,2,sizeof(double ), (8,8), (1,1), (1,1),3); DVM_ALIGN(23,A,DVM_AMV,2, (1,2), (1,1), (0,0)); } } dvm_void_printf ( "SOR STARTED\n"); { DVM_PARALLEL(32,1,2); DVM_DO_ON ( 32 , 1 , 2 , ( 0 , 0 ) , ( 0 , 0 ) , ( ( 8 – 1 ) , ( 8 – 1 ) ) , ( 1 , 1 ) , A , 2 , ( 1 , 2 ) , ( 1 , 1 ) , ( 0 , 0 )); { DVM_DOPL(1) { DVM_FOR_1 ( 33 , 1 , i , 0 , DO ( i , 0 , ( 8 – 1 ) , 1 )) { DVM_FOR_1 (34 , 1 , j , 1 , DO ( j , 0 , ( 8 – 1 ) , 1)) { ; { if ((((i == 0) || (j == 0)) || (i == (8 - 1))) || (j == (8 - 1))) DVMda2(A,double,i,j) = 0.; else DVMda2(A,double,i,j) = ((1. + i) + j); } } } } } DVM_END_PARALLEL(32,1); } { DVM_RETURN(59,0); return 0;}} DVM_INIT(28,an,as); DVM_INIT ( 29 - 1 , an , as ) ; if ((((i == 0) || (j == 0)) || (i == (8 - 1))) || (j == (8 - 1))) DVMda2(A,double,i,j) = 0.; else DVMda2(A,double,i,j) = ((1. + i) + j); if (i== 0 || j == 0 || i == L - 1 || j == L - 1) DVMda2 ( A , double , i , j ) = 0. ; else DVMda2 ( A , double , i , j ) = 1. + i + j ;
Результаты Разработан компилятор, выполняющий следующие задачи: • анализирует текст входной программы в соответствии с синтаксисом языка C-DVM; • преобразует исходный код во внутреннее представление в виде абстрактного дерева разбора; • преобразует дерево разбора в соответствии с моделью DVM; • генерирует из внутреннего представления код на языке C. Были разработаны: • алгоритмы лексического и синтаксического анализа прагм DVM; • структуры для хранения информации, полученной из прагм DVM, из описаний распределяемых и выравниваемых массивов и из заголовков распределяемых циклов; • алгоритмы семантического анализа распределения данных и вычислений.
программа на языке C-DVMc DVM-указаниями в формате макросов программа на языке C-DVMc DVM-указаниями в формате прагм существующий компилятор C-DVM новый компилятор C-DVM этап 1 программа на языке C с вызовами функций библиотеки Lib-DVM компилятор C + коммуникационная библиотека MPI этап 2 исполняемый модуль Параллельные программы для вычислительных кластеров .