390 likes | 654 Vues
Методика распараллеливания программ в модели DVM Институт прикладной математики им. М.В.Келдыша РАН http://www.keldysh.ru/pages/dvm. Модель DVM. Высокоуровневая модель параллелизма без явной ориентации на общую или распределенную память
E N D
Методика распараллеливания программ в модели DVMИнститут прикладной математики им. М.В.Келдыша РАНhttp://www.keldysh.ru/pages/dvm
Модель DVM • Высокоуровневая модель параллелизма без явной ориентации на общую или распределенную память • Ориентация на пользователей в области. вычислительной математики. Основные понятия: дискретные пространства в декартовых координатах, отображения и пересечения пространств. • Язык распараллеливания в модели DVM - язык спецификаций масштабируемых параллельных программ.
Средства программирования • C-DVM = Язык Си + специальные макросы • Fortran-DVM = Язык Фортран + специальные • комментарии • Специальные комментарии и макросы являются высокоуровневыми спецификациями параллелизма в терминах последовательной программы • Отсутствуют низкоуровневые передачи данных и синхронизации • Последовательный стиль программирования • Спецификации параллелизма «невидимы» для стандартных компиляторов • Существует только один экземпляр программы для последовательного и параллельного счета
Состав DVM-системы • Компилятор C-DVM • Компилятор Fortran-DVM • Система поддержки параллельного выполнения (Lib-DVM) • DVM-отладчик • Анализатор производительности DVM-программ • Предсказатель производительности DVM-программ
Правило собственных вычислений: OWN(A[i]) - процессор, на который распределен A[i] A[i] = expr Оператор всегда выполняется на процессоре OWN(A[i]) Локализация данных: Операнды exprраспределены на процессор OWN(A[i])
Распараллеливание последовательной программы • Согласованное распределение массивов данных и параллельных циклов на массив виртуальных процессоров. Цель: максимум параллелизма и максимум локализации • Определение общих (не локальных данных) и их спецификация. Общие данные: данные, вычисляемые на одних процессорах и используемые на других процессорах.
Выполнение программы Модель: одна программа - множество потоков данных На всех процессорах - одна и та же программа Проба:свой - “чужой” оператор по правилу собственных вычислений
Абстрактная схема распределения данных и витков параллельных циклов Объекты: P - индексное пространство массива виртуальных процессоров, определяется пользователем и задается при запуске программы Ai- индексное пространство i-ого массива данных Lj- индексное пространство j-ого параллельного цикла
Директивы распределения устанавливают соответствие между точками (элементами) индексных пространств: ALIGN: Ai1=>Ai2Каждой точке (элементу) Ai2 ставится в соответствие подмножество точек (элементов) массива Ai1 PARALLEL: Lj=>AiКаждой точке (элементу) Ai ставится в соответствие подмножество точек (витков цикла)Lj DISTRIBUTE: Ai=>PКаждой точке (виртуальному процессору) Pставится в соответствие подмножество точек (элементов) массива Ai
Отображение последовательной программы PARALLEL Циклы Массивы PARALLEL ALIGN Массив задач DISTRIBUTE Массивы Массив виртуальных процессоров MAP DISTRIBUTE Физические процессоры
Распределение данныхDISTRIBUTE DVM(DISTRIBUTEf1…fk )<описание-массива-на-языке-Си> гдеfi = [ BLOCK ] - распределение равными блоками (распределенное измерение) [ ] - распределение целым измерением (локальное измерение) k - количество измерений массива P(m) - линейка виртуальных процессоров
Распределение данныхDISTRIBUTE Примеры: DVM(DISTRIBUTE[ BLOCK ]) float A[N]; DVM(DISTRIBUTE[ ]) float A[N]; DVM(DISTRIBUTE[ BLOCK ] [ ]) float B[N][N]; DVM(DISTRIBUTE[ ] [ BLOCK ] ) float B[N][N]; P(m1,m2)- массив виртуальных процессоров
Локализация данныхALIGN DVM( ALIGN a1…an WITH B b1…bm ) <описание-массива-A-на-языке-Си> гдеai - параметр i-го измерения выравниваемого массива А bj - параметр j-го измерения базового массива B n - количество измерений массива А m - количество измерений массива В ai = a[Idi] bj=[c*Idj +d] [ ] [ ] Idi, Idj - идентификаторы c, d - целочисленные константы
Локализация данныхALIGN Примеры: DVM(ALIGN[ i ] WITH B[ 2*i+1]) float A[N]; DVM(ALIGN[ i ] [ j ] WITH C[ j ] [ i ]) float D[N][N]; DVM( ALIGN[ i ] WITH C[ ] [ i ]) float E[N]; DVM( ALIGN[ i ] [ ] WITH B[ i ] ) float C[N][N];
Распределение витков циклаPARALLEL Макросы заголовков циклов: # define DO ( v, f, u, s )for(v=f; v<=u; v+=s) # define FOR ( v, h )for(v=0; v<=h-1; v+=1) Параллельный цикл - массив витков цикла • тесно-гнездовой цикл • прямоугольное индексное пространство • виток цикла - неделимый объект (выполняется на одном процессоре)
Распределение витков циклаPARALLEL DVM( PARALLEL [I1 ]… [ In ] ON A e1… em ) где Ij - индекс j-го заголовка параллельного цикла, n - количество заголовков цикла, m - количество измерений массива, A - идентификатор распределенного массива, ei = [a*Ik+b], a, b - целочисленные переменные
Распределение витков циклаPARALLEL Цикл не удовлетворяет требованиям массива витков цикла: Не тесно-гнездовой цикл FOR(i,N) { a=5.; FOR(j,N) { . . . } } Не прямоугольное индексное пространство FOR(i,N) DO(j,i,N,1) { . . . }
Распределение витков циклаPARALLEL Цикл не удовлетворяет требованиям массива витков цикла: Виток цикла на разных процессорах FOR(i,N) FOR(i,N) { D[2*i] = ...; { D[2*i] = ...; } D[2*i+1]= …; } FOR(i,N) {D[2*i+1]= …; } DVM(DISTRIBUTE[ BLOCK ][ BLOCK ]) float A[N+1][N+1], B[N][N]; FOR(i,N) FOR(j,N) { A[i+1][j+1] = …; B[i][j] = …; } DVM( ALIGN [ i ] [ j ] WITH A[i+1] [j+1] ) float B[N][N];
Общие (удаленные) данные • Сравнение индексных выражений по распределенным измерениям левой и правой части оператора присваивания • Выражение условного оператора - правая часть A[i] = (C[i] > D[i]) ? B[i] : 0.
Локализация данных DVM(DISTRIBUTE[ BLOCK ]) float A[N]; DVM( ALIGN [ i ] WITH A[ i ] ) float B[N],C[N]; DVM( PARALLEL [ i ] ON A[ i ] ) FOR( i, N ) { A[i] = B[i] + C[i] ; }
Локализация с помощьюTEMPLATE DVM(DISTRIBUTE[ BLOCK ]; TEMPLATE [N+d1+d2] ) void *TABC; DVM( ALIGN [ i ] WITH TABC[ i ] )float B[N]; DVM( ALIGN [ i ] WITH TABC[ i +d1] ) float A[N]; DVM( ALIGN [ i ] WITH TABC[ i +d1+d2] ) float C[N]; DVM( PARALLEL [ i ] ON A[ i ] ) FOR( i, N ) { A[i] = B[i-d1] + C[i+d2] ; }
Схема отображения ALIGN P1 P2 P3 P4 TABC B d1 A d1+d2 C
Общие данные типаSHADOW DVM(DISTRIBUTE[ BLOCK ] ) float A[N]; DVM( ALIGN [ i ] WITH A[ i ]; SHADOW [d1:d2])float B[N]; DVM( PARALLEL [ i ] ON A[ i ] ; SHADOW_RENEW B) DO( i,d1, N-d2-1,1 ) { A[i] = B[i-d1] + B[i+d2] ; }
Общие данные типаACROSS DVM(DISTRIBUTE[ BLOCK ]; SHADOW [d1:d2]) float A[N]; DVM( PARALLEL [ i ] ON A[ i ] ; ACROSS A[d1:d2]) DO( i,d1, N-d2-1,1 ) { A[i] = A[i-d1] + A[i+d2] ; }
Общие данные типаREMOTE_ACCESS DVM(DISTRIBUTE[ BLOCK ]) float A[N] , C[2*N]; DVM( PARALLEL [ i ] ON A[ i ] ; REMOTE_ACCESS C[5] C[i+N] ) FOR( i, N ) { A[i] = C[5] + C[i+N] ; }
Общие данные типаREDUCTION DVM(DISTRIBUTE[ BLOCK ]) float A[N]; DVM( PARALLEL [ i ] ON A[ i ] ; REDUCTION SUM (s)) FOR( i, N ) { s = s + A[i] ; } DVM(DISTRIBUTE[ BLOCK ]; TEMPLATE [N] ) void *TM; DVM( PARALLEL [ i ] ON TM[ i ] ; REDUCTION PRODUCT (sm)) FOR( i, N ) { sm = sm * i ; }
Параллельный цикл • Левая часть: распределенный массив, редукционная переменная, приватная переменная. • Распределенный цикл => распределенное измерение • Локальный цикл =>локальноеизмерение
Параллелизм по гиперплоскостямCDVM$ DISTRIBUTE A (BLOCK,BLOCK) j i t1 t2 t3
t2 t3 t4 t5 t6 t7 t2 t3 t4 t5 t6 t7 t8 t3 t4 t5 t6 t7 t8 Конвейерный параллелизмCDVM$ DISTRIBUTEA (BLOCK,*) j i t1 p0 p1 t9 p2
Оптимизация 1. Совмещение вычислений и доступа к общим данным 2. Избыточные вычисления вместо общих данных SHADOW 3. Асинхронное копирование вместо общих данных REMOTE
Спецификация обновления значений общих данных • Перед циклом использования • Между циклом вычислений и циклом использования • Матрица цикл-массив ({use,def}) • Порядок выполнения циклов (граф управления)
Совмещение вычислений и доступа к общим данным DVM(CREATE_SHADOW_GROUP grshad: A); . . . DVM(SHADOW_START grshad ); . . . DVM(PARALLEL [ i ] [ j ] ON A[ i ] [ j ]; SHADOW_WAIT grshad ) DO(i,1,L-2,1) DO(j,1,L-2,1) B[i][j] = (A[i-1][j]+A[i+1][j]+A[i][j-1]+A[i][j+1])/4;
Избыточные вычисления DVM(PARALLEL [i] ON A[i]; SHADOW_COMPUTE) FOR(i,n) A[i] = i; DVM(PARALLEL [i] ON A[i] ) DO(i,1,n-2,1) C[i] = A[i-1] +A[i+1];
Асинхронное копирование секций массивов k = N/4 - 1; FOR (i, N-1) FOR (j, N-1) A[ i+k ] [ j+k ] = f( A[ 2*i ] [ 2*j ] ) ; 2N N 2N N
DVM(DISTRIBUTE[ BLOCK ][ BLOCK ] ) float A[2*N][2*N]; DVM(ALIGN [ i ] [ j ] WITH A[ i] [ j ] ) float B[2*N][2*N]; DVM( COPY_FLAG) void *flagS; k = N/4 - 1; DVM( PARALLEL [ i ] [ j ] ON B[2*i] [2*j] ) FOR (i, N-1) FOR (j, N-1) B[ 2*i ] [ 2*j ] = f( A[ 2*i ] [ 2*j ] ) ; DVM( COPY_START &flagS) FOR (i, N-1) FOR (j, N-1) A[ i+k ] [ j+k ] =B[ 2*i ] [ 2*j ] ; DVM( COPY_WAIT &flagS)