Доклад Кулагина И.И., Пазникова А.А., Курносова М.Г. "Оптимизация информационных обменов в параллельных PGAS-программах" на 3-й Всероссийской научно-технической конференции «Суперкомпьютерные технологии» (СКТ-2014)
29 сентября – 4 октября 2014 г., с. Дивноморское
1. Кулагин И.И., ПазниковА.А., КурносовМ.Г.
Институт физики полупроводников им. А.В. РжановаСО РАН
Оптимизация информационных обменов в параллельных PGAS-программах
3-я Всероссийская научно-техническая конференция «Суперкомпьютерные технологии» (СКТ-2014)
29 сентября –4 октября 2014 г., с. Дивноморское
2. Общая память(PThreads, OpenMP, Cilk)
Распределённая память(MPI)
P
P
P
Разделяемое общее адресное пространство (Partitioned Global Address Space –PGAS)
P
M
Задача (процесс, поток)
Память (адресное пространство)
Доступ к памяти
Передача сообщений
•X10
•Chapel
•UPC
•Titanium
•Co-array Fortran
•HPF
Программные модели вычислительных систем
2
P
M
P
P
P
M
P
M
P
M
3. 3
Глобальное разделённое адресное пространство (PGAS)
HPF, Co-array Fortran, Titanium, UPC, IBM X10, Cray Chapel
4. Основные программные конструкции PGAS-языков
4
begin S–асинхронное выполнение инструкций Sв отдельном потоке на вычислительном узле, с которого вызвана конструкция
on iS–выполнение инструкций Sна узле i
on x S–выполнение инструкций Sна том узле, в памяти которого находится объект x
coforallS–выполнение каждой итерации тела Sцикла в независимом потоке
sync T–синхронизациягруппы потоков T
5. Основные программные конструкции PGAS-языков
5
begin S–асинхронное выполнение инструкций Sв отдельном потоке на вычислительном узле, с которого вызвана конструкция
Вычислительныйузел i
begin {
stmt1
stmt2
…
stmtk
}
…
stmt1
stmt2
…
stmtk
6. Основные программные конструкции PGAS-языков
6
on iS–выполнение инструкций Sна узле i
Вычислительныйузел j
Вычислительныйузел i
on i{
stmt1
stmt2
…
stmtk
}
stmt1
stmt2
…
stmtk
7. Основные программные конструкции PGAS-языков
7
coforallS–выполнение каждой итерации тела Sцикла в независимом потоке
Вычислительныйузел i
coforall{
stmt1
stmt2
…
stmtk
}
…
stmt1
stmt2
…
stmtk
stmt1
stmt2
…
stmtk
stmt1
stmt2
…
stmtk
…
8. Основные программные конструкции PGAS-языков
8
sync T–синхронизациягруппы потоков T
Вычислительныйузел i
stmt1
stmt2
…
stmtk
stmt1
stmt2
…
stmtk
Вычислительныйузел j
barrier T
…
stmt1
stmt2
…
stmtk
stmt1
stmt2
…
stmtk
…
9. Основные программные конструкции PGAS-языков
9
Параллелизм уровня потоков
порождение задач (begin, on)
параллельные циклы (coforall)
примитивы синхронизации (sync)
Параллелизм уровня данных
коллективные операции (редукция, префиксная сумма) над массивами
распределённые структуры(проблемы размещения, оптимизация доступа)
10. Основные программные конструкции PGAS-языков
10
Параллелизм уровня потоков
порождение задач (begin, on)
параллельные циклы (coforall)
примитивы синхронизации (sync)
Параллелизм уровня данных
коллективные операции (редукция, префиксная сумма) над массивами
распределённые структуры(проблемы размещения, оптимизация доступа)
1
2
32. 32
Объявление массивов в IBM X10
x10.lang.Rail[T]
Одномерныймассив с элементами типа T
Индексы типа Long
Базовый класс для массивов
x10.regionarray.Array[T]
Многомерныймассива с элементами типа T
Основан на Rail массиве
33. varb:
Long = a(k);
// ...
33
Операции над распределёнными массивами в IBM X10
Вычислительныйузел j
Вычислительныйузел i
vala:Array[Long];
at(Place.place(i))
{
varb:
Long =a(k)
// ...
}
Доступ к элементам удалённого массива
Копирование всего массива a
34. varb:
Long = a(k);
// ...
34
Операции над распределёнными массивами в IBM X10
Вычислительныйузел j
Вычислительныйузел i
vala:Array[Long];
for(iin 0..N) {
at(Place.place(i))
{
varb:
Long =a(k)
// ...
}
}
Циклический доступ к элементам удалённого массива
35. varb:
Long = a(k);
// ...
35
Операции над распределёнными массивами в IBM X10
Вычислительныйузел j
Вычислительныйузел i
vala:Array[Long];
for(iin 0..N) {
at(Place.place(i))
{
varb:
Long =a(k)
// ...
}
}
Циклический доступ к элементам удалённого массива
Копирование всего массива a
36. 36
Копирование удалённых массивов как узкое место
1
valA:Array[Long] =
2
new Array[Long](length, (i:Long) => i);
3
4
finish {
5
for (iin 0..(length –1)) {
6
valplaceId:Long= i%
7
Place.MAX_PLACES;
8
at (Place.place(placeId)) async{
9
valtmpA= A(i);
10
...
11
}
12
}
13
}
37. 37
Копирование удалённых массивов как узкое место
1
valA:Array[Long] =
2
new Array[Long](length, (i:Long) => i);
3
4
finish {
5
for (iin 0..(length –1)) {
6
valplaceId:Long= i%
7
Place.MAX_PLACES;
8
at (Place.place(placeId)) async{
9
valtmpA= A(i);
10
...
11
}
12
}
13
}
38. 38
Копирование удалённых массивов как узкое место
1
valA:Array[Long] =
2
new Array[Long](length, (i:Long) => i);
3
4
finish {
5
for (iin 0..(length –1)) {
6
valplaceId:Long= i%
7
Place.MAX_PLACES;
8
at (Place.place(placeId)) async{
9
valtmpA= A(i);
10
...
11
}
12
}
13
}
39. 39
Копирование удалённых массивов как узкое место
1
valA:Array[Long] =
2
new Array[Long](length, (i:Long) => i);
3
4
finish {
5
for (iin 0..(length –1)) {
6
valplaceId:Long= i%
7
Place.MAX_PLACES;
8
at (Place.place(placeId)) async{
9
valtmpA= A(i);
10
...
11
}
12
}
13
}
40. 40
Копирование удалённых массивов как узкое место
Вычислительныйузел i
tmpA= A(i)
Вычислительныйузел j
Вычислительныйузелk
A: a[1], a[2],
..., a[n]
tmpA= A(i)
tmpA: ...
tmpA= A(i)
tmpA: ...
41. 41
Копирование удалённых массивов как узкое место
Вычислительныйузел i
tmpA= A(i)
Вычислительныйузел j
Вычислительныйузел k
A: a[1], a[2],
..., a[n]
tmpA= A(i)
tmpA: ...
tmpA= A(i)
tmpA: ...
Копирование всего массива на каждой итерации цикла
42. 42
Копирование удалённых массивов как узкое место
Вычислительныйузел i
tmpA= A(i)
Вычислительныйузел j
Вычислительныйузел k
A: a[1], a[2],
..., a[n]
tmpA= A(i)
tmpA: ...
tmpA= A(i)
tmpA: ...
Копирование всего массива на каждой итерации цикла
Алгоритм Scalar replacement?
46. 46
Алгоритм ArrayPreloadоптимизациидоступа к удалённым массивам
Вычислительныйузел i
for() {
}
Вычислительныйузел j
Вычислительныйузел k
A
sharedA(0) = A
for() {
}
sharedA(j) = A
for() {
}
sharedA(i) = A
Копирование массива один раз перед выполнением цикла
47. Функциональная структура компилятора IBM Х10
47
X10 Runtime
X10 Application
X10 Class Libs
Front End
AST optimizationsAST-lowering
.cu
C++
Java
g++/xlC
g++/xlC
javac
Native Back End
Java Back End
Executable
Bytecode
X10 Runtime
X10 Runtime C++ Natives
X10 AST
JVM
X10 AST (Abstract Syntax Tree)
X10 Runtime
X10 Runtime Java Natives
Источник: http://x10.codehaus.org/X10+Day
48. Функциональная структура компилятора IBM Х10
48
X10 Runtime
X10 Application
X10 Class Libs
Front End
AST optimizationsAST-lowering
.cu
C++
Java
g++/xlC
g++/xlC
javac
Native Back End
Java Back End
Executable
Bytecode
X10 Runtime
X10 Runtime C++ Natives
X10 AST
JVM
X10 AST (Abstract Syntax Tree)
X10 Runtime
X10 Runtime Java Natives
Источник: http://x10.codehaus.org/X10+Day
Реализация ArrayPreload
49. Block
Loop
Block
At
Block
Call
Arg
Target
Stmt
Stmt
Stmt
...
...
...
Трансформация AST-дерева в алгоритме ArrayPreload
49
AST-дерево программы
50. Поиск в ASTдереве подходящей конструкции
Block
Block
At
Block
Call
Arg
Target
Stmt
Stmt
...
...
...
Трансформация AST-дерева в алгоритме ArrayPreload
50
1
Loop
Stmt
AST-дерево программы
51. Поискчтения массива Array[T]в цикле
Поиск в ASTдереве подходящей конструкции
Block
Block
At
Block
Call
Arg
Target
Stmt
Stmt
...
...
...
Трансформация AST-дерева в алгоритме ArrayPreload
51
1
2
Loop
Stmt
AST-дерево программы
52. Поискчтения массива Array[T]в цикле
Поиск в ASTдереве подходящей конструкции
Трансформация AST дерева
Block
Block
At
Block
Call
Arg
Call
Stmt
Stmt
...
...
...
Decl
Arg
Target
Трансформация AST-дерева в алгоритме ArrayPreload
52
1
2
3
Loop
Stmt
AST-дерево программы
53. 푻=푻풄풐풑풚푨[]×푵
for ... A(i)
for ... A(i)
A()={…}
푻=푻풄풐풑풚푨[]
for ... A'(i)
for ... A'(i)
A()={…}
A' = A
A' = A
A' = A
Область j
Область i
Область k
Область j
Область i
Область k
A
Трансформация AST-дерева в алгоритме ArrayPreload
53
Block
Block
At
Block
Call
Arg
Call
Stmt
Stmt
...
...
...
Decl
Arg
Target
Loop
Stmt
AST-дерево
54. Организация экспериментов (алгоритмBlockReduce)
54
Конфигурация подсистемы
Кластер А: 16 узлов 2 x IntelXeonE5420 2.5 GHz(8 процессорных ядер на узел), 25 GiB, сетьGigabit Ethernet
Кластер B: 6 узлов 2 x IntelXeonE5620 2.4 GHz(8 процессорных ядер на узел), 8 GiB, сеть InfiniBandQDR
Описание тестовых программ
Синтетический тест: 푅=100операций редукции
Размер массива 퐷=4000,8000,…,20000элементов
Chapel-программа PTRANS–транспонирование распределённых матриц
Chapel-программа miniMD–молекулярная динамика
59. Организация экспериментов(алгоритм ArrayPreload)
59
Конфигурация подсистемы
Кластер А: 16 узлов 2 x IntelXeonE5420 2.5 GHz(8 процессорных ядер на узел), 25 GiB, сетьGigabit Ethernet
КластерB: 6 узлов 2 x IntelXeonE5620 2.4 GHz(8 процессорных ядер на узел), 8 GiB, сеть InfiniBandQDR
Описание тестовой программы
Тест циклического (Round-robin) обращения к массиву
Размер массива D{40000, 4000, 400, 40}элементов
Количество обращений к массиву R{40000, 4000, 400, 40}
Массив Array[Long]
Условия запуска
Количество потоков на один узел: 8
C++ Backend
60. 60
Результаты экспериментов. Алгоритм Scalar replacement
Кластер А, Сеть Gigabit Ethernet
s
N
D= 40000, R= 40000
D= 40000, R= 4000
D= 40000, R= 4000
D= 40000, R= 40
61. 61
Результаты экспериментов. Алгоритм ArrayPreload
Кластер А, Сеть Gigabit Ethernet
s
N
D= 40000, R= 40000
D= 40000, R= 4000
D= 40000, R= 4000
D= 40000, R= 40
62. 62
Результаты экспериментов. Алгоритм ArrayPreload
Кластер В, Сеть InfinibandQDR
s
N
D= 40000, R= 40000
D= 40000, R= 4000
D= 40000, R= 4000
D= 40000, R= 40
63. 63
Результаты экспериментов. Алгоритм ArrayPreload
Кластер В, Сеть InfinibandQDR
s
N
D= 40000, R= 40000
D= 4000, R= 40000
D= 400, R= 40000
D= 40, R= 40000
64. 64
Предложены алгоритмы BlockReduceи ArrayPreloadоптимизации информационных обменов в параллельных PGAS-программах. Алгоритмы реализован для языков Cray Chapelи IBM X10.
Алгоритм BlockReduceобеспечивает сокращение времени выполнения операции редукции на 5-10% для массивов большого размера (D> 10000).
Алгоритм ArrayPreloadпредварительного копирования элементов удалённых массивов позволяет сократить время выполнения циклического доступа в среднем от 2 до 80 раз.
ArrayPreloadэффективен для программ, выполняющих обращение к массивам большого размера (D> 5000)в циклах с большим числом итераций(R> 500).
Результаты
65. 65
Разработка алгоритмов реализации коллективных операций в PGAS-языках с учётом типа распределения элементов массива между узлами.
Создание алгоритмов оптимизации доступа к удалённым массивам по результатам предварительного профилирования PGAS-программ (profile guided optimization).
Развитие эвристических алгоритмов предварительного распределения данных по узлам распределённой ВС.
Применение алгоритмов компиляторной оптимизации для разрешения проблем согласованности памяти при выполнении операций с распределёнными массивами.
Разработка алгоритмов кэширования для PGAS-программ.
Направления дальнейших исследований