Файл: Б. М. Глинский канд техн наук, доцент.pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 23.11.2023

Просмотров: 113

Скачиваний: 2

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

67
1   2   3   4   5   6   7

5. ЛАБОРАТОРНЫЙ ПРАКТИКУМ
К
ОМАНДЫ ОПЕРАЦИОННОЙ СИСТЕМЫ
Лабораторные работы выполняются в операционной системе Linux.
Ниже рассматриваются некоторые команды Linux, которые помогут облегчить разработку параллельных программ. Для каждой команды приводятся лишь сведения, полезные для выполнения практикума.
За дополнительной информацией о работе команд и возможных опци- ях следует обратиться к книге [5] и официальной документации, ссыл- ки на которую приведены в дополнительной литературе к настоящему разделу.
Команда less. Позволяет вывести на экран содержимое указанно- го файла и передвигаться по тексту с помощью клавиш управления курсором («
», «», «PgUp», «PgDown»). Для выхода из режима про- смотра необходимо нажать клавишу «Q». Например, команда
$ less /proc/cpuinfo выведет на экран содержимое файла /proc/cpuinfo.
Команда grep. Позволяет вывести только те строки файла, кото- рые содержат заданный шаблон, описываемый с помощью регулярных выражений. Например, команда
$ grep processor /proc/cpuinfo выведет только те строки файла /proc/cpuinfo, которые содержат подстроку processor.
Команда ps. Позволяет отобразить список процессов операцион- ной системы (в момент вызова команды). Например, команда
$ ps

68 выводит информацию о процессах, ассоциированных с текущим тер- миналом; команда
$ ps ax выводит информацию о всех работающих в настоящее время процес- сах; команда
$ ps u позволяет узнать, какой процент процессорного времени (столбец
%CPU) и памяти (столбец %MEM) занимают запущенные текущим пользователем процессы, а также общее время работы этих процессов
(столбец TIME); команда
$ ps -mfL позволяет получить детальную информацию о запущенных потоках, в том числе выводит информацию о количестве потоков у каждого про- цесса (столбец NLWP) и идентификатор каждого потока (столбец
LWP).
Командой ps удобно пользоваться совместно с командой less для пролистывания выводимой информации с помощью кнопок вверх/вниз:
$ ps ax | less
Команда top. Позволяет отображать список процессов операцион- ной системы и их активность «в реальном времени». На рис. 3 изобра- жено окно терминала, в котором запущена команда top. В верхней части экрана отображается общая информация: количество задач и их статус, текущая загрузка процессора и памяти, файла подкачки и дру- гая полезная информация. Ниже расположена таблица, в которой пере- числены процессы (отображается часть процессов, помещающаяся в окно, с учетом текущих настроек сортировки).
Выводом команды top можно управлять с помощью нажатия кла- виш:
 1 – включает SMP-режим: отображает загрузку каждого процессо- ра (ядра); повторное нажатие отключает режим;
 A – сортировка процессов по возрасту;
 P – сортировка процессов по использованию процессора;
 M – сортировка процессов по использованию памяти;
 T – сортировка процессов по времени выполнения.


69
Рис. 3. Вывод команды top
Команда kill. Позволяет послать заданному процессу любой сиг- нал. Например, команда
$ kill -9 12345 позволяет принудительно завершить процесс с номером 12345, послав ему сигнал SIGKILL. Такое действие может потребоваться, если про- цесс завис и не может завершиться самостоятельно.
Компиляция программ
Существует несколько реализаций Pthreads под различные опера- ционные системы. В рамках практикума будет использоваться библио- тека libpthread для ОС Linux, а в качестве компилятора – GNU GCC.
Для использования API, предоставляемого Pthreads, необходимо подключить заголовочный файл pthread.h:
#include
Для корректной компиляции многопоточных программ на базе
Pthreads необходимо использовать опцию компилятора -pthread, ко-

70 торая для GCC эквивалентна заданию двух опций (при компиляции под Linux):
 -lpthread – указывает компоновщику на необходимость подклю- чения библиотеки libphread для поддержки потоков POSIX (в за- висимости от того, какой режим сборки задан другими ключами, подключится либо статическая библиотека libpthread.a, либо динамическая библиотека libpthread.so);
 -D_REENTRANT – указывает компилятору на необходимость опре- деления макроса _REENTRANT, что приведет к использованию по- токобезопасных объявлений стандартной библиотеки C.
Таким образом, если имеется программа на языке С++ с именем threads_demo.cpp, ее можно скомпилировать командой
$ g++ threads_demo.cpp -pthread -o threads_demo
Для использования отладчика программу нужно скомпилировать с отладочной информацией (опция компилятора -g). Желательно также отключить оптимизацию (опция компилятора -O0) для предотвраще- ния удаления / слияния переменных, раскрутки циклов и прочих опти- мизаций. Например, для отладки многопоточной программы с именем threads_demo.cpp можно использовать команду:
$ g++ threads_demo.cpp -pthread -g -O0 -o threads_demo
И
ССЛЕДОВАНИЕ ПРОИЗВОДИТЕЛЬНОСТИ
ПАРАЛЛЕЛЬНЫХ ПРОГРАММ
Для оценки качества разработанной параллельной программы тре- буется провести исследование ее производительности: изучить зави- симость времени исполнения программ от размера задачи и количества используемых программой процессорных ядер, измерить ускорение и посчитать эффективность.
Время исполнения программы
Как правило, под размером задачи подразумевается объем входных данных или другая характерная для задачи величина, прямо влияющая на количество вычислительных операций алгоритма, необходимых для решения задачи. Например, если требуется решить задачу умножения квадратных матриц, то такой величиной может быть размер матрицы.
Характер зависимости времени работы программы от размера задачи


71 должен соответствовать характеру зависимости между количеством операций алгоритма и размером задачи: так, если время умножения квадратных матриц размера N на P процессорных ядрах составляет
M секунд, то время умножения матриц размера 2•N на P процессорных ядрах должно быть близко к 8•M.
Если наблюдаемая картина не соответствует ожиданиям, в отчете должно быть сформулировано обоснование и дано пояснение, может ли программа быть оптимизирована, чтобы это несоответствие устра- нить. Примером такой ситуации может быть скачкообразное увеличе- ние времени работы программы, объясняющееся выходом данных за пределы кэш-памяти третьего уровня.
В отчете по лабораторной работе должны быть указаны характери- стики вычислительной системы и системного программного обеспече- ния, на которых производилось тестирование (см. образец в табл. 6), в том числе: наименование процессора и его частота, объем оперативной памяти, операционная система, производитель и версия компилятора, опции оптимизации компилятора и другие имеющие значение пара- метры.
Т а б л и ц а 6
Список использованных вычислительных систем
№ п/п
Описание системы
1
Аппаратная конфигурация
ЦП Intel Core i5-8250U @ 1.60 GHz
(гипертрединг включен), ОЗУ 4 ГБ
Программная конфигура- ция
ОС Windows 7, компилятор Intel C++
Compiler v. 18.0 (уровень оптимизации
-O3)
Результаты измерений времени исполнения программы необходи- мо представить в отчете в виде таблиц (см. образец в табл. 7). В заго- ловок таблицы включается ссылка на конфигурацию вычислительной системы. Если используются логические ядра, то рядом с количеством ядер указываются символы HT (англ. Hyper-threading). Все измерения должны выполняться в отсутствие другой вычислительной нагрузки на процессоры (во всех приведенных примерах предполагается, что вна- чале занимаются все физические ядра и только потом начинают ис- пользоваться логические ядра HT).

72
Т а б л и ц а 7
Время (с) работы программы умножения квадратных матриц
при различных размерах задачи и количестве процессорных ядер
на вычислительной системе № 1 из табл. 6
Количество ядер
Размер задачи
(сторона матрицы)
1 2 3 4 8
(HT)
64 0,0005 0,0003 0,0008 0,0012 0,0021 512 0,2764 0,1397 0,0941 0,0718 0,0823 1024 2,3123 1,1565 0,7942 0,5913 0,3623 4096 148,3242 74,1832 50,4323 37,1234 20,5638
Подробные рекомендации по измерению времени исполнения про- граммы приведены в разделе 4.3 учебного пособия [6]. Отметим неко- торые из них.
 Для получения достоверных результатов (чтобы исключить вли- яние посторонних процессов в операционной системе компьютера) необходимо при одинаковых условиях многократно повторить измере- ние времени исполнения программы и выбрать наименьшее время.
 Рекомендуется измерять астрономическое время работы про- граммы.
 Необходимо измерять время исполнения не всей программы, а только ее вычислительной части, без учета операций ввода / вывода, если преподавателем специально не оговорено иное.
Ускорение и эффективность
Судить о качестве параллельной программы позволяют также про- изводные характеристики от времени исполнения программы:
ускорение программы S
P
на P ядрах – отношение времени ра- боты программы на одном ядре T
1
ко времени работы программы на
P ядрах T
P
при тех же входных данных: S
P
= T
1
/ T
P
;
эффективность работы программы E
P
на P ядрах – отноше- ние ускорения на P ядрах S
P
к количеству ядер P: E
P
= S
P
/ P.
Необходимо стремиться к тому, чтобы на P ядрах программа до- стигала ускорения в P раз относительно времени выполнения на од- ном ядре T
1
. Как правило, наблюдается меньшее ускорение, что свя- зано с накладными расходами на организацию параллельных вычисле-


73 ний: порождение дополнительных потоков, синхронизация потоков при доступе к общим данным и т. д. В задачу программиста входит минимизация таких расходов. В некоторых задачах получается дости- гать «сверхлинейного» ускорения, когда на P ядрах программа рабо- тает быстрее, чем в P раз. Для объяснения этих явлений необходимы знания об архитектуре процессора, которые можно найти в книге [6].
Эффективность параллельной программы оценивается относитель- но последовательной, реализующей тот же самый алгоритм, и позволя- ет судить о том, какая доля времени в работе параллельной программы тратится на вычислительные операции алгоритма, а какую долю зани- мают накладные расходы на организацию параллельных вычислений.
В предположении, что последовательная программа загружает ядро процессора максимально полно (на 100 %), характеристика эффектив- ности позволяет оценить, насколько полно параллельная программа нагружает P процессорных ядер. В процессорах с технологией Hyper- threading, где физически присутствует P ядер, а логически – 2*P, иногда использование большего количества потоков T > P позволяет получать дополнительное ускорение S
T
> S
P
. Поэтому имеет смысл исследовать ускорение и эффективность для различных вариантов
T > P. Эффективность для случая T > P рассчитывается по форму- ле E
T
= S
T
/ P.
Характеристики ускорения и эффективности в отчетах по лабора- торным работам необходимо представлять в табличном виде (см. обра- зец в табл. 8) и в виде графиков (см. образцы на рис. 4 и 5).
Т а б л и ц а 8
Ускорение S и эффективность E работы программы умножения
квадратных матриц при различных размерах задачи и количестве
процессорных ядер на вычислительной системе № 1 из табл. 6
Количество ядер
Размер задачи
(сторона матри- цы)
Ускорение и эффектив- ность
1 2 3 4 8
(HT)
64
S
1 1,67 0,63 0,42 0,24
E
1 0,84 0,21 0,11 0,06 512
S
1 1,98 2,94 3,85 3,35
E
1 0,99 0,98 0,96 0,84

74
Рис. 4. Ускорение работы программы умножения квадратных матриц при различных размерах задачи и количестве процессор- ных ядер на вычислительной системе № 1 из табл. 6
Для краткости примеров в таблице и графиках количество вариан- тов размеров задачи уменьшено относительно табл. 7, однако в отчетах по лабораторным работам требуется приводить показатели для всех вариантов.
Рис. 5. Эффективность работы программы умножения квадрат- ных матриц при различных размерах задачи и количестве про- цессорных ядер на вычислительной системе № 1 из табл. 6 0
0,5 1
1,5 2
2,5 3
3,5 4
4,5 1
2 3
4 8(HT)
Ус ко р
е н
и е
Количество ядер
64 512 0
0,2 0,4 0,6 0,8 1
1,2 1
2 3
4 8(HT)
Эффективность
Количество ядер
64 512