Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

LabPract_SPP

.pdf
Скачиваний:
20
Добавлен:
18.03.2015
Размер:
648.64 Кб
Скачать

ветствующими примерами, приведены в третьей главе учебного пособия [1].

Использование OpenMP позволяет, с одной стороны, создавать эффективные многопоточные приложения, использующие основные возможности современных многоядерных процессорных архитектур, а с другой стороны, избавляет программиста от необходимости вникать в низкоуровневые особенности многопоточного программирования, такие как порождение потоков, разделение данных между ними, синхронизацию потоков и т.д. Интерфейс OpenMP позволяет превращать существующие последовательные программы в многопоточные путем простого добавления соответствующих директив, а не переписывать программы заново.

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

Для использования возможностей интерфейса OpenMP в программе обязательно необходимо включить заголовочный файл omp.h:

#include <omp.h>

Для компиляции программы, написанной с использованием OpenMP, Intel-компилятором необходимо выполнить команду

icl /Qopenmp /c prog.cpp

Если также необходима компоновка, ключ /c нужно опустить. Данная опция позволяет использовать все уровни оптимизации, т.е. могут быть добавлены соответствующие ключи /O1, /O2 или /O3. При отладке многопоточного приложения рекомендуется отключать оптимизацию – ключ /Od.

Для получения диагностической информации о процессе компиляции приложения с OpenMP необходимо в команду компиляции добавить ключ

/Qopenmp-report[n]

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

13

0 – информация не выводится;

1 – выводится информация об успешно распараллеленных циклах, регионах и подзадачах (значение по умолчанию);

2 – к информации предыдущего уровня добавляется информация об успешной обработке директив и спецификаторов MASTER, SINGLE, CRITICAL, ORDERED, ATOMIC и т.д.

Если из программы, написанной с использованием OpenMP, необходимо сгенерировать последовательный код (т.е. проигнорировать все конструкции интерфейса), необходимо в команде компиляции задать ключ

/Qopenmp-stubs

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

5. Выполнение работы

Варианты индивидуальных заданий к лабораторной работе приведены в приложении А. Далее приводится пошаговое описание методики выполнения задания.

1.Разработать последовательный алгоритм решения задачи в соответствии с выданным вариантом индивидуального задания.

2.Разработать простой тестовый пример, соответствующий решаемой задаче и основанный (если возможно) на аналитическом решении ее частного случая.

3.Выполнить программную реализацию последовательного алгоритма на языке С++, провести отладку программы. В программе должен быть предусмотрен автоматический замер времени ее работы.

4.Провести тестирование последовательной программы с помощью разработанного тестового примера.

5.Выполнить автоматическое распараллеливание программы с использованием компилятора Intel C++ Compiler v. 10.1 (см. п. 4.1).

6.С использованием ключа /Qpar-report[n] вывести на эк-

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

7. Убедиться в корректности распараллеливания с использованием тестового примера.

14

8. Для исходных данных задачи, указанных преподавателем, провести серию численных расчетов на системах различных архитектур с использованием различного количества доступных ядер. Результаты времени работы программы занести в таблицу 1.1.

Таблица 1.1

Тип

Вычислительная

 

 

Количество ядер

 

распаралле-

Параметр

 

 

 

 

 

 

 

система

1

 

2

4

6

 

8

ливания

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Время, с

 

 

 

 

 

 

 

 

R540

Ускорение

 

 

 

 

 

 

 

Авто

 

Эффективность

 

 

 

 

 

 

 

 

Время, с

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

W360

Ускорение

 

 

 

 

 

 

 

 

 

Эффективность

 

 

 

 

 

 

 

 

 

Время, с

 

 

 

 

 

 

 

 

R540

Ускорение

 

 

 

 

 

 

 

OpenMP

 

Эффективность

 

 

 

 

 

 

 

 

Время, с

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

W360

Ускорение

 

 

 

 

 

 

 

 

 

Эффективность

 

 

 

 

 

 

 

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

S

 

 

Tp

,

E

 

 

S p

.

p

 

p

 

 

 

T1

 

 

p

 

 

 

 

 

 

Здесь T1 – время работы последовательной программы, Tp – время

работы программы на p ядрах.

Рассчитанные значения параметров занести в таблицу 1.1 и провести их анализ. Сделать соответствующие выводы.

10.С использованием директив и функций интерфейса OpenMP выполнить модификацию последовательной программы до многопоточной. Провести отладку программы.

11.Скомпилировать программу с использованием ключа /Qopenmp-report[n] и изучить выведенную диагностическую

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

15

12. С использованием тестового примера убедиться в правильности работы созданной многопоточной программы.

13.Для тех же исходных данных, для которых проводилось исследование автоматического распараллеливания, провести серию численных расчетов на системах различных архитектур с использованием различного количества доступных ядер. Результаты времени работы программы занести в таблицу 1.1.

14.Вычислить ускорение и эффективность параллельной программы, результаты занести в таблицу 1.1. Выполнить анализ полученных результатов.

15.Оформить отчет по лабораторной работе в соответствии с требованиями, приведенными в приложении Б.

16.Подготовиться к защите лабораторной работы, ответив на приводимые ниже контрольные вопросы.

6.Контрольные вопросы

1.Какие элементы последовательной программы допускают автоматическое распараллеливание и почему?

2.Как выполнить автоматическое распараллеливание программы с использованием компилятора Intel C++ Compiler v. 10.1? Какая информация может быть получена о процессе автоматического распараллеливания?

3.Какие директивы OpenMP используются для распараллеливания программного кода?

4.В чем отличие локальных переменных потока, определенных в директивах OpenMP спецификаторами private, firstprivate, lastprivate?

5.Какими средствами OpenMP может быть реализован параллелизм задач?

6.Каким образом в OpenMP можно управлять правилом разделения итераций цикла между потоками?

7.Какие средства синхронизации потоков существуют в OpenMP? Каковы особенности их использования?

8.Как выполнить компиляцию программы, написанной с использованием OpenMP, компилятором Intel C++ Compiler v. 10.1? Какая информация может быть получена о процессе распараллеливания?

16

Лабораторная работа № 2

СОЗДАНИЕ МНОГОПОТОЧНЫХ ПРИЛОЖЕНИЙ СРЕДСТВАМИ WINDOWS THREADING API

1. Цель работы

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

2. Теоретическая часть

Необходимые для выполнения данной работы теоретические сведения из математической физики и численных методов приведены в теоретической части предыдущей лабораторной работы.

3.Краткое описание используемых программных продуктов и вычислительной техники

Выполнение заданий лабораторной работы предполагает доступ к вычислительным системам с общей памятью. Описание таких систем приведено в п. 3 предыдущей лабораторной работы.

Разработка многопроточных программ данной лабораторной работы предполагает использование возможностей операционных систем семейства Windows. Программы разрабатываются на языке С++. Для написания и отладки программ с использованием интерфейса Windows Threading API в лабораторной работе используется среда программирования Microsoft Visual Studio .NET 2005 с установленной библиотекой MSDN. Возможно использование компилятора Intel C++ Compiler v. 10.1, интегрированного в оболочку Visual Studio.

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

Разработка многопоточных программ с использованием Windows Threading API предполагает использование стандартных дина-

17

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

.NET 2005, необходимо в закладке Configuration Properties в разделе С/С++\Code Generation\Runtime Library выставить Multi-threaded debug DLL (/MDd). После этого компи-

ляция и компоновка приложения выполняется традиционным образом как стандартного проекта Visual Studio.

Для использования функций Windows Threading API необходимо включить в программу заголовочный файл windows.h:

#include <windows.h>

Порождение потоков и их синхронизация должны выполняться сред-

ствами Windows Threading API.

Подробное описание функций Windows Threading API, а также особенностей их использования содержится в первой главе учебного пособия [1].

5. Выполнение работы

Варианты индивидуальных заданий к лабораторной работе приведены в приложении А. Далее приводится пошаговое описание методики выполнения задания.

1.В соответствии с выданным вариантом индивидуального задания разработать многопоточный алгоритм решения задачи для систем с общей памятью.

2.Разработать простой тестовый пример, соответствующий решаемой задаче и основанный (если возможно) на аналитическом решении ее частного случая.

3.С использованием функций Windows Threading API выполнить программную реализацию алгоритма и провести отладку программы. В программе должен быть предусмотрен автоматический замер времени работы каждого потока.

4.Провести тестирование программы с помощью разработанного тестового примера.

5.Для исходных данных задачи, указанных преподавателем, провести серию численных расчетов на системах различных архитектур с использованием различного количества доступных ядер. Результаты замеров времени работы программы занести в таблицу 2.1.

18

 

 

 

 

 

 

 

 

Таблица 2.1

Вычислительная

Параметр

 

 

Количество ядер

 

 

 

система

1

2

 

4

 

6

 

8

 

 

 

 

 

Время, с

 

 

 

 

 

 

 

 

 

Ускорение

 

 

 

 

 

 

 

 

 

Эффективность

 

 

 

 

 

 

 

 

6.Вычислить ускорение и эффективность параллельной программы для различного числа ядер по формулам п. 5.9 лабораторной работы № 1. Рассчитанные значения занести в таблицу 2.1.

7.Провести анализ полученных результатов, сделать соответствующие выводы.

8.Оформить отчет по лабораторной работе в соответствии с требованиями, приведенными в приложении Б.

9.Подготовиться к защите лабораторной работы, ответив на приводимые ниже контрольные вопросы.

6. Контрольные вопросы

1.Каким образом создаются потоки в Windows Threading API?

2.Что такое дескриптор потока, для чего он используется?

3.Как измерить время работы участка кода в функции потока?

4.Какие существуют способы синхронизации потоков в Windows Threading API?

5.Что такое атомарный доступ?

6.Что такое критические секции и каков порядок их использования?

7.Для чего используются функции ожидания?

8.Что такое событие в Windows? Каким образом осуществляется синхронизация с помощью событий?

9.Что такое мьютекс, для каких целей и каким образом он используется?

19

Лабораторная работа № 3

СОЗДАНИЕ МНОГОПОТОЧНЫХ ПРИЛОЖЕНИЙ СРЕДСТВАМИ POSIX THREADS

1. Цель работы

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

POSIX Threads.

2. Теоретическая часть

Необходимые для выполнения данной работы теоретические сведения из математической физики и численных методов приведены в теоретической части лабораторной работы №1.

3.Краткое описание используемых программных продуктов и вычислительной техники

Выполнение заданий лабораторной работы предполагает доступ к вычислительным системам с общей памятью. Описание используемых в данной лабораторной работе систем приведено в п. 3 лабораторной работы №1.

Разработка многопоточных программ данной лабораторной работы предполагает использование возможностей операционных систем, соответствующих стандарту IEEE Std 1003.1, 2004 Edition (POSIX.1). Программы разрабатываются под операционной системой SUSE Linux версии 10.3 или выше на языке С или С++. Для написания текста программы может использоваться любой текстовый редактор. Для компиляции программ используются Intel C++ Compiler версии 10.1 или выше под Linux или компилятор языка С++ из GNU Compiler Collection (gcc), входящий в состав дистрибутива операционных систем семейства Linux. В первом случае компиляция может осуществляться из командной строки командой

icc –pthread prog.cpp

20

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

Для использования функций POSIX Threads необходимо включить в программу заголовочный файл pthread.h:

#include <pthread.h>

Порождение потоков и их синхронизация должны выполняться средствами POSIX Threads.

Подробное описание функций работы с потоками стандарта POSIX Threads, а также особенностей их использования содержится во второй главе учебного пособия [1].

5. Выполнение работы

Варианты индивидуальных заданий к лабораторной работе приведены в приложении А. Далее приводится пошаговое описание методики выполнения задания.

1. С использованием функций POSIX Threads выполнить программную реализацию многопоточного алгоритма, разработанного в предыдущей лабораторной работе, и провести отладку программы. В программе должен быть предусмотрен автоматический замер времени работы каждого потока.

2.С использованием разработанного в предыдущих лабораторных работах тестового примера провести проверку правильности работы программы.

3.Для исходных данных задачи, указанных преподавателем, провести серию численных расчетов на системах различных архитектур с использованием различного количества доступных ядер. Результаты замеров времени работы программы занести в таблицу 3.1.

4.Вычислить ускорение и эффективность параллельной программы для различного числа ядер по формулам п. 5.9 лабораторной работы № 1. Рассчитанные значения занести в таблицу 3.1.

 

 

 

 

 

 

 

 

Таблица 3.1

Вычислительная

Параметр

 

 

Количество ядер

 

 

 

система

1

2

 

4

 

6

 

8

 

 

 

 

 

Время, с

 

 

 

 

 

 

 

 

 

Ускорение

 

 

 

 

 

 

 

 

 

Эффективность

 

 

 

 

 

 

 

 

21

7.Провести анализ полученных результатов, сделать соответствующие выводы.

8.Оформить отчет по лабораторной работе в соответствии с требованиями, приведенными в приложении Б.

9.Подготовиться к защите лабораторной работы, ответив на приводимые ниже контрольные вопросы.

6. Контрольные вопросы

1.Каким образом создаются потоки в POSIX?

2.В каких возможных состояниях может находиться поток в системе Linux?

3.Как измерить время работы участка кода в функции потока?

4.Какие типы потоков определены в POSIX?

5.Какие существуют способы синхронизации потоков в POSIX?

6.Как осуществляется синхронизация потоков с помощью мьютексов?

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

8.Как работает барьер в POSIX Threads?

22

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]