Совместное использование MPI и OpenMP на кластерах Киреев С.Е., Городничев М.А., Калгин К.В., Перепелкин В.А. Отдел МО ВВС ИВМиМГ СО РАН План Введение в архитектуру: теория Практические следствия Привязка процессов к ядрам Ограничение пропускной способности памяти узла Планирование (shedule) обхода данных несколькими потоками в OpenMP Использование несколькими потоками одной кэш-строки Сравнение производительности MPI и MPI+OpenMP Выводы Отображение процессов MPI на узлы кластера MPI-программа MPI-процессы Узлы кластера Отображение процессов MPI на ядра в узле кластера 0 1 Ядро Quad core Xeon E5450 3.0 GHz (Harpertown) Ядро Кэш L2 2 3 Ядро Ядро Кэш L2 4 5 Ядро Ядро Кэш L2 6 Ядро 7 Ядро процессы MPI узел кластера Кэш L2 Шина FSB Общая память Кластер МВС-100К (Москва) Кластер НКС-30Т (Новосибирск) Реализация в MPI передачи сообщений Копирование данных в памяти (быстро) 0 Передача данных по сети (медленно) 1 2 3 процессы MPI Процессы и потоки Данные процесса Поток исполнения 3 Данные процесса Поток исполнения 2 Код процесса Поток исполнения 1 Код процесса Поток исполнения 0 Многопоточный процесс Поток исполнения Однопоточный процесс Отображение процессов и потоков на ядра в узле кластера 0 Данные процесса 0 Ядро Quad core Xeon E5450 3.0 GHz (Harpertown) 1 Ядро Кэш L2 2 3 Ядро Ядро Кэш L2 1 Данные процесса 0 Ядро 1 Ядро Кэш L2 2 Ядро 3 процессы MPI Ядро узел кластера Кэш L2 Шина FSB Данные процесса 0 Данные процесса 1 Общая память Кластер МВС-100К (Москва) Кластер НКС-30Т (Новосибирск) Сравнение процессов MPI и потоков в узле: первый взгляд Процессы MPI Дублирование данных: границы подобластей Затраты на передачу сообщений: Сборка данных Копирование в другой процесс Разборка данных Потоки (OpenMP) Затраты на синхронизацию План Введение в архитектуру: теория Практические следствия Привязка процессов к ядрам Ограничение пропускной способности памяти узла Планирование (shedule) обхода данных несколькими потоками в OpenMP Использование несколькими потоками одной кэш-строки Сравнение производительности MPI и MPI+OpenMP Выводы Привязка процессов к ядрам По умолчанию процессы MPI жестко привязаны к ядрам: MPI-программа 0 Ядро 1 Ядро 2 Ядро 3 Ядро 4 Ядро 5 Ядро 6 Ядро 7 Ядро процессы MPI узел кластера Привязка процессов к ядрам Следствие 1: Разные MPI-программы при работе в одном узле занимают одни и те же ядра Возможны конфликты двух задач пользователя и задач разных пользователей кластера. Один из способов решения – запрашивать узел эксклюзивно. Незанятые ядра простаивают MPI-программа 1 0 1 Ядро 2 Ядро Ядро MPI-программа 2 3 Ядро 0 Ядро 1 Ядро 2 Ядро 3 Ядро процессы MPI узел кластера Привязка процессов к ядрам Следствие 2: Все потоки внутри одного процесса занимают одно ядро Незанятые ядра простаивают MPI-программа 0 0 Ядро 1 Ядро 2 Ядро 3 Ядро 1 Ядро 0 1 Ядро 2 Ядро 3 Ядро процессы MPI узел кластера Привязка процессов к ядрам Задача Решение 2D волнового уравнения с помощью двухслойной явной схемы Декомпозиция пространства моделирования MPI+OpenMP со стандартной привязкой: Время, с Сетка: 8000×8000 Объем памяти: 976 MB 90 80 70 60 50 40 30 20 10 0 стандартная привязка На 8 потоках одно ядро загружено в 4 раза больше. MPI:8 MPI:4 MPI:2 MPI:1 OpenMP:1 OpenMP:2 OpenMP:4 OpenMP:8 Привязка процессов к ядрам Решение проблемы Использовать средства Linux sched_setaffinity(0,sizeof(mask),mask); Intel MPI (nks-30t) – отключение привязки Указать в скрипте запуска переменную окружения: export I_MPI_PIN_DOMAIN=node mpirun … или указать параметр mpirun: mpirun –env I_MPI_PIN_DOMAIN node … MVAPICH (mvs100k) – отключение привязки Указать параметр mpirun: mpirun VIADEV_USE_AFFINITY=0 … Привязка процессов к ядрам Задача Решение 2D волнового уравнения с помощью двухслойной явной схемы Сетка: 8000×8000 Декомпозиция пространства моделирования Влияние привязки процессов MPI к ядрам: Время, с Объем данных: 976 MB 90 80 70 60 50 40 30 20 10 0 стандартная привязка без привязки При отключении привязки OpenMP дает ожидаемое ускорение. MPI:8 MPI:4 MPI:2 MPI:1 OpenMP:1 OpenMP:2 OpenMP:4 OpenMP:8 План Введение в архитектуру: теория Практические следствия Привязка процессов к ядрам Ограничение пропускной способности памяти узла Планирование (shedule) обхода данных несколькими потоками в OpenMP Использование несколькими потоками одной кэш-строки Сравнение производительности MPI и MPI+OpenMP Выводы Ограничение пропускной способности памяти узла Доступ к памяти узла – узкое место Шина данных не успевает обрабатывать запросы всех ядер Ядро Quad core Xeon E5450 3.0 GHz (Harpertown) Ядро Кэш L2 ! Ядро Ядро Кэш L2 Ядро Ядро Кэш L2 Ядро Ядро Кэш L2 Шина FSB Общая память Кластер МВС-100К (Москва) Кластер НКС-30Т (Новосибирск) Ограничение пропускной способности памяти узла Попытка преодоления узкого места при доступе к памяти: AMD Opteron Intel Nehalem Ядро Quad core Xeon E5540 2.53 GHz (Nehalem) Ядро Ядро Ядро Ядро Ядро Ядро Ядро Кэш L3 Кэш L3 Общая память Общая память Кластер НКС-30Т (Новосибирск) – дополнительные узлы Ограничение пропускной способности памяти узла Задача Решение 2D волнового уравнения с помощью двухслойной явной схемы Сетка: 8000×8000 Декомпозиция пространства моделирования 8 процессов MPI на разном числе узлов: 25 mvs100k 20 Время, с Объем данных: 976 MB nks-30t 15 10 5 0 1 2 Число узлов 4 8 Шина успевает доставить данные только для 4 ядер. Ограничение пропускной способности памяти узла Задача Решение 2D волнового уравнения с помощью двухслойной явной схемы Сетка: 8000×8000 Объем данных: 976 MB nks-30t (Новосибирск, ССКЦ) 60 Эффективность, % 120 50 Время, с Декомпозиция пространства моделирования 40 30 20 10 0 1 2 4 8 16 Число MPI-процессов 32 100 80 60 40 20 0 1 2 4 8 16 Число MPI-процессов Видно падение производительности внутри узла. 32 Ограничение пропускной способности памяти узла Задача Решение 2D волнового уравнения с помощью двухслойной явной схемы Декомпозиция пространства моделирования Nehalem (Новосибирск, ССКЦ) 120 10 Число MPI-процессов 16 8 4 1 0 40 20 0 16 20 60 8 30 80 4 40 100 2 50 1 Эффективность, % 60 Время, с Сетка: 8000×8000 Объем данных: 976 MB 2 Число MPI-процессов Видно падение производительности внутри узла. Ограничение пропускной способности памяти узла Решение проблемы Для вычислений по явной схеме Шаги по времени Параметр реализации Выполнять больше полезных вычислений за одно чтение данных несколько шагов по времени за один проход Содержимое кэш-памяти Ограничение пропускной способности памяти узла Задача Решение 2D волнового уравнения с помощью двухслойной явной схемы Сетка: 8000×8000 Объем данных: 976 MB nks-30t (Новосибирск, ССКЦ) 60 Эффективность, % 120 50 Время, с Декомпозиция пространства моделирования 40 30 20 10 0 1 2 4 8 16 Число MPI-процессов 32 100 80 60 40 20 0 1 2 4 8 16 32 Число MPI-процессов Преодолели ограничение на пропускную способность памяти. Ограничение пропускной способности памяти узла Задача Решение 2D волнового уравнения с помощью двухслойной явной схемы Декомпозиция пространства моделирования Nehalem (Новосибирск, ССКЦ) 120 10 Число MPI-процессов 16 8 4 1 0 40 20 0 16 20 60 8 30 80 4 40 100 2 50 1 Эффективность, % 60 Время, с Сетка: 8000×8000 Объем данных: 976 MB 2 Число MPI-процессов Преодолели ограничение на пропускную способность памяти. План Введение в архитектуру: теория Практические следствия Привязка процессов к ядрам Ограничение пропускной способности памяти узла Планирование (shedule) обхода данных несколькими потоками в OpenMP Использование несколькими потоками одной кэш-строки Сравнение производительности MPI и MPI+OpenMP Выводы Планирование обхода данных несколькими потоками в OpenMP Распределение итераций между потоками в цикле обхода данных schedule(static) Параметры директивы OMP FOR schedule(static,1) schedule(dynamic) schedule(guided) Пример распределения итераций для 4-х потоков. Планирование обхода данных несколькими потоками в OpenMP Задача: Решение 2D волнового уравнения с помощью двухслойной явной схемы Распределение итераций между потоками в цикле обхода данных 8 потоков OpenMP в узле Параметры директивы OMP FOR 16 35 mvs100k 14 nks-30t 20 15 10 8 6 10 4 5 2 0 0 default Nehalem 12 25 Время, с Время, с 30 static static,1 dynamic guided default static static,1 dynamic Вывод: нужно использовать static (или не указывать параметр планирования, что в данной реализации OpenMP эквивалентно static). Планирование обхода данных несколькими потоками в OpenMP Задача: Последовательный обход массива данных, 8 потоков Чтение по 3 строки массива Запись по 1 строке массива Распределение итераций между потоками в цикле обхода данных Время, с 8 потоков OpenMP в узле Параметры директивы OMP FOR 0,25 Чтение 0,2 Запись 0,15 Основное влияние на производительность оказывает чтение данных по 3 строки. 0,1 0,05 0 default static static,1 dynamic guided static выигрывает за счет эффективного использования кэш-памяти. План Введение в архитектуру: теория Практические следствия Привязка процессов к ядрам Ограничение пропускной способности памяти узла Планирование (shedule) обхода данных несколькими потоками в OpenMP Использование несколькими потоками одной кэш-строки Сравнение производительности MPI и MPI+OpenMP Выводы Использование несколькими потоками одной кэш-строки Многократное изменение одной кэш-строки несколькими потоками приводит к неэффективному использованию кэша. Оперативная память Кэш 1 Кэш 2 Ядро 1 Ядро 2 Использование несколькими потоками одной кэш-строки Задача Многократное изменение двух переменных в общей памяти несколькими потоками Зависимость времени от расстояния между переменными: Разные сокеты Разный кэш L2 Общий кэш L2 0,9 0,8 Время, мс 0,7 0,6 0,5 0,4 0,3 0,2 0,1 0 0 16 32 48 64 80 96 112 128 144 160 176 Расстояние, байты Медленнее, если потоки над разными кэшами работают с различными переменными, расположенными на расстоянии менее 64 B друг от друга. Использование несколькими потоками одной кэш-строки Задача Моделирование поверхностных химических реакций на катализаторе Консервативный алгоритм моделирования дискретнособытийных систем Счетчики локального времени для каждого потока – часто обновляют свое значение и читают значения соседних Текущее состояние генераторов случайных чисел для каждого потока – часто обновляют свое состояние Переменные рядом Время, с 4 Переменные с шагом 64 байта 3,5 3 2,5 2 1,5 1 0,5 0 1 2 4 Число потоков При разнесении переменных в памяти получаем большее ускорение. Intel Corei7 920 2.67 GHz Quad code План Введение в архитектуру: теория Практические следствия Привязка процессов к ядрам Ограничение пропускной способности памяти узла Планирование (shedule) обхода данных несколькими потоками в OpenMP Использование несколькими потоками одной кэш-строки Сравнение производительности MPI и MPI+OpenMP Выводы Сравнение MPI и MPI+OpenMP Задача Решение 2D волнового уравнения с помощью двухслойной явной схемы Декомпозиция пространства моделирования MPI+OpenMP: сравнение производительности Использование одного узла 25 mvs100k nks-30t 12 10 Время, с 20 Время, с Nehalem 15 10 8 6 4 5 2 0 0 MPI:8 MPI:4 MPI:2 MPI:1 MPI:8 MPI:4 MPI:2 MPI:1 OpenMP:1 OpenMP:2 OpenMP:4 OpenMP:8 OpenMP:1 OpenMP:2 OpenMP:4 OpenMP:8 В одном узле MPI и MPI+OpenMP дают одинаковые результаты. На Nehalem 2 и 4 потока на процесс работают быстрее. Сравнение MPI и MPI+OpenMP Задача mvs100k Решение 2D волнового уравнения с помощью двухслойной явной схемы Декомпозиция пространства моделирования MPI+OpenMP: сравнение производительности 100 120 8 потоков 60 40 20 Число ядер На этой задаче MPI лучше, чем MPI+OpenMP. 64 12 8 25 6 51 2 10 24 20 48 40 96 32 0,1 16 0 1 64 12 8 25 6 51 2 10 24 20 48 40 96 32 16 8 4 2 1 4 потока 80 8 Время, с 1 2 потока 4 4 потока 8 потоков 10 1 поток 100 2 2 потока Эффективность, % 1 поток Число ядер Сравнение MPI и MPI+OpenMP Задача Моделирование поверхностных химических реакций на катализаторе Блочно-синхронный клеточный автомат Декомпозиция пространства моделирования MPI+OpenMP: сравнение производительности mvs100k Сетка: 4000×4000 Объем данных: 30.5 MB 3500 250 Mcell/s 1 поток Эффективность, % 1 поток 3000 2 потока 2500 4 потока 2000 8 потоков 1500 1000 500 0 200 2 потока 4 потока 150 8 потоков 100 50 0 1 2 4 8 16 32 64 Число ядер 128 256 512 1024 1 2 4 8 16 32 64 Число ядер Здесь OpenMP позволяет повысить масштабируемость задачи с ростом числа используемых узлов. 128 256 512 1024 Выводы Как в MPI, так и в OpenMP следует учитывать архитектурные ограничения. Нет универсального способа сделать MPI+OpenMP лучше, чем MPI. Но в классе задач, где коммуникации преобладают над вычислениями, использование OpenMP будет иметь смысл. Спасибо за внимание Дополнительные слайды Постановка задачи Волновое уравнение: u pu f 2 t 2 0 x a, 0 y b u t 0 u 0 t t 0 u x 0 u x a u y 0 u y b 0 Постановка задачи Явная схема: n 1 i, j u uin, j 1 u n i , j 1 u u n i 1, j n i, j uin, j 1 uin1, j uin, j 1 n 1 i, j 2u u n i, j f i , j 1 2 2 hy 2hx u n i 1, j hx hy 3 hy 4 n i , j 1 k 1 hx n ui 1, j uin, j 2h y 2hx k uin, j pi 1 , j 1 pi 1 , j 1 2 2 2 2 2 u 4 p i 1 , j 1 2 2 pi 1 2 , j 1 2 uin, j pi 1 , j 1 pi 1 , j 1 2 2 2 2 hx n ui , j 1 uin, j pi 1 , j 1 pi 1 , j 1 2 2 2 2 2h y Параметры задачи Данные задачи Размер сетки: 8000×8000 Тип данных: double (8 байт) 2 массива Всего: 976 Мбайт Число шагов: 100 Ограничение пропускной способности памяти узла Программа без оптимизации 60 Число MPI-процессов Число MPI-процессов 512 256 128 0 64 512 256 128 64 32 16 8 4 2 0 20 32 10 40 16 20 60 8 30 80 4 Nehalem 2 40 1 Время, с nks-30t mvs100k nks-30t Nehalem 100 1 mvs100k 50 Эффективность, % 120 Ограничение пропускной способности памяти узла Программа с оптимизацией Число MPI-процессов Число MPI-процессов 512 0 256 512 256 128 64 32 16 8 4 2 0 20 128 10 mvs100k nks-30t Nehalem 40 64 20 60 32 30 16 40 80 8 Nehalem 100 4 50 nks-30t 2 mvs100k 1 60 Эффективность, % 120 1 Время, с 70