Высокопроизводительные вычисления в прикладном численном моделировании

advertisement
Высокопроизводительные
вычисления
в прикладном численном
моделировании
Что такое суперкомпьютер?
Оксфордский толковый словарь по
вычислительной технике (1986 год):
Суперкомпьютер - это очень мощная ЭВМ с
производительностью свыше 10 MFLOPS
(миллионов операций с плавающей запятой в
секунду).
Начало 90-х годов - 300 MFLOPS.
1996 год -
5 GFLOPS
Что такое суперкомпьютер?
Суперкомпьютер – это система, цена которой
выше 1-2 млн. долларов
Суперкомпьютер – это компьютер, мощность
которого всего на порядок меньше
необходимой для решения современных
задач
Суперкомпьютер - это устройство, сводящее
проблемы вычислений к проблемам
ввода/вывода (Кен Батчер (Ken Batcher) 2001 г).
«Основы…» или не
«Основы…»?
• Архитектура современных многопроцессорных
вычислительных машин;
• Системное программное обеспечение
параллельных ЭВМ и сетей;
• Технология программирования на параллельных
ЭВМ;
• Параллельные алгоритмы;
• Математическое моделирование и параллельный
вычислительный эксперимент
Цель курса
Не бояться распараллеливать свои (или
не свои) программы
Введение в
распараллеливание
алгоритмов и программ
А зачем?
Московский Государственный Университет (Ломоносов) –
414.42 TFLOP
Суперкомпьютерный центр – 140.16 TFLOP
Московский Государственный Университет (Чебышев) –
60 TFLOP
РНЦ «Курчатовский институт» – 34.2 TFLOP
Московский физико-технический институт – 6.5 TFLOP
Кластер МФТИ-60
А зачем?
Московский Государственный Университет (Ломоносов) –
414.42 TFLOP
Суперкомпьютерный центр – 140.16 TFLOP
Московский Государственный Университет (Чебышев) –
60 TFLOP
РНЦ «Курчатовский институт» – 34.2 TFLOP
Московский физико-технический институт – 6.5 TFLOP
DoE - Oak Ridge National Laboratory – 2.331 PFLOP
USA – объявлено о начале разработки эксафлопного
компьютера
А зачем?
• Прогноз погоды. Уравнение Навье-Стокса. При размере ячейки
1 кубическая миля, 10 ячеек по высоте, для расчета прогноза на
10 дней с шагом 1 минута требуется 1016 FLOP ~ 10 дней
работы компьютера с производительностью 10 GFLOP.
• Квантовая хромодинамика – вычисление массы протона –
примерно 1017 FLOP ~ 0.5 года работы обычного компьютера
• Астрофизика – моделирование развития галактики из 1011
звезд ~ 1 год на 1 шаг по времени
•Биофизика – моделирование образования белка ~ 1025
машинных инструкций ~ 106 веков на одноядерной персоналке
3.2 GHz
А зачем?
“To
put it quite bluntly: as long as there were no
machines, programming was no problem at all;
when we had a few weak computers,
programming became a mild problem, and now
we have gigantic computers, programming has
become an equally gigantic problem.”
E. Dijkstra, 1972 Turing Award Lecture
Первый кризис software
● Время: 60-70-е годы
● Проблема: Программирование на языке ассемблера
Компьютеры стали способны обрабатывать более
сложные задачи
● Появилась необходимость перехода на более высокий
уровень абстракции и переносимости программ
● Решение – развитие языков высокого уровня для фонНеймановской архитектуры
Второй кризис software
● Время: 80-90-е годы
● Проблема: Невозможность создания и поддержки
сложных и надежных программных комплексов,
содержащих несколько миллионов строк кода и
написанных сотнями программистов
Компьютеры стали способны обрабатывать более
сложные задачи
● Решение – развитие объектно-ориентированных
языков, разработка инструментария для поддержки
больших программных проектов
Закон Мура (1965 год)
Количество транзисторов на кристалле и
производительность процессоров удваиваются
каждые полтора – два года
Очевидные проблемы:
•Скорость передачи информации
•Теплоотвод
С 2005 года – появление многоядерных процессоров
Новый закон Мура
Количество ядер на одном процессоре
удваивается каждые полтора года
Multicore processors – ( 2 – 10х ядер )
Manycore processors – ( 100 – 100x ядер )
Myriacore processors – (1000 - ? ядер )
Третий кризис software
● Время: 2005-20??-е годы
● Проблема: Необходимость смены парадигмы
программирования
Компьютеры стали способны обрабатывать более
сложные задачи
● Решение – А кто ж его знает????
История параллельности
● Охотники на мамонтов – коллективное решение задачи универсальность и специализация
● Форд - конвейер
● Первое предложение об использовании параллельности
для вычислений – 1842 год – аналитическая машина
Бэббиджа
История параллельности
EDSAC - 1949 год Кембридж - время такта 2 микросекунды
(2*10-6 секунды), выполнял в среднем 100 арифметических
операций в секунду
Современные процессоры – тактовая частота 3GHz – время
одного такта ~ 3*10-10 секунды – но производительность по
сравнению с EDSAC существенно больше, чем в 10000 раз
История параллельности
● Разрядно-параллельная память и разрядно-параллельная
арифметика (IBM 701 (1953), IBM 704 (1955 ))
Первый этап развития вычислительной техники (ВТ)
● Второй этап развития ВТ – spooling. IBM 709 (1958): 6
независимых устройств ввода-вывода
● Ускорение доступа к памяти за счет разделения ее на
банки памяти —IBM STRETCH (1961г.)
● ЭВМ ATLAS (1962г.) — конвейер выполнения команд (4
ступени). Мультипрограммирование – начало третьего
этапа развития ВТ. Появление DMA.
История параллельности
Выборка команды
Декодирование и увеличение программного счетчика
Вычисление адреса операндов
Выборка операндов
Операция
Сохранение результата
Введение отдельных устройств для каждой стадии
обработки команды позволяет организовать
конвейер
История параллельности
Независимые функциональные устройства для
выполнения различных операций - CDC 6600
(1964)
время такта 100нс,
производительность 2-3 млн. операций в секунду,
оперативная память разбита на 32 банка по 4096
60-ти разрядных слов,
цикл памяти 1мкс,
10 независимых функциональных устройств.
Суперскалярные процессоры. Появление VLIWпроцессоров.
История параллельности
Выполнение сложения с плавающей точкой:
Сравнение порядков
Выравнивание порядков
Сложение мантисс
Нормализация
Округление
Конвейерные функциональные устройства - CDC 7600
(1969)
История параллельности
матричные процессоры: ILLIAC IV :
Проект (1967):
Реально:
256 процессорных элементов (ПЭ) = 4
квадранта по 64ПЭ, возможность
реконфигурации: 2 квадранта по 128ПЭ
или 1 квадрант из 256ПЭ, такт 40нс,
производительность 1Гфлоп;
конец 1971 г. - изготовлена система из 1
квадранта, в 1974г. она введена в
эксплуатацию, доводка велась до 1975
года . Функционировала до 1982 года.
История параллельности
Векторно-конвейерные ЭВМ
CRAY 1 (1976):
В 1972 году С.Крэй покидает CDC и основывает свою компанию Cray
Research, которая в 1976 г. выпускает первый векторно-конвейерный
компьютер CRAY-1: время такта 12.5нс, 12 конвейерных
функциональных устройств, пиковая производительность 160
миллионов операций в секунду, оперативная память до 1Мслова (слово
- 64 разряда), цикл памяти 50нс. Главным новшеством является
введение векторных команд, работающих с целыми массивами
независимых данных и позволяющих эффективно использовать
конвейерные функциональные устройства.
История параллельности
Многопроцессорные вычислительные комплексы
Кластеры
Высокопроизводительные системы на графических
процессорах
Классификация
вычислительных систем
Персональные ЭВМ
Рабочие станции
Мини—ЭВМ
Большие универсальные ЭВМ (mainframe)
Супер--ЭВМ
Минисупер--ЭВМ
Эта классификация позволяет, быть может,
примерно прикинуть стоимость компьютера
Классификация
вычислительных систем
Классическая систематика Флинна
По количеству потоков команд и данных :
SISD
SIMD
MISD
MIMD
Классификация
вычислительных систем
SISD (single instruction stream / single data stream) - одиночный поток
команд и одиночный поток данных. К этому классу относятся, прежде
всего, классические последовательные машины, или иначе, машины
фон-неймановского типа, например, PDP-11 или VAX 11/780. В таких
машинах есть только один поток команд, все команды
обрабатываются последовательно друг за другом и каждая команда
инициирует одну операцию с одним потоком данных. Не имеет
значения тот факт, что для увеличения скорости обработки команд и
скорости выполнения арифметических операций может применяться
конвейерная обработка - как машина CDC 6600 со скалярными
функциональными устройствами, так и CDC 7600 с конвейерными
попадают в этот класс.
Классификация
вычислительных систем
SIMD (single instruction stream / multiple data stream) - одиночный
поток команд и множественный поток данных. В архитектурах
подобного рода сохраняется один поток команд, включающий, в
отличие от предыдущего класса, векторные команды. Это позволяет
выполнять одну арифметическую операцию сразу над многими
данными - элементами вектора. Способ выполнения векторных
операций не оговаривается, поэтому обработка элементов вектора
может производится либо процессорной матрицей, как в ILLIAC IV,
либо с помощью конвейера, как, например, в машине CRAY-1. .
Классификация
вычислительных систем
MISD (multiple instruction stream / single data stream) - множественный
поток команд и одиночный поток данных.
Теоретическая категория. В природе не встречается.
Классификация
вычислительных систем
MIMD (multiple instruction stream / multiple data stream) множественный поток команд и множественный поток данных. Этот
класс предполагает, что в вычислительной системе есть несколько
устройств обработки команд, объединенных в единый комплекс и
работающих каждое со своим потоком команд и данных. .
Последовательная парадигма
программирования
Содержательная
задача
Процессы или
thread’ы
Математическая
модель
Алгоритм
Программа
Модели программирования
 Модель программирования:
• определяет основные идеи программной реализации;
• абстрагируется от языка программирования, который
будет использоваться, и, частично, от hardware.
 Названия моделей программирования до конца
в литературе не устоялись
Модели параллельного
программирования
Последовательная модель:
Последовательная программа для автоматического
распараллеливания компилятором или специальными
программными средствами.
• Преимущество – знакомая парадигма программирования
• Недостаток – ограниченные возможности автоматического
распараллеливания
Модели параллельного
программирования
Модель передачи сообщений:
Работающее приложение состоит из набора процессов
с различными адресными пространствами. Процессы
обмениваются сообщениями с помощью явных sendreceive операций.
• Преимущество – полный контроль над выполнением
• Недостаток – сложность программирования
Модели параллельного
программирования
Модель разделяемой памяти:
Приложение состоит из набора thread’ов,
использующих разделяемые переменные и примитивы
синхронизации
• Явные нити исполнения: программирование с использованием
библиотечных или системных вызовов для thread’ов
o
o
Преимущество – переносимость
Недостаток – сложность программирования
• Программирование на языке высокого уровня с применением прагм.
o
o
Преимущество – легкость программирования
Недостаток – сложность контроля над выполнением
Параллельная парадигма
программирования
Содержательная
задача
Процессы или
thread’ы
)
Математическая
модель
Алгоритм
Декомпозиция
(decomposition)
Программа
Декомпозиция (decomposition)
Разделение вычислений и данных на части
Декомпозиция по данным (параллелизм по
данным)
• разделяем данные на области ответственности
• определяем, как вычисления связаны с данными
Декомпозиция по вычислениям (функциональный
параллелизм)
• разделяем вычисления на области ответственности
• определяем, как данные связаны с вычислениями
Параллельная парадигма
программирования
Содержательная
задача
Процессы
(threads)
Математическая
модель
Алгоритм
Декомпозиция
(decomposition)
Назначение
(assignment)
Программа
Назначение (assignment)
 Определение способов распределения задач по
процессорам.
 Цели:
• балансировка загрузки исполнителей
• уменьшение обменов данными между исполнителями
• сокращение накладных расходов на само назначение
 Разновидности по времени назначения
• статическое – на этапе написания программы,
компиляции или старта программы ( до реального
исполнения вычислений)
• динамическое – в процессе выполнения вычислений
Параллельная парадигма
программирования
Содержательная
задача
Процессы
(threads)
Математическая
модель
Алгоритм
Декомпозиция
(decomposition)
Программа
Назначение
(assignment)
Дирижирование
(orchestration)
Дирижирование (orchestration)
 Реализация в выбранной программной модели и
на выбранном языке программирования.
 Определяет
• имена данных и способы доступа к ним
• обмен данными
• синхронизацию обмена
Параллельная парадигма
программирования
Содержательная
задача
Процессы
(threads)
Математическая
модель
Отображение
(mapping)
Алгоритм
Декомпозиция
(decomposition)
Программа
Назначение
(assignment)
Дирижирование
(orchestration)
Отображение (mapping)
 Отображение процессов (нитей исполнения) на
процессоры. Выполняется либо пользователем,
либо операционной системой
 Для общей памяти – ОС
 Для распределенной памяти – пользователь или ОС
Параллельная парадигма
программирования
Содержательная
задача
Процессы
(threads)
Математическая
модель
Отображение
(mapping)
Алгоритм
Декомпозиция
(decomposition)
Программа
Назначение
(assignment)
Дирижирование
(orchestration)
Асимптотический анализ
Основные принципы
•Игнорировать зависимость от конкретной ЭВМ:
использование моделей вычислительных систем
•Анализировать изменение T(n) при n:
интересует время работы алгоритма при больших размерностях
задачи
•Анализ темпа роста:
что лучше T(n)=106n2 или T(n)=n3 ?
Асимптотический анализ
Форма записи
Пусть f(n) и g(n) – положительные функции
целочисленного аргумента
f(n) = O(g(n))   c > 0, n0 > 0 : f(n)  cg(n)  n  n0
f(n) = (g(n))   c > 0, n0 > 0 : cg(n)  f(n)  n  n0
f(n) = (g(n))   c1, c2, n0 > 0 : c1g(n)  f(n)  c2g(n)  n  n0
Асимптотический анализ
Сравнение алгоритмов
Пусть T1(n) и T2(n) – времена работы алгоритмов 1 и 2
соответственно, T0(n) – теоретическая оценка времени
решения задачи снизу
Если T1(n) = O(T2(n)) , то по поведению алгоритм 1 не хуже алгоритма 2
Если T1(n) = (T2(n)) , то по поведению алгоритм 1 не лучше алгоритма 2
Если T1(n) = (T2(n)) , то алгоритм 1 и алгоритм 2 одинаковы по
поведению
Если T1(n) = (T0(n)) , то алгоритм 1 – оптимален
Асимптотический анализ.
Пример. Задача выбора
Рассмотрим S = { s1, s2, …, sn } – множество, на котором
задан линейный порядок. |S| = n – мощность множества.
Элемент si называется элементом ранга k (1  k  n), если
он является k-м наименьшим элементом множества S.
•
Поиск максимума – нахождение значения элемента n-го ранга
•
Поиск минимума – нахождение значения элемента первого ранга
•
Поиск медианы – нахождение значения элемента с рангом n / 2
•
Общая задача – нахождение значения элемента ранга k
Асимптотический анализ.
RAM (Random Access Machine)
1. Один процессор с одним ядром.
2. Ячейки памяти доступны в произвольном порядке.
3. Время доступа к памяти есть (1), независимо от того
чтение это или запись.
4. Время выполнения основных операций на процессоре
есть (1).
Асимптотический анализ.
Пример. Задача выбора
Шаг 1: если |S| < q , элемент k-го ранга ищем сортировкой,
иначе делим S на |S|/q подмножеств Si из q
элементов каждое (кроме, быть может, последнего)
s1
s1
…
sq
S1 , S1  q
sq+1
s2
…
s3
s4
…
sn
s2q
S2 , S2  q
…
sn
S n  , S n   q
 
q
 
q
Асимптотический анализ.
Пример. Задача выбора
Шаг 2: Сортировкой ищем медиану в каждом подмножестве
S1

m1
S2

m2
…
S n 
 
q

m n 
 
q
Асимптотический анализ.
Пример. Задача выбора
Шаг 3: Строим множество всех медиан M.


M = m1 , m 2 , ... , m  n  
 

q  
n 
M =  
q 
Рекурсивно находим его медиану m0.
Асимптотический анализ.
Пример. Задача выбора
Шаг 4: Строим множества
L: si  L  si < m0
E: si  E  si = m0
G: si  G  si > m0
Асимптотический анализ.
Пример. Задача выбора
Шаг 5: Если |L| ≥ k – рекурсивно ищем в L значение
элемента ранга k,
иначе, если |L|+|E| ≥ k – искомое значение есть m0,
иначе – рекурсивно ищем в G значение элемента
ранга k-|L|-|E|
Асимптотический анализ.
Пример. Задача выбора
Шаг 1: если |S| < q , элемент k-го ранга ищем сортировкой
T1(n) = (1) = C0
иначе делим S на |S|/q подмножеств Si из q
элементов каждое (кроме, быть может, последнего)
T1(n) = C(n/q) = C1n
Асимптотический анализ.
Пример. Задача выбора
Шаг 2: Сортировкой ищем медиану в каждом подмножестве
S1

m1
S2

m2
…
S n 
 
q

m n 
 
q
T2(n) = C2n
Асимптотический анализ.
Пример. Задача выбора
Шаг 3: Строим множество всех медиан M.


M = m1 , m 2 , ... , m  n  
 

q  
n 
M =  
q 
Рекурсивно находим его медиану m0.
T3(n)=T(n/q)
Асимптотический анализ.
Пример. Задача выбора
Шаг 4: Строим множества
L: si  L  si < m0
E: si  E  si = m0
G: si  G  si > m0
T4(n) = C3n
Асимптотический анализ.
Пример. Задача выбора
Шаг 5 : Если |L| ≥ k – рекурсивно ищем в L значение
элемента ранга k, иначе, если |L|+|E| ≥ k – искомое
значение есть m0, иначе – рекурсивно ищем в G
значение элемента ранга k-|L|-|E|
В множестве M НЕ МЕНЕЕ |M|/2= n/(2q) медиан mi,
превышающих или равных m0.
В каждом из соответствующих Si НЕ МЕНЕЕ |Si|/2=q/2
элементов множества S не меньших mi.
Стало быть, |E|+|G|  (n/(2q))*(q/2) = n/4 и |L|  3n/4.
Аналогично, |G|  3n/4.
Асимптотический анализ.
Пример. Задача выбора
Шаг 5 : Если |L| ≥ k – рекурсивно ищем в L значение
элемента ранга k, иначе, если |L|+|E| ≥ k – искомое
значение есть m0, иначе – рекурсивно ищем в G
значение элемента ранга k-|L|-|E|
T5(n) = T(3n/4)
Асимптотический анализ.
Пример. Задача выбора
Оценим время выполнения T(n)
Шаг 1: T1(n) = C1n
Шаг 2: T2(n) = C2n
Шаг 3: T3(n) = T(n/q)
Шаг 4: T4(n) = C3n
Шаг 5: T5(n) = T(3n/4)
Окончательно T(n) = C4n + T(n/q) + T(3n/4)
Шаманские танцы 1: Пусть n/q +3n/4 < n, тогда q  5.
Положим q=5
Асимптотический анализ.
Пример. Задача выбора
Оценим время выполнения T(n)
Шаг 1: T1(n) = C1n
Шаг 2: T2(n) = C2n
Шаг 3: T3(n) = T(n/q)
Шаг 4: T4(n) = C3n
Шаг 5: T5(n) = T(3n/4)
Окончательно T(n) = C4n + T(n/5) + T(3n/4)
Шаманские танцы 2: Предположим, что T(n)  С5n , при
С5=20С4 получаем: T(n)  C4n + 20C4 n/5 + 60C4n/4 = С5n.
Асимптотический анализ.
Пример. Задача выбора
Мы получили T(n) ≤ C5n, стало быть T(n) = O(n).
Теоретическая оценка снизу: T0(n) = n.
Так как T0(n) ≤ T(n), то T(n) = Ω(n).
Окончательно, T(n) = Θ(n).
Предложенный алгоритм является оптимальным.
Асимптотический анализ.
Основная теорема
Если T(n) = aT(n/b) + f(n), где a  1, b > 1, f(n) > 0 и n
принимает целые неотрицательные значения, то
logb a 
f
(
n
)

O
(
n
), ε > 0, то T (n)  (nlogb a )
1. Если
log a
2. Если f (n)  (n b ) , то T (n)  (nlogb a log n)
3. Если f (n)  O(nlogb a  ), ε > 0 и  0 < c < 1, N > 0:
из (n/b) > N  af(n/b)  cf(n), то T (n)  ( f ( n))
Асимптотический анализ.
PRAM (Parallel Random Access
Machine)
1. Много процессоров и/или много ядер. Память общая.
2. Ячейки памяти доступны в произвольном порядке.
3. Время доступа к памяти есть (1), независимо от того
чтение это или запись.
4. Время выполнения основных операций на процессоре
есть (1).
5. В зависимости от того, разрешены ли одновременное
чтение из одной ячейки памяти или одновременная
запись, существует 4 разновидности модели компьютера.
Асимптотический анализ.
PRAM (Parallel Random Access
Machine)-конфликты памяти
1. EREW – Exclusive Read Exclusive Write – наиболее
строгая модель PRAM
2. CREW – Concurrent Read Exclusive Write - наиболее
употребительная модель PRAM
3. CRCW – Concurrent Read Concurrent Write
4. ERCW – Exclusive Read Concurrent Write –
невразумительная модель PRAM
Асимптотический анализ.
PRAM (Parallel Random Access
Machine)-конфликты памяти
CW : схемы разрешения конфликта
1. Общая – запись разрешается только при всех одинаковых
записываемых значениях
2. Объединяющая – реально записывается значение некоторой
функции от всех значений, которые пытались записать (max, min,
среднее значение и т.д.)
3. Произвольная – записывается одно из предлагаемых значений,
выбранное произвольно
4. С приоритетами – у каждого исполнителя есть приоритет, запись
произведет процессор с наибольшим приоритетом
Асимптотический анализ.
Определения для параллельных систем
Ускорение = (время работы наилучшего последовательного
алгоритма при наихудших начальных данных) / (время
работы параллельного алгоритма при тех же начальных
данных)
Для N исполнителей ускорение  N, так как в
противном случае последовательный алгоритм не был
наилучшим.
В реальной жизни часто ускорение считается для
последовательной и параллельной версий одного и того же
алгоритма на одном наборе данных.
Асимптотический анализ.
Определения для параллельных систем
Ускорение = (время работы наилучшего последовательного
алгоритма при наихудших начальных данных) / (время
работы параллельного алгоритма при тех же начальных
данных)
Стоимость = (время работы параллельного алгоритма) x
(число исполняющих элементов)
Пусть время работы последовательного алгоритма Ts (n) =
(f(n)), и стоимость параллельного алгоритма есть тоже
(f(n)), тогда параллельный алгоритм является
оптимальным по стоимости
Декомпозиция.
Запись алгоритма
Запись на естественном языке:
«Макароны положить в кипящую воду (не менее 1 литра
воды на 100 г. продукта), помешивая, варить до готовности».
Что такое «готовность»?
Вербальная запись алгоритма часто содержит
неоднозначности, которые разными исполнителями могут
трактоваться по-разному.
Декомпозиция.
Запись алгоритма
Запись формулой или на алгоритмическом языке :
S = a[1] + a[2] + a[3];
Каков порядок выполнения операций?
S = (a[1] + a[2]) + a[3] или S = a[1] + (a[2] + a[3]) ?
Крокодила измеряем от головы до хвоста или от хвоста к
голове?
Декомпозиция.
Запись алгоритма
Запись формулой или на алгоритмическом языке :
Пусть мантисса может хранить только 4 десятичных разряда.
a[1] = 0.1024*104, a[2] = -0.1023*104, a[3] = 0.6*100.
Первый порядок сложения:
a[1] + a[2] = 0,1024*104 - 0.1023*104 = 0.0001*104 = 0.1*101
(a[1] + a[2]) + a[3] = 0.1*101 + 0.6 * 100 = 1*100 + 0.6*100 =
1.6*100 = 0.16*101
Декомпозиция.
Запись алгоритма
Запись формулой или на алгоритмическом языке :
Второй порядок сложения:
a[2] + a[3] = -0.1023*104 + 0.6*100 = -1023*100 +0.6*100 =
-1022.4*100 = -0.10244*104 = -0.1022*104
a[1] + (a[2] + a[3]) = 0.1024*104 - 0.1022 * 104 = 0.0002*104 =
0.2*101
Крокодил длиной 1.6 метра от головы к хвосту и длиной 2
метра от хвоста к голове!
Декомпозиция.
Запись алгоритма
Граф алгоритма, реализованного программой
Каждой операции в алгоритме сопоставим вершину графа.
Для наглядности отдельными вершинами отразим операции
ввода и вывода. Если результат одной операции
используется как данное при выполнении другой операции,
то свяжем эти вершины направленным ребром.
a[1]
+
a[2]
a[3]
+
S
S = (a[1] + a[2]) + a[3]
a[3]
+
a[2]
a[1]
+
S
S = a[1] + (a[2] + a[3])
Декомпозиция.
Запись алгоритма
Граф алгоритма. Свойства
1. Граф является ациклическим. В программах реализуются
только явные вычисления.
2. Граф может быть мультиграфом.
a
*
+
S
S = (a*a) + b
b
3. Граф является параметрическим. Он всегда зависит от
размерности задачи, определяющей общее количество
вершин в графе.
Декомпозиция.
Запись алгоритма
Граф алгоритма
Граф является детерминированным, если он описывает
алгоритм, лишенный условных переходов.
Если граф недетерминированный, то:
если под ветвлениями содержится небольшое количество
операций, то операции можно укрупнить;
a
+5
if (a>0) y=a+5
else
y=a-1
y
a
> 0?
+5 : -1
y
-1
если под ветвлениями содержатся большие
детерминированные куски – занимаемся этими кусками.
Декомпозиция.
Строгая параллельная форма графа
Пусть задан ориентированный ациклический граф, имеющий
n вершин. Существует число s ≤ n, для которого все вершины
графа можно так пометить одним из индексов 1, 2, …, s, что
если дуга из вершины с индексом i идет в вершину c
индексом j, то i < j.
1
7
5
2
3
1
2
6
4
2
8
9
3
Так размеченный граф называется строгой параллельной
формой графа.
Декомпозиция.
Строгая параллельная форма графа
Группа вершин в строгой параллельной форме с одинаковым
индексом называется ярусом.
Для двух вершин, принадлежащих к одному ярусу, в графе не
существует связывающего их пути. Следовательно,
соответствующие им операции могут быть выполнены
параллельно.
Количество вершин в ярусе – его ширина.
Число ярусов – высота параллельной формы
Декомпозиция.
Строгая параллельная форма графа
При выполнении алгоритма на последовательной машине в
каждый момент времени выполняется ровно одна операция.
Перенумеровав в графе алгоритма вершины в порядке их выполнения,
получим строгую параллельную форму. Все ее ярусы имеют ширину 1,
ее глубина – n.
Для любой другой архитектуры можно также поставить в
соответствие строгую параллельную форму, и наоборот – для любой
строгой параллельной формы можно придумать подходящую
архитектуру.
В модели PRAM с временем выполнения операций 1 время
выполнения алгоритма есть глубина соответствующей формы.
Декомпозиция.
Строгая параллельная форма графа
Если ошибки округления при выполнении операций
определяются только значениями операндов, то при
выполнении операций в порядке, задаваемом строгой
параллельной формой, для различных строгих
параллельных форм будут получаться одинаковые
результаты.
Выполнение графа алгоритма приведет к одинаковым
результатам на машинах разной архитектуры.
Декомпозиция.
Каноническая параллельная форма графа
Если в строгой параллельной форме для вершины с
индексом k максимальная из длин путей, оканчивающихся в
этой вершине, есть k-1, то такая параллельная форма
называется канонической параллельной формой.
1
6
4
1
2
1
1
5
3
2
7
8
1
Каноническая параллельная форма единственна. Она имеет
ярусы максимальной ширины и обладает минимальной
глубиной
Декомпозиция.
Каноническая параллельная форма графа
Максимально возможное ускорение при распараллеливании
алгоритма в модели PRAM есть количество вершин в графе,
деленное на глубину канонической параллельной формы.
1
6
4
1
2
1
1
5
3
2
7
8
1
Максимальное ускорение = 13/8
Активности и атомарные операции
Активность : приготовление бутерброда




Отрезать ломтик хлеба
Отрезать ломтик колбасы
Намазать хлеб маслом
Положить колбасу на хлеб
Атомарные или
неделимые операции
Активность - последовательное выполнение ряда действий, направленных на
достижение определенной цели
Interleaving
Активность P:
Активность Q:
abc
def
Последовательное выполнение PQ:
abcdef
Псевдопараллельное выполнение
(режим разделения времени)
: a b c?d e f
abdcef
abdecf
abdefc
...
defabc
Детерминированные и
недетерминированные наборы
активностей
P:
(x, y):
x=2
y=x-1
Q:
x=3
y=x+1
(3, 1)
4)) (3,
(2,
(2, 2)
4)) (2, 3) (2, 1)
 Недетерминированный набор – при
одинаковых начальных данных возможны
разные результаты
 Детерминированный набор – при одинаковых
начальных данных всегда один результат
Условия Бернстайна (Bernstain)
P:
1) x=u+v
2) y=x*w
Входные переменные
R1 = {u, v}
R2 = {x, w}
R(P)={u, v, x, w}
Выходные переменные
W1 = {x}
W2 = {y}
W(P)={x, y}
Если:
1) W(P) ∩ W(Q) = {ø}
2) W(P) ∩ R(Q) = {ø}
3) R(P) ∩ W(Q) = {ø}
то набор активностей {P, Q} является детерминированным
Если для двух операторов в программе, динамически непосредственно
следующих друг за другом, выполнены условия Бернстайна, то их можно
исполнять параллельно.
Нарушение условий Бернстайна
1) W(P) ∩ W(Q) ≠
= {ø}
2) W(P) ∩ R(Q) = {ø}
3) R(P) ∩ W(Q) = {ø}
оператор P динамически предшествует оператору Q
P: x = e + 2z
Зависимость по выходным данным
P δ0 Q
Q: yx = 2f + z
P
Q
Способ борьбы: переименование переменных.
Распараллеливанию принципиально не мешает.
Нарушение условий Бернстайна
1) W(P) ∩ W(Q) = {ø}
2) W(P) ∩ R(Q) = {ø}
3) R(P) ∩ W(Q) ≠
= {ø}
оператор P динамически предшествует оператору Q
P: x = e + 2z
Антизависимость
P δ-1 Q
Q: z = 2f + y
P
Q
Способ борьбы: перед исполнением размножить значение z
Распараллеливанию принципиально не мешает
Нарушение условий Бернстайна
1) W(P) ∩ W(Q) = {ø}
2) W(P) ∩ R(Q) ≠
= {ø}
3) R(P) ∩ W(Q) = {ø}
оператор P динамически предшествует оператору Q
P: x = e + 2z
Истинная или потоковая зависимость
PδQ
Q: y = 2f + x
P
Q
Способ борьбы: не существует.
Распараллеливание невозможно.
Другие виды зависимостей
S1: m = sin(x)
S1: m =if sin(x)
(m > 0) then
S2:S2:
where
(m>0)
y=
2 + xy = 2 + x
S3: where
else(m≤0) y = 6 – x
S3:
y=6–x
endif
Зависимость
Истинная зависимость
по управлению
S1
S1δδc S2, S1 δcS3
S3
c
S1
S3
S2
c
Способ борьбы: сводим к зависимостям по данным.
S1: a = b/c
S2: d = e/f
Зависимость по ресурсам
S1 δR S2
Одно устройство деления
R
S1
S2
Составление графа зависимостей
S1: x = e + 2z
S1
S2: y = 2f + x
S3: z = z + y
S2
S4: y = z + x
S3
S4
Зависимости в невложенных циклах
S1:
S2:
do i =1, u
a(f(i)) = …
…a(f(i))…
… = a(g(i))
…a(g(i))…
enddo
S11:
S21:
a(f(1)) = …
…a(f(1))…
…a(g(1))…
… = a(g(1))
S12:
S22:
a(f(2)) = …
…a(f(2))…
…a(g(2))…
…
= a(g(2))
S13:
S23:
a(f(3)) = …
…a(f(3))…
…a(g(3))…
…
= a(g(3))
Если  k,  : 0  k,  ≤ u и f(k)= g(), то есть зависимость в
операторах цикла. Нужно решить диофантово уравнение.
S1k – источник (source) зависимости, S2λ – сток (sink)
зависимости
d =  - k (из итерации стока вычитаем итерацию источника) –
это расстояние зависимости.
Зависимости в невложенных циклах
do i =1, u
S1:
S2:
a(i) = d(i)+5*i
c(i) = a(i-1)*2
enddo
S11:
S21:
a(1) = …
… <- a(0)
S12:
S22:
a(2) = …
… <- a(1)
S13:
S23:
a(3) = …
… <- a(2)
 = 2, k =1, d =  - k = 1
Истинная зависимость
Общее утверждение: если d > 0, то имеет место истинная
зависимость между операторами цикла, исполняющимися
на разных итерациях.
d = 1 – параллельное выполнение итераций цикла на
разных процессорах невозможно!
Зависимости в невложенных циклах
do i =1, u
S1:
S2:
a(i) = d(i)+5*i
c(i) = a(i-2)*2
enddo
S11:
S21:
a(1) = …
… <- a(-1)
S12:
S22:
a(2) = …
… <- a(0)
S13:
S23:
a(3) = …
… <- a(1)
 = 3, k =1, d =  - k = 2
Истинная зависимость
1 -> 3 -> 5 -> 7-> …
2 -> 4 -> 6 -> 8 -> …
Возможно распараллеливание для 2-х исполнителей
Зависимости в невложенных циклах
do i =1, u
S1:
S2:
a(i) = d(i)+5*i
c(i) = a(i+1)*2
enddo
S11:
S21:
a(1) = …
… <- a(2)
S12:
S22:
a(2) = …
… <- a(3)
S13:
S23:
a(3) = …
… <- a(4)
 = 1, k =2, d =  - k = -1. Антизависимость
Общее утверждение: если d < 0, то имеет место
антизависимость между операторами цикла,
исполняющимися на разных итерациях.
Параллельное выполнение итераций цикла на разных
процессорах возможно при дублировании необходимых
входных данных.
Зависимости в невложенных циклах
Что произойдет при d = 0?
do i =1, u
S1:
S2:
a(i) = a(i)*2
d(i)+5*i
c(i)
c(i) = a(i)*2
a(i)
d(i)+5*i
 = k, d =  - k = 0
Антизависимость
Истинная
зависимость
enddo
Зависимость не связана с наличием цикла –
loop independent dependence.
Зависимость сконцентрирована в пределах одной итерации.
Возможно параллельное исполнение различных итераций.
Зависимости в невложенных циклах
do i =1, u
S1:
S2:
a(2*i) = d(i)+5*i
c(i) = 2*a(i)
enddo
f(i) =2*i, g(i) = i
S11:
S21:
a(2) = …
… <- a(1)
S12:
S22:
a(4) = …
… <- a(2)
S13:
S23:
a(6) = …
… <- a(3)
S14:
S24:
a(8) = …
… <- a(4)
f(1) = g(2), f(2) = g(4), f(3) = g(6), d = ?
Расстояние неопределенное, d = *, но d > 0.
Истинная зависимость
Зависимости во вложенных циклах
for (j1= 0; j1 < M1; j1++){
for(j2 = 0; j2 < M2; j2++){
a[f1(j1,j2),f2(j1,j2)] = …;
… = a[g1(j1,j2),g2(j1,j2)];
{
}
Пространство итераций: (0,0), (0,1), …, (0,M2), (1,0), …,
(1,M2), … (M1, 0), …, (M1,M2)
Вектора итераций – (j1,j2) - упорядочены
Зависимости во вложенных циклах
Раскрутка
a[f1(0,0),f2(0,0)]=…; … = a[g1(0,0), g2(0,0)];
a[f1(0,1),f2(0,1)]=…; … = a[g1(0,1), g2(0,1)];
и т.д.
Если  вектора итераций k и  из пространства итераций:
f1(k) = g1(), f2(k) = g2(), то в цикле имеет место
зависимость.
Вектор расстояний D = k - 
Вектор направлений d:
if Di < 0 -> di = “>”
if Di == 0 -> di = “=“
if Di > 0 -> di = “<“
Устранение истинных зависимостей
Разделение цикла
Loop Distribution
D0 I = 1, N
S1: A(I+1) = B(I) + C
S2: D(I) = A(I) + E
ENDDO
Наблюдаем истинную зависимость: S1 δ S2, расстояние
зависимости D = -1.
Преобразование, снимающее зависимость
DO I = 1, N
S1: A(I+1) = B(I) + C
ENDDO
DO I = 1, N
S2: D(I) = A(I) + E
ENDDO
Устранение истинных зависимостей
Выравнивание цикла
Loop Alignment
do i=2,n
S1: a(i)= b(i)+2
S2: c(i)= a(i-1) * 2
enddo
Наблюдаем истинную зависимость: S1 δ S2, расстояние
зависимости D = -1.
Преобразование, снимающее зависимость
do i=1,n
S1: if (i>1) a(i)= b(i)+2
S2: if (i<n) c(i+1)= a(i) * 2
enddo
Устранение истинных зависимостей
Реплицирование кода
Code Replication
do i=1,n
S1: a(i+1)= b(i)+2
S2: c(i)= a(i+1) * a(i)
enddo
Истинная зависимость между S1 и S2 мешает параллелизму. После
преобразования
do i=1,n
a(i+1)= b(i)+2
if (i=1) t=a(1)
else t=b(i-1)+2
c(i)= a(i+1) * t
enddo
Устранение истинных зависимостей
Приватизация скалярных переменных
Privatization
INTEGER J
DO I = 1, N
J=…
A(I) = J
ENDDO
После преобразования
INTEGER J, Jx(N)
DO I = 1, N
Jx(I) = …
A(I) = Jx(I)
ENDDO
J=Jx(N)
Устранение истинных зависимостей
Подстановка индукционных переменных
Induction Variable Substitution
DO I = 1, N
J=J+K
A(I) = J
ENDDO
После преобразования
DO I = 1, N
A(I) = I*K
ENDDO
Может изменить полученный результат !!!!!
Устранение истинных зависимостей
Подстановка индукционных переменных
REDUCTION(op:list)
DO I = 1, N
sum = sum + A(I)
ENDDO
После преобразования
DO I = 1, N
Reduction(ADD, A, N, sum)
ENDDO
Может изменить полученный результат !!!!!
Управление распределением задач
1. Статическая схема
2. Потоковая схема – master-worker, все непараллельные части
выполняет только мастер
3. Динамическая схема – master-worker, непараллельные части
выполняют все исполнители
4. Pool of works (набор работ)
5. Competition (соревнование)
Спасибо за внимание !
Download