Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лекция по ПП 3.pdf
Скачиваний:
12
Добавлен:
02.06.2015
Размер:
4.72 Mб
Скачать

Директивы

Parallel

#pragmaompparallel

{

cout<<"OpenMPTest"<< endl;

}

33

Базовыеконструкции

ДирективаCоздает параллельныйparallel регион для следующего за ней структурированного блока, например:

#pragmaompparallel[другиедирективы]

структурированныйблок

34

ОсновыOpen MP

Основной структуройв программе, которуюможно распараллелить это циклы.

В OpenMP существуютпять ограничений на то, какие циклы можно распараллелить:

переменная цикла должна иметь тип signed integer. Беззнаковые целые числа, такиекак DWORD, работать не будут.

35

ОсновыOpen MP

В OpenMP существуютпять ограничений на то, какие циклы можно распараллелить:

Операция сравнения должна иметь следующийформат:

переменная_цикла <, <=, >, >= инвариант_цикла_целого_типа

36

ОсновыOpen MP

В OpenMP существуютпять ограничений на то, какие циклы можно распараллелить:

Третье выражение (или инкрементная часть цикла for) должно являться либо целочисленнымсложением, либо целочисленным вычитанием и должно практически совпадать со значением инварианта цикла.

37

ОсновыOpen MP

В OpenMP существуютпять ограничений на то, какие циклы можно распараллелить:

Если используется операция сравнения < или <=, переменная цикла должна увеличиватьсяпри каждой итерации, а при использовании операции > или >= переменная цикла должна уменьшаться.

38

ОсновыOpen MP

В OpenMP существуютпять ограничений на то, какие циклы можно распараллелить:

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

39

ОсновыOpen MP

В OpenMP существуютпять ограничений на то, какие циклы можно распараллелить:

если используются операторы goto или break, они должны приводить к переходам внутрицикла, а не вне его. То же самое относится к обработке исключений; исключения должны перехватываться внутри цикла.

40

Обзор технологии OpenMP

Принципы организации параллелизма

#pragma omp parallel for for (i=0; i < numPixels; i++)

{

pGrayScaleBitmap[i] = (unsigned BYTE) (pRGBBitmap[i].red * 0.299 + pRGBBitmap[i].green * 0.587 + pRGBBitmap[i].blue * 0.114);

}

/* Преобразование 32-разрядного пикселя в цветовой модели RGB в 8-разрядный пиксель в модели Grayscale

*/

Обзор технологии OpenMP

Принципы организации параллелизма

#pragma omp parallel for for (i=2; i < 10; i++)

{

factorial[i] = i * factorial[i-1];

}

Управлениеобщимии

индивидуальнымиданными

Практически в каждом цикле (по крайней мере, если это полезный цикл) выполняется чтение данных из памяти и запись в память.

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

43

Управлениеобщимии

индивидуальнымиЕсли память определенад ннымикак общая,

все потоки получаютдоступ к одному и тому же адресу памяти.

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

44

Управлениеобщимии

индивидуальнымиданными

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

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

45

Управлениеобщимии

индивидуальнымиданными

Память можно объявить как индивидуальную следующими двумя способами.

Объявитьпеременную внутри цикла (внутри директивы OpenMP) без ключевого слова static.

Указать индивидуальное выражение в директиве OpenMP.

46