Upload
alexey-paznikov
View
229
Download
6
Embed Size (px)
DESCRIPTION
Доклад Кулагина И.И., Пазникова А.А., Курносова М.Г. "Оптимизация информационных обменов в параллельных PGAS-программах" на 3-й Всероссийской научно-технической конференции «Суперкомпьютерные технологии» (СКТ-2014) 29 сентября – 4 октября 2014 г., с. Дивноморское
Citation preview
Кулагин И.И., Пазников А.А., Курносов М.Г.
Институт физики полупроводников
им. А.В. Ржанова СО РАН
Оптимизация информационных обменов в параллельных PGAS-программах
3-я Всероссийская научно-техническая конференция
«Суперкомпьютерные технологии» (СКТ-2014)
29 сентября – 4 октября 2014 г., с. Дивноморское
Общая память(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
Глобальное разделённое адресное пространство (PGAS)
HPF, Co-array Fortran, Titanium, UPC, IBM X10, Cray Chapel
Основные программные конструкции PGAS-языков
4
begin S – асинхронное выполнение инструкций Sв отдельном потоке на вычислительном узле, с которого вызвана конструкция
on i S – выполнение инструкций S на узле i
on x S – выполнение инструкций S на том узле, в памяти которого находится объект x
coforall S – выполнение каждой итерации тела Sцикла в независимом потоке
sync T – синхронизация группы потоков T
Основные программные конструкции PGAS-языков
5
begin S – асинхронное выполнение инструкций S в отдельном потоке на вычислительном узле, с которого вызвана конструкция
Вычислительный узел i
begin {stmt 1stmt 2
…stmt k
}…
stmt 1stmt 2
…stmt k
Основные программные конструкции PGAS-языков
6
on i S – выполнение инструкций S на узле i
Вычислительныйузел j
Вычислительныйузел i
on i {stmt 1stmt 2
…stmt k
}
stmt 1stmt 2
…stmt k
Основные программные конструкции PGAS-языков
7
coforall S – выполнение каждой итерации тела S цикла в независимом потоке
Вычислительный узел i
coforall {stmt 1stmt 2
…stmt k
}…
stmt 1stmt 2
…stmt k
stmt 1stmt 2
…stmt k
stmt 1stmt 2
…stmt k
…
Основные программные конструкции PGAS-языков
8
sync T – синхронизация группы потоков T
Вычислительный узел i
stmt 1stmt 2
…stmt k
stmt 1stmt 2
…stmt k
Вычислительный узел jbarrier T
…
stmt 1stmt 2
…stmt k
stmt 1stmt 2
…stmt k …
Основные программные конструкции PGAS-языков
9
Параллелизм уровня потоков
порождение задач (begin, on)
параллельные циклы (coforall)
примитивы синхронизации (sync)
Параллелизм уровня данных
коллективные операции (редукция, префиксная сумма) над массивами
распределённые структуры (проблемы размещения, оптимизация доступа)
Основные программные конструкции PGAS-языков
10
Параллелизм уровня потоков
порождение задач (begin, on)
параллельные циклы (coforall)
примитивы синхронизации (sync)
Параллелизм уровня данных
коллективные операции (редукция, префиксная сумма) над массивами
распределённые структуры (проблемы размещения, оптимизация доступа)
1
2
11
Оптимизация выполнения редукции распределённых массивов
12
Распределённые массивы (distributed arrays)
A:
Вычислительный узел 1
Потоки
Локальная память
Вычислительный узел 2
Потоки
Локальная память
Вычислительный узел N
Потоки
Локальная память
…
A1 A2 AN
13
Параллельная редукция (reduce, reduction)
a1 a2 aDA[1:D] …
a1 a2 aDr = …
a3 a4 a5
a3
2 0A[1:5]
2 0 3r =
1 3 1
1++ + 1+ = 7
Редукция одномерного массива А:
Пример для операции сложения:
14
Параллельная редукция распределённого массива
Rabenseifner R. Optimization of Collective Reduction Operations // Computational Science -
ICCS 2004 - Lecture Notes in Computer Science. 2004. Vol. 3036. P. 1-9.
Li S, Hoefler T., Snir M. NUMA-Aware Shared-Memory Collective Communication for MPI //
HPDC 2013. 2013. P. 85-96.
A: 2 0 1 3
Локальная память
Локальная память
Локальная память
A1 A2 A32 0 1 3 2 0 1 3
reduce(A, +)
15
Параллельная редукция (reduce, reduction)
Rabenseifner R. Optimization of Collective Reduction Operations // Computational Science -
ICCS 2004 - Lecture Notes in Computer Science. 2004. Vol. 3036. P. 1-9.
Li S, Hoefler T., Snir M. NUMA-Aware Shared-Memory Collective Communication for MPI //
HPDC 2013. 2013. P. 85-96.
A:
Вычислительный узел 1
2 0 1 3
Локальная память
Вычислительный узел 2
Локальная память
Вычислительный узел N
Локальная память
A1 A2 A32 0 1 3 2 0 1 3
A: 2 0 1 3
Локальная память
Локальная память
Локальная память
A1 A2 A32 0 1 3 2 0 1 3
r = 38
reduce(A, +)
16
Параллельная редукция (reduce, reduction)
Rabenseifner R. Optimization of Collective Reduction Operations // Computational Science -
ICCS 2004 - Lecture Notes in Computer Science. 2004. Vol. 3036. P. 1-9.
Li S, Hoefler T., Snir M. NUMA-Aware Shared-Memory Collective Communication for MPI //
HPDC 2013. 2013. P. 85-96.
A:
Вычислительный узел 1
2 0 1 3
Локальная память
Вычислительный узел 2
Локальная память
Вычислительный узел N
Локальная память
A1 A2 A32 0 1 3 2 0 1 3
A: 2 0 1 3
Локальная память
Локальная память
Локальная память
A1 A2 A32 0 1 3 2 0 1 3
r = 38
reduce(A, +)Результат редукции
Распределённый массив
1 use BlockDist;
2
3 proc main {
4 var Space = {1..n, 1..n};
5 var BlockSpace = Space dmapped
6 Block(boundingBox=Space);
7 var BA: [BlockSpace] real;
8
9 forall (i, j) in Space do
10 BA[i, j] = i * 10 + j;
11
12 var sum = + reduce BA;
13
14 writeln(“REDUCE: ”, sum);
15 }17
Пример редукции в Cray Chapel
1 use BlockDist;
2
3 proc main {
4 var Space = {1..n, 1..n};
5 var BlockSpace = Space dmapped
6 Block(boundingBox=Space);
7 var BA: [BlockSpace] real;
8
9 forall (i, j) in Space do
10 BA[i, j] = i * 10 + j;
11
12 var sum = + reduce BA;
13
14 writeln(“REDUCE: ”, sum);
15 }18
Пример редукции в Cray Chapel
1 use BlockDist;
2
3 proc main {
4 var Space = {1..n, 1..n};
5 var BlockSpace = Space dmapped
6 Block(boundingBox=Space);
7 var BA: [BlockSpace] real;
8
9 forall (i, j) in Space do
10 BA[i, j] = i * 10 + j;
11
12 var sum = + reduce BA;
13
14 writeln(“REDUCE: ”, sum);
15 }19
Пример редукции в Cray Chapel
1 use BlockDist;
2
3 proc main {
4 var Space = {1..n, 1..n};
5 var BlockSpace = Space dmapped
6 Block(boundingBox=Space);
7 var BA: [BlockSpace] real;
8
9 forall (i, j) in Space do
10 BA[i, j] = i * 10 + j;
11
12 var sum = + reduce BA;
13
14 writeln(“REDUCE: ”, sum);
15 }20
Пример редукции в Cray Chapel
21
Алгоритм редукции DefaultReduce
Вычислительный узел 1
Потоки
Локальная память
Вычислительный узел 2
Потоки
Локальная память
Вычислительный узел N
Потоки
Локальная память
…
A1 A2 AN
22
Алгоритм редукции DefaultReduce
Вычислительный узел 1
Потоки
Локальная память
Вычислительный узел 2
Потоки
Локальная память
Вычислительный узел N
Потоки
Локальная память
…
Вычислительная трудоёмкость алгоритма DefaultReduce:𝑻 = 𝑶(|𝑨| / 𝑵 + 𝑵)
A1 A2 AN
23
Алгоритм редукции DefaultReduce
Вычислительный узел 1
Потоки
Локальная память
Вычислительный узел 2
Потоки
Локальная память
Вычислительный узел N
Потоки
Локальная память
…
Вычислительная трудоёмкость алгоритма DefaultReduce:𝑻 = 𝑶(|𝑨| / 𝑵 + 𝑵)
Количество порождённых потоков: 𝑲 = |𝑨|
A1 A2 AN
24
Алгоритм редукции BlockReduce
Вычислительный узел 1
Потоки
Локальная память
Вычислительный узел 2
Потоки
Локальная память
Вычислительный узел N
Потоки
Локальная память
…
A1 A2 AN
25
Алгоритм редукции BlockReduce
Вычислительный узел 1
Потоки
Локальная память
Вычислительный узел 2
Потоки
Локальная память
Вычислительный узел N
Потоки
Локальная память
…
A1 A2 AN
26
Алгоритм редукции BlockReduce
Вычислительный узел 1
Потоки
Локальная память
Вычислительный узел 2
Потоки
Локальная память
Вычислительный узел N
Потоки
Локальная память
…
A1 A2 AN
27
Алгоритм редукции BlockReduce
Вычислительный узел 1
Потоки
Локальная память
Вычислительный узел 2
Потоки
Локальная память
Вычислительный узел N
Потоки
Локальная память
…
Количество порождённых потоков: 𝑲 = 𝑵× 𝒏
A1 A2 AN
28
Алгоритм редукции BlockReduce (II этап)
r[1] r[2]A[1:D] …r[3] r[4] r[5]
r12 r34 r56
r[6]
r
r
1234
BARRIER
BARRIER
r5678
r[7] r[8]
r78 …
…
r[1] r[2] r[3] r[4] r[5] r[6] r[7] r[8]
r12 r34 r56 r78
r r1234
5678
…
1 2 3 4 5 6 7 8Узел …
29
Алгоритм редукции BlockReduce
Вычислительный узел 1
Потоки
Локальная память
Вычислительный узел 2
Потоки
Локальная память
Вычислительный узел N
Потоки
Локальная память
…
Количество порождённых потоков: 𝑲 = 𝑵× 𝒏
A1 A2 AN
Вычислительная трудоёмкость алгоритма BlockReduce:𝑻 = 𝑶(|𝑨| / 𝑵 + log(𝑵))
30
Алгоритм барьерной синхронизации потоков Central Counter
Nanjegowda R., Hernandez O., Chapman B., Jin H. Scalability Evaluation of Barrier Algorithms forOpenMP // IWOMP '09 Proceedings of the 5th International Workshop on OpenMP: Evolving OpenMPin an Age of Extreme Parallelism. 2009. Vol. 5568. P. 42-52
31
Оптимизация доступа к удалённым массивам
32
Объявление массивов в IBM X10
x10.lang.Rail[T]
Одномерный массив с элементами типа T
Индексы типа Long
Базовый класс для массивов
x10.regionarray.Array[T]
Многомерный массива с элементами типа T
Основан на Rail массиве
var b: Long = a(k);
// ...
33
Операции над распределёнными массивами в IBM X10
Вычислительныйузел j
Вычислительныйузел i
val a:Array[Long];
at(Place.place(i)) {var b:
Long = a(k)// ...
}
Доступ к элементам удалённого массива
Копирование всего массива a
var b: Long = a(k);
// ...
34
Операции над распределёнными массивами в IBM X10
Вычислительныйузел j
Вычислительныйузел i
val a:Array[Long];
for (i in 0..N) {at(Place.place(i)) {var b:
Long = a(k)// ...
}}
Циклический доступ к элементам удалённого массива
var b: Long = a(k);
// ...
35
Операции над распределёнными массивами в IBM X10
Вычислительныйузел j
Вычислительныйузел i
val a:Array[Long];
for (i in 0..N) {at(Place.place(i)) {var b:
Long = a(k)// ...
}}
Циклический доступ к элементам удалённого массива
Копирование всего массива a
36
Копирование удалённых массивов как узкое место
1 val A:Array[Long] =
2 new Array[Long](length, (i:Long) => i);
3
4 finish {
5 for (i in 0..(length – 1)) {
6 val placeId:Long = i %
7 Place.MAX_PLACES;
8 at (Place.place(placeId)) async {
9 val tmpA = A(i);
10 ...
11 }
12 }
13 }
37
Копирование удалённых массивов как узкое место
1 val A:Array[Long] =
2 new Array[Long](length, (i:Long) => i);
3
4 finish {
5 for (i in 0..(length – 1)) {
6 val placeId:Long = i %
7 Place.MAX_PLACES;
8 at (Place.place(placeId)) async {
9 val tmpA = A(i);
10 ...
11 }
12 }
13 }
38
Копирование удалённых массивов как узкое место
1 val A:Array[Long] =
2 new Array[Long](length, (i:Long) => i);
3
4 finish {
5 for (i in 0..(length – 1)) {
6 val placeId:Long = i %
7 Place.MAX_PLACES;
8 at (Place.place(placeId)) async {
9 val tmpA = A(i);
10 ...
11 }
12 }
13 }
39
Копирование удалённых массивов как узкое место
1 val A:Array[Long] =
2 new Array[Long](length, (i:Long) => i);
3
4 finish {
5 for (i in 0..(length – 1)) {
6 val placeId:Long = i %
7 Place.MAX_PLACES;
8 at (Place.place(placeId)) async {
9 val tmpA = A(i);
10 ...
11 }
12 }
13 }
40
Копирование удалённых массивов как узкое место
Вычислительныйузел i
tmpA = A(i)
Вычислительныйузел j
Вычислительныйузел k
A: a[1], a[2],
..., a[n]
tmpA = A(i)
tmpA: ...
tmpA = A(i)
tmpA: ...
41
Копирование удалённых массивов как узкое место
Вычислительныйузел i
tmpA = A(i)
Вычислительныйузел j
Вычислительныйузел k
A: a[1], a[2],
..., a[n]
tmpA = A(i)
tmpA: ...
tmpA = A(i)
tmpA: ...
Копирование всего массива на каждой итерации цикла
42
Копирование удалённых массивов как узкое место
Вычислительныйузел i
tmpA = A(i)
Вычислительныйузел j
Вычислительныйузел k
A: a[1], a[2],
..., a[n]
tmpA = A(i)
tmpA: ...
tmpA = A(i)
tmpA: ...
Копирование всего массива на каждой итерации цикла
Алгоритм Scalar replacement
?
43
Алгоритм ArrayPreload оптимизациидоступа к удалённым массивам
1 val sharedA: DistArray[Array[Long]] =
2 DistArray.make[Array[Long]]
3 (Dist.makeUnique(), A);
4
5 for (i in 0..(length – 1)) {
6 val placeId:Long = i % Place.MAX_PLACES;
7 at (Place.place(placeId)) async {
8 val tmpA = sharedA(placeId)(i);
9 // ...
10 }
11 }
44
Алгоритм ArrayPreload оптимизациидоступа к удалённым массивам
1 val sharedA: DistArray[Array[Long]] =
2 DistArray.make[Array[Long]]
3 (Dist.makeUnique(), A);
4
5 for (i in 0..(length – 1)) {
6 val placeId:Long = i % Place.MAX_PLACES;
7 at (Place.place(placeId)) async {
8 val tmpA = sharedA(placeId)(i);
9 // ...
10 }
11 }
45
Алгоритм ArrayPreload оптимизациидоступа к удалённым массивам
1 val sharedA: DistArray[Array[Long]] =
2 DistArray.make[Array[Long]]
3 (Dist.makeUnique(), A);
4
5 for (i in 0..(length – 1)) {
6 val placeId:Long = i % Place.MAX_PLACES;
7 at (Place.place(placeId)) async {
8 val tmpA = sharedA(placeId)(i);
9 // ...
10 }
11 }
46
Алгоритм ArrayPreload оптимизациидоступа к удалённым массивам
Вычислительныйузел i
for () {
}
Вычислительныйузел j
Вычислительныйузел k
A
sharedA(0) = A
for () {
}
sharedA(j) = A
for () {
}
sharedA(i) = A
Копирование массива один раз перед выполнением цикла
Функциональная структура компилятора IBM Х10
47
X10 Runtime
X10 Application
X10 Class Libs
Front EndAST optimizations
AST-lowering
.cuC++ Java
g++/xlC g++/xlC javac
Native Back End Java Back End
Executable BytecodeX10 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
Функциональная структура компилятора IBM Х10
48
X10 Runtime
X10 Application
X10 Class Libs
Front EndAST optimizations
AST-lowering
.cuC++ Java
g++/xlC g++/xlC javac
Native Back End Java Back End
Executable BytecodeX10 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
Block
Loop
Block
At
Block
Call
Arg Target
Stmt
Stmt
Stmt
...
...
...
Трансформация AST-дерева в алгоритме ArrayPreload
49
AST-дерево программы
Поиск в AST дереве подходящей конструкции
Block
Block
At
Block
Call
Arg Target
Stmt
Stmt
...
...
...
Трансформация AST-дерева в алгоритме ArrayPreload
50
1LoopStmt
AST-дерево программы
Поиск чтения массива Array[T] в цикле
Поиск в AST дереве подходящей конструкции
Block
Block
At
Block
Call
Arg Target
Stmt
Stmt
...
...
...
Трансформация AST-дерева в алгоритме ArrayPreload
51
1
2
LoopStmt
AST-дерево программы
Поиск чтения массива Array[T] в цикле
Поиск в AST дереве подходящей конструкции
Трансформация AST дерева
Block
Block
At
Block
Call
Arg Call
Stmt
Stmt
...
...
...
Decl
Arg
Target
Трансформация AST-дерева в алгоритме ArrayPreload
52
1
2
3
LoopStmt
AST-дерево программы
𝑻 = 𝑻𝒄𝒐𝒑𝒚 𝑨[ ] × 𝑵
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
LoopStmt
AST-дерево
Организация экспериментов (алгоритм BlockReduce)
54
Конфигурация подсистемы
Кластер А: 16 узлов 2 x Intel Xeon E5420 2.5 GHz(8 процессорных ядер на узел), 25 GiB, сеть Gigabit Ethernet
Кластер B: 6 узлов 2 x Intel Xeon E5620 2.4 GHz(8 процессорных ядер на узел), 8 GiB, сеть InfiniBand QDR
Описание тестовых программ
Синтетический тест: 𝑅 = 100 операций редукции
Размер массива 𝐷 = 4000, 8000,… , 20000 элементов
Chapel-программа PTRANS – транспонирование распределённых матриц
Chapel-программа miniMD – молекулярная динамика
55
Результаты экспериментов (алгоритм BlockReduce)
R = 100 операций редукции массива A[1:D], 4 узла кластера Jet
t, c
D
BlockReduce DefReduce
56
Результаты экспериментов (алгоритм BlockReduce)
R = 100 операций редукции массива A[1:D], 8 узлов кластера Jet
t, c
D
BlockReduce DefReduce
Программа miniMD, N узлов кластера Jet
57
Результаты экспериментов (алгоритм BlockReduce)
t, c
N
BlockReduce DefReduce
58
Результаты экспериментов (алгоритм BlockReduce)
Программа PTRANS, N узлов кластера Jet
t, c
N
BlockReduce DefReduce
Организация экспериментов (алгоритм ArrayPreload)
59
Конфигурация подсистемы
Кластер А: 16 узлов 2 x Intel Xeon E5420 2.5 GHz(8 процессорных ядер на узел), 25 GiB, сеть Gigabit Ethernet
Кластер B: 6 узлов 2 x Intel Xeon E5620 2.4 GHz(8 процессорных ядер на узел), 8 GiB, сеть InfiniBand QDR
Описание тестовой программы
Тест циклического (Round-robin) обращения к массиву
Размер массива D {40000, 4000, 400, 40} элементов
Количество обращений к массиву R {40000, 4000, 400, 40}
Массив Array[Long]
Условия запуска
Количество потоков на один узел: 8
C++ Backend
60
Результаты экспериментов. Алгоритм Scalar replacement
Кластер А, Сеть Gigabit Ethernets
N
D = 40000, R = 40000
D = 40000, R = 4000
D = 40000, R = 4000
D = 40000, R = 40
61
Результаты экспериментов. Алгоритм ArrayPreload
Кластер А, Сеть Gigabit Ethernets
N
D = 40000, R = 40000
D = 40000, R = 4000
D = 40000, R = 4000
D = 40000, R = 40
62
Результаты экспериментов. Алгоритм ArrayPreload
Кластер В, Сеть Infiniband QDRs
N
D = 40000, R = 40000
D = 40000, R = 4000
D = 40000, R = 4000
D = 40000, R = 40
63
Результаты экспериментов. Алгоритм ArrayPreload
Кластер В, Сеть Infiniband QDRs
N
D = 40000, R = 40000
D = 4000, R = 40000
D = 400, R = 40000
D = 40, R = 40000
64
Предложены алгоритмы BlockReduce и ArrayPreloadоптимизации информационных обменов в параллельных PGAS-программах. Алгоритмы реализован для языков Cray Chapel и IBM X10.
Алгоритм BlockReduce обеспечивает сокращение времени выполнения операции редукции на 5-10% для массивов большого размера (D > 10000).
Алгоритм ArrayPreload предварительного копирования элементов удалённых массивов позволяет сократить время выполнения циклического доступа в среднем от 2 до 80 раз.
ArrayPreload эффективен для программ, выполняющих обращение к массивам большого размера (D > 5000) в циклах с большим числом итераций (R > 500).
Результаты
65
Разработка алгоритмов реализации коллективных операций в PGAS-языках с учётом типа распределения элементов массива между узлами.
Создание алгоритмов оптимизации доступа к удалённым массивам по результатам предварительного профилирования PGAS-программ (profile guided optimization).
Развитие эвристических алгоритмов предварительного распределения данных по узлам распределённой ВС.
Применение алгоритмов компиляторной оптимизации для разрешения проблем согласованности памяти при выполнении операций с распределёнными массивами.
Разработка алгоритмов кэширования для PGAS-программ.
Направления дальнейших исследований
Спасибо за внимание!
Пазников А.А. [email protected]
https://bitbucket.org/apaznikov/chapel
Кулагин И.И. [email protected]
Курносов М.Г. [email protected]
67
Backup-слайды
68
Алгоритм редукции BlockReduce (I этап)
Входные данные: A[1:D] – распределённый массив, – ассоциативная операция редукции.
Выходные данные: r – результат применения редукции для A.
1 coforall i in [1, 2, …, N] do // N – число узлов
2 on i
3 SPLITDOMAIN(Ai, n) // Разбиение на n блоков
4 // по числу процессорных ядер
5 coforall t in [1, 2, …, n] do
6 foreach x in Ait do
7 rit = rit x
8 foreach t in [1, 2…, n] do
9 ri = ri rit
69
Алгоритм редукции BlockReduce (I этап)
Входные данные: A[1:D] – распределённый массив, – ассоциативная операция редукции.
Выходные данные: r – результат применения редукции для A.
1 coforall i in [1, 2, …, N] do // N – число узлов
2 on i
3 SPLITDOMAIN(Ai, n) // Разбиение на n блоков
4 // по числу процессорных ядер
5 coforall t in [1, 2, …, n] do
6 foreach x in Ait do
7 rit = rit x
8 foreach t in [1, 2…, n] do
9 ri = ri rit
70
Алгоритм редукции BlockReduce (I этап)
Входные данные: A[1:D] – распределённый массив, – ассоциативная операция редукции.
Выходные данные: r – результат применения редукции для A.
1 coforall i in [1, 2, …, N] do // N – число узлов
2 on i
3 SPLITDOMAIN(Ai, n) // Разбиение на n блоков
4 // по числу процессорных ядер
5 coforall t in [1, 2, …, n] do
6 foreach x in Ait do
7 rit = rit x
8 foreach t in [1, 2…, n] do
9 ri = ri rit
71
Алгоритм редукции BlockReduce (I этап)
Входные данные: A[1:D] – распределённый массив, – ассоциативная операция редукции.
Выходные данные: r – результат применения редукции для A.
1 coforall i in [1, 2, …, N] do // N – число узлов
2 on i
3 SPLITDOMAIN(Ai, n) // Разбиение на n блоков
4 // по числу процессорных ядер
5 coforall t in [1, 2, …, n] do
6 foreach x in Ait do
7 rit = rit x
8 foreach t in [1, 2…, n] do
9 ri = ri rit
72
Алгоритм редукции BlockReduce (I этап)
Входные данные: A[1:D] – распределённый массив, – ассоциативная операция редукции.
Выходные данные: r – результат применения редукции для A.
1 coforall i in [1, 2, …, N] do // N – число узлов
2 on i
3 SPLITDOMAIN(Ai, n) // Разбиение на n блоков
4 // по числу процессорных ядер
5 coforall t in [1, 2, …, n] do
6 foreach x in Ait do
7 rit = rit x
8 foreach t in [1, 2…, n] do
9 ri = ri rit
73
Алгоритм редукции BlockReduce (I этап)
Входные данные: A[1:D] – распределённый массив, – ассоциативная операция редукции.
Выходные данные: r – результат применения редукции для A.
1 coforall i in [1, 2, …, N] do // N – число узлов
2 on i
3 SPLITDOMAIN(Ai, n) // Разбиение на n блоков
4 // по числу процессорных ядер
5 coforall t in [1, 2, …, n] do
6 foreach x in Ait do
7 rit = rit x
8 foreach t in [1, 2…, n] do
9 ri = ri rit
74
Алгоритм редукции BlockReduce (II этап)
Входные данные: A[1:D] – распределённый массив, – ассоциативная операция редукции.
Выходные данные: r – результат применения редукции для A.
…
9 while N > 1 do
10 while i + 1 < N do
11 begin
12 on ri
13 ri = ri ri + 1
14 i = i + 2
15 BARRIER([1, 2, …, N]) // Барьерная синхронизация потоков
16 REFRESH(N) // Обновление числа N ВУ
17 return r
75
Алгоритм редукции BlockReduce (II этап)
Входные данные: A[1:D] – распределённый массив, – ассоциативная операция редукции.
Выходные данные: r – результат применения редукции для A.
…
9 while N > 1 do
10 while i + 1 < N do
11 begin
12 on ri
13 ri = ri ri + 1
14 i = i + 2
15 BARRIER([1, 2, …, N]) // Барьерная синхронизация потоков
16 REFRESH(N) // Обновление числа N ВУ
17 return r
76
Алгоритм редукции BlockReduce (II этап)
Входные данные: A[1:D] – распределённый массив, – ассоциативная операция редукции.
Выходные данные: r – результат применения редукции для A.
…
9 while N > 1 do
10 while i + 1 < N do
11 begin
12 on ri
13 ri = ri ri + 1
14 i = i + 2
15 BARRIER([1, 2, …, N]) // Барьерная синхронизация потоков
16 REFRESH(N) // Обновление числа N ВУ
17 return r
77
Алгоритм редукции BlockReduce (II этап)
Входные данные: A[1:D] – распределённый массив, – ассоциативная операция редукции.
Выходные данные: r – результат применения редукции для A.
…
9 while N > 1 do
10 while i + 1 < N do
11 begin
12 on ri
13 ri = ri ri + 1
14 i = i + 2
15 BARRIER([1, 2, …, N]) // Барьерная синхронизация потоков
16 REFRESH(N) // Обновление числа N ВУ
17 return r
78
Определение распределённых массивов в IBM X10
val A: DistArray[Long] = DistArray.make[Long](Dist.makeUnique(), (p: Point) => {here.id});
Вычислительный узел 1
Потоки
Локальная память
Вычислительный узел 2
Потоки
Локальная память
Вычислительный узел N
Потоки
Локальная память
…
A1 A2 ANA: