12+
Организация параллельных потоков. Часть 1

Бесплатный фрагмент - Организация параллельных потоков. Часть 1

Лабораторный практикум

Введите сумму не менее null ₽, если хотите поддержать автора, или скачайте книгу бесплатно.Подробнее

Объем: 46 бумажных стр.

Формат: epub, fb2, pdfRead, mobi

Подробнее

Введение

Большинство современных процессоров в настольных компьютерах и мобильных устройствах — многоядерные. Чтобы эффективно использовать такие вычислительные ресурсы, необходимо составлять параллельные программы. Для этого можно задействовать параллельные потоки либо параллельные процессы.

В данной работе рассматривается технология параллельного программирования потоков Microsoft Windows встроенными средствами, без специальных библиотек. Для составления и компиляции программ на Си используется бесплатная интегрированная среда разработки Microsoft Visual Studio Community Edition.

Общие теоретические сведения об организации параллельных вычислений можно найти в соответствующей литературе [1–6]. В данной работе мы рассматриваем только основы организации параллельных потоков.

1. Общие сведения о работе

Целью работы является изучение технологии программирования параллельных потоков Microsoft Windows.

Основные этапы выполнения работы:

— Процессы и потоки

— Процессоры и ядра

— Компилятор

— Параллельные потоки

— Состояние процесса

— Время выполнения

— Ускорение и эффективность

— Привязка задач к ядрам

— «Гонка» за доступ к данным

— Критическая секция

По результатам выполнения работы оформляется отчёт.

1.1. Составление и оформление отчёта

Отчёт оформляется в виде рабочей книги Microsoft Excel.

Состав отчёта:

— Титульный лист

— Оглавление

— Остальные листы

Для удобства навигации вкладки листов нумеруем.

В оглавлении делаем ссылку на каждый лист.

Подробнее оформление отчёта в пакете Excel описано в работе [7].

Задание. Создайте файл отчёта и оформите титульный лист и оглавление.

1.2. Ключевые определения

Перед началом выполнения работы необходимо определиться с основными терминами.

Задание. Выясните, что означают перечисленные термины:

— прикладная программа (application);

— алгоритм программы

— исходный текст программы;

— компилятор;

— вычислительный процесс (process);

— поток исполнения / выполнения (thread);

— многопоточность;

— центральный процессор (CPU);

— ядро микропроцессора (Core);

— HyperThreading;

— виртуальный процессор.


Заметим, что независимо от физической конфигурации компьютера, операционная система представляет все вычислительные устройства как виртуальные процессоры.

Задание. Запустите Task Manager (Диспетчер задач) и определите следующие параметры:

— число виртуальных процессоров;

— размер доступной оперативной памяти;

— число выполняемых процессов;

— число потоков — общее и в каждом процессе;

— уровень загрузки процессора в целом и каждого виртуального процессора.

2. Организация вычислительных экспериментов

2.1. Конфигурация компьютера

Возможности улучшения вычислительной производительности компьютера ограничены его конфигурацией. Поэтому нам предстоит познакомиться со своим компьютером.

Задание. Ознакомьтесь с конфигурацией компьютера и параметрами системы с помощью следующих средств:

— свойства компьютера;

— диспетчер устройств;

— параметр окружения NUMBER OF PROCESSORS;

— сайт производителя процессора;

— диспетчер задач.

Опишите в отчёте конфигурацию и состояние системы:

— процессор;

— разрядность процессора;

— число ядер;

— поддержка HyperThreading;

— версия операционной системы;

— разрядность операционной системы;

— число выполняемых потоков на ядро;

— число виртуальных процессоров;

— объём занятой оперативной памяти;

— объём виртуальной памяти

— наличие подкачки.

2.2. Среда разработки

Данная работа выполняется с использованием среды разработки Microsoft Visual Studio. Далее рассматриваются примеры программ на языке программирования С, хотя компилятор поддерживает также и С++.

В работе используется бесплатная версия среды разработки:

Community Edition.

Дистрибутив находится на сайте

VisualStudio.com.

Рекомендуется использовать английскую версию среды программирования.

Обратите внимание на название каталога, в который установлен компилятор.

В случае 32-разрядной ОС можно установить только 32-разрядные приложения. Каталог для установки:

Program Files.

В случае 64-разрядной ОС можно установить как 32-разрядные, так и 64-разрядные приложения. Каталоги для установки — соответственно:

Program Files (x86)

Program Files.

Далее мы будем создавать именно 32-разрядные приложения, причём работающие в командной строке.

Задание. Проверьте наличие компилятора на компьютере. Если компилятор установлен, запустите его. Если компилятор отсутствует, установите его.

Опишите в отчёте параметры компилятора:

— версия;

— язык интерфейса;

— разрядность.

3. Приёмы программирования

3.1. Программа Hello, World!

Hello, World — это первая программа для знакомства со средой разработки и процедурой компиляции.

Запустите Visual Studio. Создайте новый проект.

File — New — Project.

Выберите создание консольного приложения:

Create a new project — Empty project — Next.

Укажите название проекта:

Project name.

Каталог для хранения проекта:

Location.

Ставим галочку в строке:

Place solution and project in the same directory.

Нажмите кнопку

Create.

Добавьте файл с исходным текстом к проекту:

Solution Explorer — Source Files — [Контекстное меню] — Add — New Item.

В окне

Add New Item

установите

Visual C++ — Code — C++ File (.cpp).

Укажите название файла и его расположение. Нажмите кнопку Add.

Введите текст программы (рис. 3.1).

Рис. 3.1. Программа Hello, World

Сохраните файл, нажав комбинацию клавиш:

Ctrl + S.

Установите конфигурацию проекта

Release;

х86.

Чтобы скомпилировать исполняемый файл, вызываем в верхнем меню

Build — Solution.

Для запуска программы на выполнение используем комбинацию клавиш:

[Ctrl + F5].

Сохранение файла вызывается с помощью следующей комбинации клавиш:

[Ctrl + S].

Рекомендуем создавать проекты в подкаталогах одного рабочего каталога. Названия проектов, файлов и каталогов должны быть короткими и информативными. Чем короче путь к файлу, тем легче будет до него добраться в командной строке.

Задание. Ознакомьтесь с историей программы «Hello, World» на сайте Википедии. Выясните, как правильно переводится эта фраза на русский язык.

Задание. Прочитайте в Википедии статью Консоль. Выясните, что означает слово «консоль».

Задание. Создайте проект и запустите программу на выполнение:

— Создайте новый проект.

— Добавьте файл типа *.С.

— Введите исходный текст программы.

— Скомпилируйте проект и запустите программу.

— Скомпилируйте проект.

— Запустите программу из среды разработки.

— Запустите программу из Проводника Windows.

Для работы в командной строке нужно запустить командное окно:

[Win + R] — cmd — OK.

Чтобы перейти на нужный диск, введите букву и двоеточие. Например, для перехода на диск D:, нужно ввести

d:

Переход между каталогами — команда cd.

Чтобы подняться один на уровень выше по файловому дереву, используем команду

cd..

Просмотр содержимого каталога:

dir.

Для запуска программы на выполнение введите название программы

Задание. Запустите командную строку, перейдите в каталог своей программы и запустите её на выполнение.

3.2. Диапазоны значений переменных

В нашей работе мы будем иметь дело с большими целыми числами — счётчиками и суммами. Поэтому при объявлении типа переменной нужно учитывать максимальное значение, которое можно будет записать в эту переменную.

Диапазон значений переменной зависит от количества байт. Стандартные целые типы используют 1, 2, 4 или 8 байт.

Кроме количества байтов, нужно учитывать наличие знака:

— числа со знаком (signed)

— числа без знака (unsigned).

Зная эти параметры, можно приблизительно оценить диапазон возможных значений. Для грубых оценок можно считать, что 2^10 приблизительно равно 10^3.

Задание. Составьте список целых типов и оцените диапазон их значений.

3.3. Параметры командной строки

Программу (исполняемый файл типа *.EXE) обычно запускают на выполнение несколькими способами:

— среда разработки;

— Проводник Windows;

— файловый менеджер типа FAR.

При запуске программы на выполнение из Проводника обычно ограничиваются указанием имени исполняемого файла.

Задание. Запустите свою программу тремя перечисленными способами.


Командная строка — это один из первых видов компьютерных интерфейсов. Он может также упоминаться под другими названиями:

— командное окно;

— интерпретатор командной строки;

— командный процессор;

— command prompt.

При запуске программы в командной строке у нас появляются дополнительные возможности. После имени исполняемого файла file. exe можно дополнительно указать любые параметры param1, param2, param3, напечатав их через пробел:

file param1 param2 param3.

Расширение имени файла EXE можно не указывать.


В данной работе мы будем использовать параметры (аргументы) командной строки. Эти параметры попадают «внутрь» программы и доступны для использования во время выполнения программы.

Чтобы получить доступ к параметрам запуска программы в командной строке, будем использовать аргументы основного модуля программы:

main (int argc, char *argv []);

argc (argument count) — количество параметров командной строки;

argv [] (argument values) — массив указателей на строки (параметры командной строки).

Скомпилируем программу. Пусть этот файл называется prog-arg. exe. Мы запускаем его на выполнение в командной строке следующим образом:

prog-arg 1 param 23 аргумент 16.

Нулевой параметр argv [0] содержит имя запущенной программы. Если параметров нет, то мы получим только имя запущенной программы.

Задание. Измените текст программы так, чтобы получить параметры командной строки через аргументы main и вывести их на экран. Запустите программу из среды разработки, затем из командного окна с параметрами.

Проверьте, как работает вывод на экран параметров в виде чисел и текста на английском и на русском языках.

3.4. Локализация вывода на экран

Для вывода на экран мы используем функцию

printf.

Экран (в текстовом режиме) — это стандартное устройство вывода.

Чтобы в консоли выводить русский текст, добавим пару строк внаше программу.

Подключаем заголовочный файл локализации locale. h:

#include <locale. h>

Затем вызываем функцию setlocale:

setlocale (LC_ALL, «Rus»).

Пример программы представлен на рис. 3.2:

Рис. 3.2. Локализация стандартного вывода

Задание. Создайте и запустите программу, представленную на рис. 3.2.

Задание. Добавьте локализацию в программу вывода параметров командной строки. Убедитесь, что программа корректно обрабатывает параметры на русском языке.

3.5. Числа в командной строке

Через командную строку можно ввести число и использовать его в работе программы.

Для этого мы добавим добавляем заголовочный файл stdlib. h:

#include <stdlib. h>.

Затем вызываем функцию

int atoi (char *str).

Чтение из командной строки

В зависимости от типа переменной преобразование строки в целое число выполняется следующими функциями:

int atoi (const char *str);

long int atol (const char *str);

long long atoll (const char *str).

Этой приём нам понадобится для быстрого изменения параметров работы программы. Мы указываем параметр командной строки и преобразуем его в число. Полученное число записываем в переменную, которую используем для управления работой программы.

Задание. Добавьте в программу вызов функции преобразования строки в число. Выведите полученное число на экран.

4. Последовательные вычисления

4.1. Программа суммирования

В наших экспериментах мы будем находить сумму выбранного количества единиц (рис. 4.1).

Рис. 4.1. Последовательное суммирование

При назначении типов переменных учитываем диапазон возможных значений.

Задание. Составьте программу для нахождения суммы единиц. Запустите программу и убедитесь в правильности вычислений.

Задание. Составьте программу суммирования с вводом количества единиц через параметры командной строки. Программа должна вначале вывести заданное значение, затем найти сумму и вывести значение полученной суммы.

Задание. Введите количество единиц, выходящее за пределы диапазона значений. Обратите внимание на поведение программы.

4.2. Время работы программы

Чтобы сравнивать скорость работы программ между собой, нам нужно будет определить время выполнения программы. В результате мы сможем вычислить показатели эффективности распараллеливания.

Для измерения времени нам понадобится следующая функция:

clock_t clock (void).

Эта функция не имеет входных параметров. Она просто сообщает нам, сколько тактов прошло с начала работы программы. Тип возвращаемого значения определён как

clock_t.

Мы должны задать вспомогательные переменные именно такого типа.

Чтобы пересчитать количество тактов в секунды, нужно разделить количество тактов на значение следующей константы:

CLOCKS_PER_SEC.

Бесплатный фрагмент закончился.

Купите книгу, чтобы продолжить чтение.

Введите сумму не менее null ₽, если хотите поддержать автора, или скачайте книгу бесплатно.Подробнее