Технология разработки распределенных параллельных программ с помощью Cluster OpenMP На примере библиотеки алгоритмов обработки вероятностных сетей Probabalistic Network Library (PNL) Отчет за период с 01.07.06 по 30.09.06 Нижегородский Государственный университет им. Н.И. Лобачевского 1/29 Исполнители Кураторы: • Сысоев Александр (ННГУ) • Тананакин Андрей (Intel) Участники: • Камаев Андрей (ITLab) • Коваленко Александр (ITLab) • Лабутина Анна (ННГУ) • Сиднев Алексей (ITLab) Нижегородский Государственный университет им. Н.И. Лобачевского 2/29 Содержание • • • • • • • • 3/29 Цели проекта Введение Технологии создания параллельных программ Технология Cluster OpenMP Использование Cluster OpenMP для распараллеливания алгоритмов вывода и обучения (PNL) Оптимизация Cluster OpenMP реализаций параллельных алгоритмов вывода и обучения Заключение Литература Нижегородский Государственный университет им. Н.И. Лобачевского 4/29 Цели проекта Нижегородский Государственный университет им. Н.И. Лобачевского Цели проекта 5/29 • Используя реализацию PNL под OpenMP, распараллелить алгоритмы библиотеки PNL с помощью Cluster OpenMP на Linux EM64T. • Сравнить производительность параллельных версий алгоритмов на основе Cluster OpenMP с версиями на основе MPI и OpenMP • Собрать статистику, характеризующую процесс внедрения в программный код указанных алгоритмов библиотеки PNL c поддержкой Cluster OpenMP • В работе над алгоритмами библиотеки применить Intel® Thread Checker и Intel® Thread Profiler, собрать и оформить отзывы по из использованию • Опубликовать результаты на www.sourceforge.net Нижегородский Государственный университет им. Н.И. Лобачевского 6/29 Введение Нижегородский Государственный университет им. Н.И. Лобачевского Введение 7/29 • Какие средства необходимы программисту для создания параллельной программы? – Процессы – Потоки – Инструменты передачи данных через сеть • Поддержка со стороны операционной системы • Инструменты параллельного программирования – Отладчики, сборщики трасс, «предсказатели эффективности» – Технологии Нижегородский Государственный университет им. Н.И. Лобачевского 8/29 Технологии создания параллельных программ Нижегородский Государственный университет им. Н.И. Лобачевского 9/29 Технологии создания параллельных программ Многопоточное программирование – Наиболее общий способ создания параллельных программ для систем с общей памятью. Функциональны параллелизм = написание различных потоковых функций. Параллелизм по данным = общее виртуальное адресное пространство процесса. Необходима синхронизация и преодоление возможных проблем: взаимной блокировки, тупиков, гонок данных,… Нижегородский Государственный университет им. Н.И. Лобачевского 10/29 Технологии создания параллельных программ OpenMP – это технология, которая позволяет переложить реализацию решений типовых проблем многопоточного программирования на компилятор. К достоинствам этой технологии можно отнести простоту использования, гибкость и возможность повторного использования программ. Нижегородский Государственный университет им. Н.И. Лобачевского 11/29 Технологии создания параллельных программ MPI – предоставляет механизм построения параллельных программ в модели обмена сообщениями, характерной для разработки в кластерных системах. Стандарт специфицирует набор функций и вводит определенный уровень абстракций на основе сообщений, типов, групп и коммуникаторов, виртуальных топологий. К достоинствам этой технологии можно отнести переносимость и повышение эффективности параллельных программ. Нижегородский Государственный университет им. Н.И. Лобачевского 12/29 Технология Cluster OpenMP Нижегородский Государственный университет им. Н.И. Лобачевского 13/29 Технология Cluster OpenMP • В 2006 году в Intel® C++ Compiler 9.1 появилась поддержка Cluster OpenMP • Технология Cluster OpenMP поддерживает выполнение OpenMP программ на нескольких вычислительных узлах, соединенных сетью. В этом случае узлы не обладают общей (shared) памятью (как в OpenMP), это решается программным путем в библиотеке – "распределенная общая память” (distributed shared memory). Нижегородский Государственный университет им. Н.И. Лобачевского 14/29 Технология Cluster OpenMP Особенности имитации в Cluster OpenMP Имитация памяти • нужно синхронизировать данные между узлами при чтении/записи Программист должен уменьшать число разделяемых данных! Имитация единого пространство потоков • на самом деле на узлах выполняется несколько процессов Явным образом определяем число процессов и число потоков на каждом процессе в ini файле Нижегородский Государственный университет им. Н.И. Лобачевского 15/29 Технология Cluster OpenMP Написание программ на Cluster OpenMP Аналогично OpenMP: • использование директив (простота программирования) • гибкость • … Особенности: • нужно явно определять какие данные должны быть в разделяемой памяти Нижегородский Государственный университет им. Н.И. Лобачевского 16/29 Технология Cluster OpenMP Когда можно использовать Cluster OpenMP • имеется хорошо ускорение на распараллеленной OpenMP программе • невысокие требования к синхронизации данных Нижегородский Государственный университет им. Н.И. Лобачевского 17/29 Технология Cluster OpenMP Нужно заметить… • Если Cluster OpenMP программу на SMP машине она будет работать как OpenMP (нужно это указать в ini файле) • Cluster OpenMP поддерживается пока только на EM64T машинах (Linux) Нижегородский Государственный университет им. Н.И. Лобачевского 18/29 Использование Cluster OpenMP для распараллеливания алгоритмов вывода и обучения библиотеки обработки вероятностных сетей Probabilistic Network Library (PNL) Нижегородский Государственный университет им. Н.И. Лобачевского 19/29 Цели и задачи портирования Цель портирования – получить эффективные реализации алгоритмов с использованием новой технологии. Первый этап: • Gibbs Sampling Inference Engine • EM Learning Второй этап: • Loopy Belief Propagation (Pearl) • Junction Tree Inference Engine Нижегородский Государственный университет им. Н.И. Лобачевского 20/29 Портирование на первом этапе проекта Gibbs Sampling Inference Engine EM Learning Нижегородский Государственный университет им. Н.И. Лобачевского 21/29 Шаг1: Перенос на Linux EM64T • Сборка под Linux – успешно • Сборка MPI версии – проблемы с компиляцией • Соответствие результатов – Собраны дампы всех существующих версий – В Windows (32b) и Linux (64b) rand() работает по-разному • Особенности существующей реализации – Исправлен порядок загрузки и генерации наблюдений в MPI версии теста для EM Learning – Отключена (при помощи препроцессора) установка максимального числа потоков для расчетов Нижегородский Государственный университет им. Н.И. Лобачевского 22/29 Шаг2: Перенос на CLOMP Следование концепции User’s Guide – Библиотека скомпилировалась, но тесты завершались ошибкой сегментирования – Поддержка со стороны компилятора (использование рекомендуемых ключей) не позволила получить ожидаемых результатов – Использование решений для контейнеров STL и иерархий наследования не удалось из-за проблем с компиляцией Необходим собственные решения анализ библиотеки Нижегородский Государственный университет им. Н.И. Лобачевского и 23/29 Шаг2: Перенос на CLOMP Наше решение: Концепция Cluster OpenMP несколько отличается от модели OpenMP, поэтому мы решили их максимально сблизить: реализация выделения динамической памяти только в sharable области Но на этом портирование не закончилось Нижегородский Государственный университет им. Н.И. Лобачевского 24/29 Шаг2: Перенос на CLOMP – Теперь вызовы new в конструкторах глобальных не-sharable объектов приводят к ошибкам сегментирования Как найти такие объекты? – Изменение семантики API • omp_get_num_procs возвращает «странное» значение • omp_set_num_threads стал небезопасным вызовом – Проблемы с компиляцией параллельной секции (компилятор перестал распараллеливать одну из секций) Нижегородский Государственный университет им. Н.И. Лобачевского 25/29 Результаты портирования Цель была достигнута: – Портирование прошло успешно • Тестовые приложения стабильно работают • Результаты работы алгоритмов корректны – Относительное ускорение максимально (для Gibbs Sampling – линейно) Но результат не идеален: – MPI версия всегда на 30% быстрее Нижегородский Государственный университет им. Н.И. Лобачевского 26/29 Портирование на втором этапе проекта Loopy Belief Propagation Junction Tree Inference Engine Нижегородский Государственный университет им. Н.И. Лобачевского 27/29 Шаг1: Перенос на Linux EM64T • Были использованы знания с первого этапа → не возникло технических проблем • В Junction Tree выявлены ошибки распределения вычислительной нагрузки в OpenMP версии → внесены поправки в алгоритм Нижегородский Государственный университет им. Н.И. Лобачевского 28/29 Шаг2: Перенос на CLOMP Следование концепции User’s Guide На этом этапе мы использовали более свежую версию компилятора, и Intel Threading Tools → помощь от компилятора была более содержательной, но столь же недостаточной Собственная концепция: В качестве общей идеи использовали подход, найденный на первом этапе проекта – глобальная перегрузка new/delete. Новая проблема: • Некорректная работа со ссылками в параллельном регионе → мы заменили ссылки на указатели Нижегородский Государственный университет им. Н.И. Лобачевского 29/29 Результаты портирования Основная цель была достигнута: – Портирование прошло успешно • Тестовые приложения стабильно работают • Результаты работы алгоритмов корректны Но результат требует оптимизации: – Вместо ускорения мы получили линейное ЗАМЕДЛЕНИЕ Нижегородский Государственный университет им. Н.И. Лобачевского 30/29 Оптимизация Cluster OpenMP реализаций параллельных алгоритмов вывода и обучения Нижегородский Государственный университет им. Н.И. Лобачевского 31/29 Оптимизация CLOMP-версий алгоритмов PNL После первого этапа работы на 2-х из 4-х алгоритмов не удалось получить ускорение (JTree и Pearl). Новая задача – оптимизация алгоритмов. Нижегородский Государственный университет им. Н.И. Лобачевского 32/29 Оптимизация CLOMP-версий алгоритмов PNL Intel предложил использовать инструменты Intel® Thread Checker и Intel® Thread Profiler. Для чего? Intel® Thread Checker должен показать ошибки в коде. Под Linux инструментация не прошла. Под Windows прошла только бинарная инструментация, где найдено 3 ошибки (2 «гонки данных» – JTree; ошибка «чтения/записи»– Pearl) Intel® Thread Profiler должен помочь найти причины замедления. При замедлении в 2,5 раза Profiler предсказывал линейное ускорение! Нижегородский Государственный университет им. Н.И. Лобачевского 33/29 Оптимизация CLOMP-версий алгоритмов PNL Причины замедления • выравнивание данных (OMP – 16 байт, CLOMP – 8 байт); • медленная работа функций выделения/удаления памяти; • много лишних sharable данных, поэтому много пересылок. Нижегородский Государственный университет им. Н.И. Лобачевского 34/29 Оптимизация CLOMP-версий алгоритмов PNL Оптимизация Для решения задачи оптимизации было предложено использовать MPI реализацию. Почему? Такая реализация пересылок. использует минимальное число Это позволяет и в Cluster OpenMP реализации использовать меньше sharable данных! Нижегородский Государственный университет им. Н.И. Лобачевского 35/29 Оптимизация CLOMP-версий алгоритмов PNL Как этого добиться? • была переписана реализация MPI API под Cluster OpenMP; • в параллельную секцию был помещен весь код тестового приложения; Нижегородский Государственный университет им. Н.И. Лобачевского 36/29 Оптимизация CLOMP-версий алгоритмов PNL Pearl 0,35 0,3 time 0,25 0,2 0,15 0,1 0,05 0 MPI CLOMP MPI to CLOMP MPI to CLOMP-opt Нижегородский Государственный университет им. Н.И. Лобачевского 37/29 Оптимизация CLOMP-версий алгоритмов PNL EMLearn 4 3,5 speedup 3 2,5 2 1,5 1 0,5 0 2 3 MPI CLOMP 4 MPI to CLOMP Нижегородский Государственный университет им. Н.И. Лобачевского 38/29 Оптимизация CLOMP-версий алгоритмов PNL EMLearn 8 7 6 time 5 4 3 2 1 0 1 2 MPI 3 CLOMP 4 MPI to CLOMP Нижегородский Государственный университет им. Н.И. Лобачевского 39/29 Заключение Нижегородский Государственный университет им. Н.И. Лобачевского Заключение • • • 40/29 Получен положительный опыт использования новой технологии разработки параллельных программ для систем с распределенной памятью Cluster OpenMP. В ходе исследований последовательность портирования OpenMP программ на Cluster OpenMPопробована на примере библиотеки обработки вероятностных сетей Probabilistic Network Library и дополнена новыми пунктами. Разработана и практически опробована на алгоритмах PNL последовательность действий по портированию MPI вер-сий параллельных программ на Cluster OpenMP. Получены сравнительные оценки затрат на портирование с OpenMP и MPI (только на примере библиотеки PNL). Нижегородский Государственный университет им. Н.И. Лобачевского Заключение • 41/29 Направление дальнейших исследований в рамках описанной в настоящей работе темы сравнение эффективности трех технологий создания параллельных программ: OpenMP, MPI и Cluster OpenMP. – с точки зрения накладных расходов, которые привносит использование выбранной технологии, – с точки зрения эффективности и масштабируемости готовых параллельных версий. Нижегородский Государственный университет им. Н.И. Лобачевского Литература • • • • • 42/29 Belov S.A., Gergel V.P., Sysoyev A.V. Scalable parallel inference algorithms in probabilistic networks // Preproceedings of UK-Russia Workshop on Proactive Computing, N. Novgorod, 2005, P. 5 – 10. Cluster OpenMP User’s Guide Version 9.1: http://developer.intel.com. Gergel V.P. Teaching Course: CS338. Introduction to Parallel Programming: http://www.msdnaacr.net/curriculum/pfv.aspx?ID=6594. Официальный форум MPI: http://www.mpi-forum.org. Официальный сайт OpenMP: http://www.openmp.org. Нижегородский Государственный университет им. Н.И. Лобачевского 43/29 Вопросы? Нижегородский Государственный университет им. Н.И. Лобачевского