Валентин Арьков - Организация параллельных потоков. Часть 1
- Название:Организация параллельных потоков. Часть 1
- Автор:
- Жанр:
- Издательство:неизвестно
- Год:2020
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Валентин Арьков - Организация параллельных потоков. Часть 1 краткое содержание
В работе используется бесплатная интегрированная среда разработки. Приводятся примеры программ на языке Си.
Организация параллельных потоков. Часть 1 - читать онлайн бесплатно ознакомительный отрывок
Интервал:
Закладка:
Для измерения времени нам понадобится следующая функция:
clock_t clock (void).
Эта функция не имеет входных параметров. Она просто сообщает нам, сколько тактов прошло с начала работы программы. Тип возвращаемого значения определён как
clock_t.
Мы должны задать вспомогательные переменные именно такого типа.
Чтобы пересчитать количество тактов в секунды, нужно разделить количество тактов на значение следующей константы:
CLOCKS_PER_SEC.
Чтобы использовать функцию clock, в начале программы нужно подключить библиотеку, указав заголовочный файл:
time. h.
Пример программы приводится на рис. 4.2.
Исходные данные для расчёта времени — целые числа. После деления может получиться дробное число. Чтобы найти результат в виде дробного числа, придётся в формуле переопределить тип переменных.
Зададим формат вывода на экран для дробного числа так, чтобы получить десять знаков после запятой:
%5.10f.
Рис. 4.2. Измеряем время выполнения
Задание. Составьте программу суммирования с определением времени работы.
Задание. Измените программу так, чтобы вводить количество единиц в командной строке при запуске программы.
Задание. Запустите составленную программу с разным значением параметра Nsи укажите в отчёте время выполнения.
Задание. Подберите количество прямоугольников так, чтобы время выполнения программы составляло от 10 до 20 секунд.
4.3. Пакетная обработка
В предыдущем разделе мы запускали программу вручную. И результаты работы тоже записывали вручную. При большом количестве прогонов программы ручная работа становится неэффективной.
Чтобы выполнять рутинные действия в автоматическом режиме, мы будем использовать пакетный файл. Это текстовый файл с расширением *.BAT. В таком файле записаны команды операционной системы.
В простейшем варианте это будет несколько одинаковых строк с одной и той же командой запуска нашей программы. При выполнении пакетного файла операционная система запустит нашу программу.
Задание. Составьте пакетный файл для нескольких запусков программы.
4.4. Загрузка в Excel
Следующая проблема — это запись результатов в отчёт. Мы сформируем файл в формате CSV, то есть значения с разделителем:
Comma Separated Values.
В английском варианте разделитель полей — запятая, а разделитель целой и дробной частей — точка. Команда вывода на экран в языке Си тоже использует точку как десятичный разделитель. Нам остаётся организовать вывод полученных чисел в одну строчку через запятую — при каждом прогоне программы. Далее мы переходим на следующую строку.
Вот пример вывода результатов в одну строку:
printf (»%d,», S)
printf (»%d\n», Ns)
Чтобы формат вывода легче читался на экране, мы выводим каждое число по отдельности.
После нескольких прогонов мы получим несколько строк. Если вставлять результаты в отчёт вручную, придётся копировать через буфер обмена. Это опять долго и сложно.
Для полной автоматизации работы мы просто перенаправим вывод текста и значений вместо экрана в файл. Для перенаправления стандартного вывода используется символ>. Пример перенаправления вывода в файл:
batch.bat> file. txt.
Кроме того, в начале файла нам нужно отключить вывод на экран каждой команды:
@echo off.
Далее идёт строка заголовков столбцов — тоже через запятую (рис. 4.3).
Рис. 4.3. Содержимое пакетного файла
После прогона и получения текстового файла мы можем загрузить его в пакет Excel. Мы вызываем пункт меню
File — Open.
Затем указываем, что формат файла — текстовый:
Text Files (*.prn, *.txt, *.csv).
Далее с помощью Мастера импортанастраиваем загрузку текстового файла с разделителями и заголовками. Указываем, что десятичный разделитель — точка.
Получаем готовую таблицу с результатами прогонов. И эти результаты уже можно обработать с помощью того же пакета Excel.
Задание. Настройте вывод программы в одну строку через запятую. Создайте пакетный файл по образцу рис. 5. Перенаправьте вывод в текстовый файл. Загрузите файл в Excel.
Задание. Проведите исследование эффективности распараллеливания, задавая разные значения для следующих параметров:
— количество единиц для суммирования;
— количество параллельных потоков;
— количество использованных виртуальных процессоров.
Представьте результаты исследования в виде таблиц и графиков.
5. Параллельные вычисления
5.1. Создание потока
По умолчанию в любом процессе есть один главный поток. Дополнительные потоки программист создаёт «вручную».
Чтобы создать новый поток, используем функцию
CreateThread.
Это готовый, системный, библиотечный вызов операционной системы. Мы используем параметры по умолчанию. Нам понадобится указать только имя подпрограммы, которая будет выполняться в новом потоке (рис. 5.1). В нашем примере это Thread2.
Рис. 5.1. Создание потока
Задание. Создайте и запустите программу по созданию второго потока. Запустите Диспетчерзадач и убедитесь, что в ней присутствует два потока.
Задание. Закомментируйте строку с бесконечным циклом while (1)и запустите программу на выполнение. Запустите Диспетчер задачи обратите внимание на количество потоков.
5.2. Привязка процесса к ядрам
На многоядерном процессоре можно назначить определённые ядра (виртуальные процессоры) для выполнения выбранного процесса. Для этого в Диспетчере задач нужно выбрать нужный процесс, вызвать контекстное меню правой кнопкой мыши и выбрать пункт Задать соответствие( Set Affinity).
В разных версиях Windows для задания соответствия используют разные вкладки Диспетчере задач:
— Windows 7 — вкладка Процессы;
— Windows 10 — вкладка Details.
В наших экспериментах можно вставить в начале программы ожидание ввода символа с клавиатуры:
getchar ()или __getch ().
После запуска программы она будет ожидать ввода. В этот момент мы изменяем привязку к ядрам. Затем нажимаем Enterна клавиатуре. Далее наша программа будет выполняться на указанных ядрах.
Задание. Запустите Диспетчер задачи обратите внимание на загрузку ядер. Задайте привязку своего процесса к одному ядру или нескольким ядрам. Обратите внимание на изменение загрузки ядер.
5.3. Параллельные потоки и ситуация гонки
Далее мы создадим программу параллельного суммирования. Для знакомства с проблемами распараллеливания будем находить сумму выбранного количества единиц. Затем задача будет постепенно усложняться.
Читать дальшеИнтервал:
Закладка: