Upload
chuong
View
82
Download
0
Embed Size (px)
DESCRIPTION
Методика распараллеливания программ в модели DVM Институт прикладной математики им. М.В.Келдыша РАН http://www.keldysh.ru/pages/dvm. Модель DVM. Высокоуровневая модель параллелизма без явной ориентации на общую или распределенную память - PowerPoint PPT Presentation
Citation preview
Методика распараллеливания программ в модели DVM
Институт прикладной математики
им. М.В.Келдыша РАН
http://www.keldysh.ru/pages/dvm
Модель DVM
Высокоуровневая модель параллелизма без явной ориентации на общую или распределенную память
Ориентация на пользователей в области. вычислительной математики. Основные понятия: дискретные пространства в декартовых координатах, отображения и пересечения пространств.
Язык распараллеливания в модели DVM - язык спецификаций масштабируемых параллельных программ.
Средства программирования
C-DVM = Язык Си + специальные макросыFortran-DVM = Язык Фортран + специальные
комментарии Специальные комментарии и макросы являются высокоуровневыми спецификациями параллелизма в терминах последовательной программы Отсутствуют низкоуровневые передачи данных и синхронизации Последовательный стиль программирования Спецификации параллелизма «невидимы» для стандартных компиляторов Существует только один экземпляр программы для последовательного и параллельного счета
Компилятор C-DVM Компилятор Fortran-DVM Система поддержки параллельного
выполнения (Lib-DVM) 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
PARALLELALIGN
DISTRIBUTE
DISTRIBUTE MAP
Распределение данных DISTRIBUTE
DVM( DISTRIBUTE f1…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 P4TABC
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 ; }
Параллельный цикл
• Левая часть: распределенный массив, редукционная переменная, приватная переменная.
• Распределенный цикл => распределенное измерение
• Локальный цикл => локальное измерение
Программа JACOBI на C-DVM
Программа JACOBI на C-DVM
Distribution of array A [8][8]
Программа SOR на C-DVM
Параллелизм по гиперплоскостямCDVM$ DISTRIBUTE A (BLOCK,BLOCK)j
i
t1
t2
t3
Конвейерный параллелизмCDVM$ DISTRIBUTE A (BLOCK,*)
p0
p1
p2
j
it1 t2
t2
t3
t3
t3
t4
t4
t4
t5
t5
t5
t6
t6
t6
t7
t7
t7
t8
t8 t9
Оптимизация
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
N2N
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)