Валентин Арьков - Организация параллельных потоков. Часть 2
- Название:Организация параллельных потоков. Часть 2
- Автор:
- Жанр:
- Издательство:неизвестно
- Год:2020
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Валентин Арьков - Организация параллельных потоков. Часть 2 краткое содержание
Параллельные программы нужны для того, чтобы использовать вычислительные мощности многоядерных процессоров и графических ускорителей. В данной работе мы рассмотрим технологию автоматической организации параллельных потоков для многоядерных вычислительных машин.
Организация параллельных потоков. Часть 2 - читать онлайн бесплатно ознакомительный отрывок
Интервал:
Закладка:
Например, нулевой поток привязываем к нулевому ядру. Маска равна
2 0 = 1.
Первый поток привязываем к первому ядру. Маска равна
2 1 = 2.
И так далее.
Затем в строке 14 задаём привязку к ядру с помощью следующей функции:
SetThreadAffinityMask.
Для контроля выводим данные на экран (строка 15).
В нашей программе появился новый параметр директивы parallel:
private (TNum, Mask).
Таким способом мы объявляем, что две переменные будут локальными внутри параллельных потоков. Это означает, что в каждом потоке будет своя переменная с указанным названием. Присвоение значения такой переменной в одном потоке никак не повлияет на значение той же самой переменной в другом потоке. В нашей программе это номер потока в группе и маска для привязки к ядру.
Рис. 4.28. Привязка потоков к ядрам
Компилируем.
Переходим в командное окно. Задаём два потока и запускаем программу.
Рассмотрим загрузку в Диспетчере задач (рис. 4.29).
Теперь нулевое и первое ядра загружены на 100%. Остальные ядра не участвуют в нашей работе.
Рис. 4.29. Два потока — два ядра
Задание.Составьте программу (рис. 4.28) и запускайте её с разным количеством потоков. Обратите внимание на загрузку отдельных ядер.
Рассмотрим значения маски для разного количества потоков. Убедимся, что значения маски вычисляются правильно (рис. 4.30).
Рис. 4.30. Вычисление маски
Задание.Установите разные значения количества потоков и проверьте правильность вычисления маски.
4.4. Время вычислений
Мы рассмотрели организацию параллельных вычислений. Настало время заняться временем. Нас интересует время вычислений. По нему мы сможем оценить эффективность распараллеливания.
Время в компьютере измеряют с помощью системного таймера. Для обращения к таймеру есть ряд готовых функций.
В предыдущей работе мы использовали стандартную функцию clock ().
Чтобы получить время в секундах делим разность показаний на количество тиков CLOCKS_PER_SEC.
В библиотеке OpenMP есть своя функция для работы с таймером:
double omp_get_wtime (void).
Точность измерения времени можно узнать с помощью функции:
double omp_get_wtick (void).
Обе функции дают результат в секундах.
Возьмём предыдущую программу с «большой задачей» суммирования. Добавим замеры времени и выведем результаты на экран (рис. 4.31).
Рис. 4.31. Замеры времени
Запускаем программу и подбираем число итераций цикла так, чтобы работа продолжалась примерно секунд 20.
Нас интересует, насколько существенной будет «разница в показаниях». В нашем примере разница в третьем-четвёртом знаке после запятой, или в пятом значащем разряде (рис. 4.32).
Рис. 4.32. Две оценки времени
Зададим побольше итераций. Разница по-прежнему в третьем-четвёртом знаке после запятой (рис. 4.33). И это приемлемая разница — если принять во внимание, что заявленная точность библиотечной функции clock ()составляет 0,001 сек.
В следующих упражнениях мы примем дополнительные меры для повышения точности измерения времени.
Рис. 4.33. Ещё две оценки
Задание. Составьте и запустите программу (рис. 4.31). Сравните значения продолжительности вычислений, полученные двумя способами.
5. Параметры командной строки
Для организации экспериментов нам понадобится много раз запускать одну и ту же программу с разными настройками и параметрами. Конечно, можно каждый раз изменять исходный текст, компилировать исполняемый файл и вручную запускать его на выполнение. Но это дополнительные затраты времени. Мы поступим по-другому.
В нашем распоряжении есть такой инструмент, как параметры (аргументы) командной строки. Мы его уже использовали в предыдущей работе. Напомним, что это такое и как это работает.
В командной строке мы запускаем программу на выполнение. Мы пишем название файла. Расширение имени файла можно не указывать. После имени файла через пробел можно указать дополнительные параметры. Это просто символы, строки текста, разделённые пробелами. Программа может прочитать их — точно так же, как мы вводим данные с клавиатуры. Этот приём часто используется при вызове команд операционной системы.
Задание. Изучите в Википедии статью «Интерфейс командной строки». Обратите внимание на раздел «Формат команды» и выясните, что означают квадратные скобки в описании команд операционной системы. Обратите внимание на раздел «Достоинства» и выясните, какое преимущество командной строки мы используем для организации наших вычислительных экспериментов.
5.1. Команда DIR
Рассмотрим для примера работу с командой DIR. Эта команда выводит на экран содержимое директории, то есть список файлов в текущем каталоге. Название команды — это сокращение английского слова DIRECTORY.
Задание. Прочитайте в английской версии Википедии начало статьи «Directory (computing)» и выясните, что такое «директория». Переключитесь на русский вариант статьи и выясните, какими словами может называться этот объект.
Познакомимся с командой DIR. Переходим в командное окно и вводим нашу команду. Сейчас мы вводим саму команду без параметров (рис. 5.1). Получаем сведения про текущий диск, папку и файлы.
Рис. 5.1. Команда DIR без параметров
Чтобы узнать подробности о нашей команде, вызываем её с параметром /?(рис. 5.2). То, что вводят после имени команды, называют разными словами: параметры, ключи, опции и т. п.
Нам сообщают, что делает наша команда, какой у неё формат вызова и что делают разные ключи. Видим, что параметры нужно вводить через пробел после команды.
Рис. 5.2. Справка по использованию команды
Задание.Вызовите справку и выясните, что делают параметры /B, /O и /X. Вызовите команду DIRпо очереди с каждым из этих ключей.
5.2. Чтение параметров
При запуске программы на выполнение можно получить параметры командной строки (command-line arguments). Для этого в начале программы в заголовке главной функции main указывают аргументы argcи argv:
int main (int argc, char* argv []).
argc — сокращение от выражения arguments count (the count of arguments). Это количество параметров командной строки. Если argc равен 1, значит при вызове вводили только имя исполняемого файла.
argv — сокращение от arguments values (the values of the arguments). Это массив указателей на строки символов. Каждый аргумент командной строки — это строка, состоящая из одного или нескольких символов. Квадратные скобки после argv говорят о том, что это массив. Звёздочка — что это указатель. Таким образом, argv указывает на первый элемент массива. А размер этого массива мы узнаём из предыдущего параметра argc.
Читать дальшеИнтервал:
Закладка: