Параллельная обработка в OpenMP

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

Введение в OpenMP

Определение OpenMP. Поддержка OpenMP и VisualStudio. Диррективы OpenMP: parallel, for, parallel for, sections, single. Комбинирование work-sharing constructs.

Определение OpenMP

OpenMP – API, ориентированный на разработку многопоточных приложений для параллельных ВС с общей памятью (SMP-компьютеры).

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

Активизация OpenMP в Visual C++

Последняя версия OpenMP — 2.0 полностью поддерживается начиная с Visual C++ 2005.

Для активизации реализованных в компиляторе средств OpenMP служит появившийся в Visual C++ 2005 параметр компилятора /openmp. (Свойства проекта - Configuration Properties, C/C++, Language и изменив значение свойства OpenMP Support.)

Создание С Win32-проекта в Visual Studio 2005 показано в приложении А.

Создание С++ CLR проекта в Visual Studio 2005 показано в приложении Б.

Отладка в Visual C++

Отлаживать приложения OpenMP в среде Visual Studio 2005 иногда трудно. В частности, определенные неудобства связаны со входом в параллельный регион и/или с выходом из него нажатием клавиши F10/F11. Это объясняется тем, что компилятор генерирует дополнительный код для вызова исполняющей среды и групп потоков. Поэтому, рекомендуется установить точку прерывания в параллельном регионе и нажать F5, чтобы достичь ее. Для выхода из параллельного региона, точка прерывания устанавливается вне региона.

Параллельная обработка в OpenMP

С точки зрения OpenMP параллельная программа – обычная программа, текст которой разбит на последовательные и параллельные области.

В начальный момент времени порождается нить-мастер или "основная" нить (thread, легковесный процесс), которая начинает выполнение программы со стартовой точки. В приложении могут содержаться параллельные области-регионы, входя в которые, основной поток-нить создает группы потоков (включающие основной поток). В конце параллельного региона группы потоков останавливаются, а выполнение основного потока продолжается. В параллельный регион могут быть вложены другие параллельные регионы, в которых каждый поток первоначального региона становится основным для своей группы потоков. Вложенные регионы могут в свою очередь включать регионы более глубокого уровня вложенности (рис. 1.).

В параллельной области все переменные программы разделяются на два класса: общие (shared) и локальные (private). Общая переменная всегда существует лишь в одном экземпляре для всей программы и доступна всем нитям под одним и тем же именем. Объявление же локальной переменной вызывает порождение своего экземпляра данной переменной для каждой нити. Изменение нитью значения своей локальной переменной, естественно, никак не влияет на изменение значения этой же локальной переменной в других нитях.

По сути, понятия областей и классов переменных, и определяют идею написания параллельной программы в рамках OpenMP: некоторые фрагменты текста программы объявляется параллельными областями; именно эти области и только они исполняются набором нитей, которые могут работать как с общими, так и с локальными переменными.

Общая структура программы приведена ниже.

C / C++ - Общая структура программы

#include <omp.h>

main () {

int var1, var2, var3;

Последовательный код(Serial code)

.

.

.

Начало параллельной секции. Порождение набора нитей.

Определение видимости переменных.

(Beginning of parallel section. Fork a team of threads.

Specify variable scoping)

#pragma omp parallel private(var1, var2) shared(var3)

{

Параллельная секция выполняется всеми нитями.

(Parallel section executed by all threads)

.

.

.

Все нити дочерние нити останавливаются. Основная продолжает выполнение.

(All threads join master thread and disband)

}

Продолжение последовательного кода

(Resume serial code)

.

.

.

}


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: