Высокопроизводительные вычисления в прикладном численном моделировании Что такое суперкомпьютер? Оксфордский толковый словарь по вычислительной технике (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 (соревнование) Спасибо за внимание !