Лабораторная работа N3
Изучение технологий параллельного программирования
Материал лекции "Технологии параллельного программирования".
Видеозапись лекции 12.05.2020 (157 Мб)
"Высокопроизводительные вычисления на кластерах" (уч. пособ. Томского ГУ).
The GNU C Library: Гл. 26: процессы
Введение
Исследования показывают, что потенциальный параллелизм в научных и технических прикладных программах может быть очень большим. Использование технологий параллельного программирования позволяет повысить скорость решения задач подобного рода в несколько раз.
В ходе работы предлагается решить учебную задачу при помощи различных технологий параллельного программирования и определить, как влияют различные параметры конфигурации той или иной технологии на эффективность решения.
Изучаемые технологии:
- Симметричные мультипроцессорные системы (SMP). Стандартные средства многозадачной ОС (fork или POSIX threads).
- Симметричные мультипроцессорные системы (SMP). Интерфейс OpenMP.
- Кластерные системы. Библиотека OpenMPI.
Варианты задач:
- A. Обратить хэш MD5 (подобрать сообщение, порождающее заданный хэш).
- B. Проверить, является ли заданное число простым.
Применение любой технологии параллельного программирования подразумевает процесс разработки параллельного алгоритма, т. е. как минимум:
- декомпозицию задачи (оценку возможности распараллеливания);
- проектирование коммуникаций между параллельными блоками;
- планирование вычислений (распределение подзадач между процессорами).
Рассмотрим процесс разработки для следующей учебной задачи:
Обратить хэш MD5 (подобрать сообщение, порождающее заданный хэш).
Наиболее очевидное и надёжное (хотя и самое медленное) решение этой задачи — полный перебор. Для решения задач, требующих полного перебора возможны два варианта распараллеливания:
- построение конвейера (если один шаг перебора представить в виде цепочки из N простых операций, тогда каждую из этих операций можно выделить в отдельную параллельную подзадачу для N-процессорной системы; каждый процессор выполняет свою операцию конвейера и передаёт результат следующему процессору; процессоры работают параллельно, но обрабатывают данные разных шагов перебора; недостатком этого подхода является большое количество данных, передаваемых между подзадачами);
- разбиение множества перебираемых текстов на непересекающиеся подмножества (таким образом, каждый процесс параллельной системы выполняет перебор на своём множестве).
Для данной задачи второй подход более привлекателен, так как менее требователен к проектированию коммуникаций. Блок, первым нашедший решение задачи на своём подмножестве текстов, должен уведомить об этом остальные блоки.
Для разбиения всего множества текстов на подмножества для параллельных подзадач воспользуемся следующим принципом. Считая, что число процессоров (параллельных блоков) N меньше количества символов в наборе, из которого состоит текст, M, будем текст, начинающийся с k-го символа из набора, обрабатывать i-м блоком, где
Любой текст можно интерпретировать как N-значное число в системе счисления по основанию M, где N - длина текста, M - количество символов в наборе, из которого состоит текст, поэтому полный набор текстов длиной N символов содержит MN вариантов. При тестировании алгоритма следует учитывать, что на имеющейся вычислительной технике для N = 4 перебор выполняется в среднем за несколько секунд, для N = 5 — за несколько минут, для N = 6 — за несколько часов, для N = 7 — за несколько дней и т. д. В ходе отладки целесообразно использовать N = 4, а при оценке эффективности — N = 5.
Декомпозиция задачи B решается аналогичным способом:
Проверить, является ли заданное число простым.
Легче всего распараллеливается алгоритм простого перебора делителей. Разным процессам, решающим задачу по данному алгоритму, назначаются разные множества делителей. Первый же процесс, нашедший какой-либо делитель заданного числа, может завершить выполнение всей задачи. То, что число является простым, фиксируется только в том случае, если ни один процесс не найдёт делителей.
SMP. Стандартные средства многозадачной ОС
Современные многозадачные ОС позволяют любой задаче порождать процессы или нити. Если задача работает на симметричной мультипроцессорной системе, эта возможность позволяет реализовать параллелизацию алгоритмов задачи.
В POSIX-совместимых ОС для манипулирования нитями используется библиотека POSIX Threads (pthread). Ознакомится с её возможностями можно по справочному руководству info libc в соответствующем разделе. Наиболее полезные функции, предоставляемые данной библиотекой: pthread_create, pthread_join и др. При компиляции программы, использующей эту библиотеку, следует указывать ключ -lpthread.
Для порождения процессов используется функция fork. После выполнения этой функции задача продолжается сразу в двух процессах: родительском и дочернем. Родительскому процессу эта функция возвращает PID дочернего процесса, а дочернему — ноль. При нехватке системных ресурсов функция завершится с ошибкой, вернув отрицательный результат. Порождённый дочерний процесс является точной копией родительского процесса (с несущественными исключениями). Для синхронизации процессов можно воспользоваться функциями wait, kill и т. п. Перечисленные функции являются базовыми и не требуют подключения дополнительных библиотек при обработке программы редактором связей.
Задание 1а
Модифицировать предоставленный алгоритм, используя параллельное выполнение блоков кода программы. Сравнить время работы однопроцессного варианта программы с модифицированным. Определить, как меняется время выполнения программы при варьировании числа параллельно работающих блоков.
Задание выполняется на SMP-системе. Рекомендуется распараллеливание при помощи процессов, но по желанию допускается также реализация на нитях.
Для оценки времени выполнения программы удобно использовать утилиту time. Например, команда time ls, кроме результата работы команды ls, выдаст также время её выполнения.
SMP. Интерфейс OpenMP
Интерфейс OpenMP при помощи директив компилятора и набора библиотечных функций предоставляет программисту средства распараллеливания программ. Ознакомиться с возможностями данного интерфейса можно по адресу: https://computing.llnl.gov/tutorials/openMP/ Для компилятора gcc при использовании интерфейса OpenMP следует использовать ключ -fopenmp.
Задание 1б
(Задание выполняется как обязательное студентами направления "ИВТ", остальным – по желанию).
Модифицировать предоставленный алгоритм, используя параллельное выполнение блоков кода
программы при помощи директив OpenMP. Сравнить время работы однопроцессного варианта программы с
модифицированным. Определить, как меняется время выполнения программы при варьировании числа параллельно работающих блоков.
Задание выполняется на SMP-системе.
Кластерные системы. Библиотека OpenMPI
Библиотека OpenMPI позволяет на основе обычных хостов примерно однородной конфигурации организовать распределённую вычислительную систему типа кластер. Копии программы, запущенные на разных хостах, синхронизуют свою работу и обмениваются сообщениями при помощи протокола MPI. Утилиты библиотеки OpenMPI обеспечивают прозрачный одновременный запуск приложения на нескольких хостах. Информация об используемой версии библиотеки доступна на сайте: http://www.open-mpi.org/doc/v1.2/. Для компиляции программы, использующей OpenMPI, используется утилита mpicc. Для запуска программы — утилита mpirun.
Задание 2
Модифицировать предоставленный алгоритм, используя параллельное выполнение блоков кода программы при помощи библиотеки OpenMPI. Сравнить время работы однопроцессного варианта программы с модифицированным. Определить, как меняется время выполнения программы при варьировании числа параллельно работающих блоков.
Задание выполняется на кластере "Лусидор".
Приложения
- Образец реализации программы обращения хэша MD5 с использованием библиотеки OpenSSL.
- Образец реализации программы определения простоты числа с использованием библиотеки GMP.
Реализации этих же алгоритмов на FreePascal (2.4+): crack_md5 и check_prime (для ознакомления).
Для сравнения производительности программ следует использовать:
- Хэш текста, длина которого больше MAX_LEN (расчёт на 24 ядрах должен занимать не менее 20 с).
- Число, не имеющее делителей, кроме 1 и себя (т. е. простое, не менее 1020).
Варианты задания
ИВТ: Самостоятельно реализуют модифицированные параллельные алгоритмы для SMP, OpenMP, OpenMPI.
Приборостроение: Самостоятельно реализуют модифицированные параллельные алгоритмы для SMP и OpenMPI.
Энергетика/электроника: В работе используют готовые реализации параллельных алгоритмов для SMP и OpenMPI.
Форма сдачи
Программы и отчёт в формате PDF высылаются в архиве TAR+GZIP или ZIP на адрес электронной почты преподавателя.
В отчёте следует привести характеристики системы, на которой выполнялись программы (кластера "Лусидор").
По заданию 1 в отчете приводится:
- Команды или сценарии для компиляции программ;
- Текст сценариев запуска (для TORQUE) и команды заданий;
- Протокол работы вида:
Дата Кол-во процессов Номер задания TORQUE Хост (узел) Время исполнения, с 23.04 1
1
1
2
2
2
4
4
456
...lucidor-cab4-n1
...581.92
... - Итог расчетов: число простое / число непростое, делители: ...
По заданию 2 в отчете приводится:
- Команды или сценарии для компиляции программ;
- Текст сценариев запуска (для TORQUE) и команды заданий;
- Протокол работы вида:
Дата Кол-во процессов Номер задания TORQUE Хост (узел) Время исполнения, с 23.04 1
1
1
2
2
2
4
4
4
8
8
8
12
12
12
16
16
16
20
20
20
24
24
2465
...lucidor-cab4-n1
...582.71
... - По полученным данным следует оценить параметр f (доля последовательных вычислений) из закона Амдала для вашей программы (провести стат. обработку, оценить погрешность). Построить график зависимости S (ускорение) или T (время выполнения) от количества процессов p для экспериментальных данных и полученной модели.
Альтернативное задание
Найдите разложение чисел (программа B) на два целочиселенных делителя, по вариантам:
- № 9529: 4611685283988009529
- № 9641: 4611685936823009641
- № 9811: 4611685511621259811
- № 0077: 18446742860381310077
- № 0087: 18446742688582600087
- № 0103: 18446743298467960103
- № 0799: 18446742722942340799
- № 1039: 18446742551143661039
- № 1299: 18446742061517421299
- № 1519: 18446742018567751519
- № 1661: 18446742572618511661
- № 1691: 18446742409409761691
- № 1701: 18446742435179541701
- № 1707: 18446742692877591707
- № 1817: 18446742903330981817
- № 1829: 18446743496036451829
- № 1961: 18446742606978231961
- № 1983: 18446743414432071983
- № 2039: 18446743264108222039
- № 2153: 18446742482424202153
- № 2221: 18446743289878022221
- № 2339: 18446743302762922339
- № 2557: 18446743461676712557
- № 2853: 18446741954143242853
- № 3013: 18446742525373873013
- № 3107: 18446743118079333107
- № 3643: 18446743856813703643
- № 4201: 18446744045792264201
- № 4263: 18446742654222864263
- № 4321: 18446742057222454321
- № 4363: 18446742997820254363
- № 4753: 18446742868971244753
- № 4781: 18446743259813254781
- № 5091: 18446742585503385091
- № 5143: 18446742482424185143
- № 5627: 18446742130236895627
- № 5687: 18446742087287225687
- № 5849: 18446744011432525849
- № 6011: 18446742499604046011
- № 6337: 18446743375777366337
- № 6637: 18446743053654826637
- № 6709: 18446743238338416709
- № 6751: 18446742757302076751
- № 6789: 18446742014272786789
- № 6871: 18446742671402736871
- № 7113: 18446742460949367113
- № 7123: 18446742095877157123
- № 7181: 18446743118079337181
- № 7441: 18446742946280647441
- № 7489: 18446742834611507489
- № 7569: 18446743152439067569
- № 7573: 18446742654222887573
- № 7629: 18446743453086777629
- № 7677: 18446743740849587677
- № 7779: 18446742533963807779
- № 8119: 18446742787366868119
- № 8131: 18446743380072338131
- № 8283: 18446743169618938283
- № 8321: 18446743959892918321
- № 8633: 18446742125941928633
- № 8759: 18446742576913478759
- № 8833: 18446742697172558833
- № 8911: 18446743895468408911
- № 8973: 18446743255518288973
- № 9209: 18446742937690719209
- № 9221: 18446743530396189221
- № 9229: 18446743324237759229
- № 9277: 18446743418727039277
- № 9397: 18446743375777369397
- № 9459: 18446742551143649459
- № 9559: 18446743002115219559
- № 9701: 18446742559733609701
- № 9807: 18446741958438209807
- № 9819: 18446743173913909819
"Стоимость" наиболее популярных недочётов:
- Отсутствуют "характеристики системы" (см. выше Форма сдачи): -0.2
- Не выполнена стат.обработка (не указаны доверительные интервалы): -0.5
- Итоговые значения рассчитанных параметров приведены с незначащими ("лишними") цифрами: -0.1
- В отчёте не приведены формулы расчётов: -0.1
- Не посчитан второй делитель числа (для альтернативного задания): -0.2
- Не продемонстрирован альтернативный исход работы программы (с успешным подбором текста или непростым числом): -0.1
- Для расчёта параметра закона Амдала использован обращаемый хэш или непростое число (кроме альтернативного задания): -0.2
- Заимствования из чужих работ: -0.5...-2.0
- Невыполнение требований по формату отчета/архива: -0.1
- Повторная проверка отчёта (после "льготной" даты): -0.5
- Нарушение срока сдачи: по -0.5 за каждую начатую неделю после дедлайна