Анализ эффективности выполнения алгоритма параллельной редукции в языке Cray Chapel (конференция ICAM, 2014)
1. Анализ эффективности выполнения
алгоритма параллельной редукции
в языке Cray Chapel
http://cpct.sibsutis.ru/~apaznikov
Пазников Алексей Александрович
Институт физики полупроводников
им. А.В. Ржанова СО РАН
4. 4
Все виды параллелизма
Учёт локальности данных
Низкоуровневое и высокоуровневое
управление параллелизмом
Интуитивно понятный синтаксис
Язык Cray Chapel
5. 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 }
5
Пример редукции в Cray Chapel
6. 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 }
6
Пример редукции в Cray Chapel
7. 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 }
7
Пример редукции в Cray Chapel
8. 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 }
8
Пример редукции в Cray Chapel
13. 13
Алгоритм редукции 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 coforall t in [1, 2, …, n] do
5 foreach x in Ait do
6 rit = rit x
7 foreach t in [1, 2…, n] do
8 ri = ri rit
14. 14
Алгоритм редукции 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 coforall t in [1, 2, …, n] do
5 foreach x in Ait do
6 rit = rit x
7 foreach t in [1, 2…, n] do
8 ri = ri rit
15. 15
Алгоритм редукции 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 coforall t in [1, 2, …, n] do
5 foreach x in Ait do
6 rit = rit x
7 foreach t in [1, 2…, n] do
8 ri = ri rit
16. 16
Алгоритм редукции 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 coforall t in [1, 2, …, n] do
5 foreach x in Ait do
6 rit = rit x
7 foreach t in [1, 2…, n] do
8 ri = ri rit
17. 17
Алгоритм редукции 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 coforall t in [1, 2, …, n] do
5 foreach x in Ait do
6 rit = rit x
7 foreach t in [1, 2…, n] do
8 ri = ri rit
18. 18
Алгоритм редукции 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 coforall t in [1, 2, …, n] do
5 foreach x in Ait do
6 rit = rit x
7 foreach t in [1, 2…, n] do
8 ri = ri rit
20. 20
Алгоритм редукции 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
21. 21
Алгоритм редукции 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
22. 22
Алгоритм редукции 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
23. 23
Алгоритм редукции 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
24. 24
Алгоритм редукции 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
25. 25
Алгоритм редукции 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
Вычислительная трудоёмкость
алгоритма BlockReduce:
T = O(|A| / N + log(N))
26. compiler/AST/build.cpp
– вызов BlockReduce при генерации AST-дерева
modules/dists/BlockDist.chpl
modules/internal/ChapelArray.chpl
– функции получения локальной области
распределённого массива
modules/internal/ChapelReduceContr.chpl
modules/internal/FastReduce.chpl
– реализация алгоритма BlockReduce
https://bitbucket.org/apaznikov/chapel
Программная реализация
26
27. t, c
100 операций редукции массива A[1:D], 2 узла кластера Jet
27
Результаты экспериментов
D
BlockReduce DefReduce
32. 32
Предложен алгоритм редукции
BlockReduce в PGAS-языках. Алгоритм
реализован в Cray Chapel.
Сокращение времени выполнения
редукции на 5-10% на некотором
количестве узлов.
Получен метод технической реализации
операции редукции.
Результаты