Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Судаков / Лекции / lec20_multy_thread.ppt
Скачиваний:
22
Добавлен:
20.03.2015
Размер:
243.71 Кб
Скачать

Пример выполнения

[saa@cluster omp]$ icc -openmp section.cpp [saa@cluster omp]$ OMP_NUM_THREADS=4 ./a.out 05 1 2 3 4

6

7

8

9

Типы планирования

Применяется совместно с for

Shedule(тип, порция)

Порция – количество итераций

Типы

Static – работа статически разбивается на порции одинакового размера

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

GUIDED размер порции уменьшается экспоненциально по мере выполнения. Размер соответсвует минимальному размеру порции

RUNTIME Решение принимается при запуске программы с помощью установки системной переменной OMP_SCHEDULE

Синхронизация

Указывается для блока команд

Critical – указание критического раздела

Master – выполняется только master потоком

Barrier – указание барьера

ORDERED -выполнение итераций цикла в той же последовательности, что и в последовательной программе

Пример critical

#include <iostream> #include <cmath> using namespace std;

int main (void){ #pragma omp parallel for

for (int i =0; i<10; i++){ #pragma omp critical

cout << i<<endl<<flush;

}

return 0;

}

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

Без critical

[saa@cluster omp]$ OMP_NUM_THREADS=10 ./a.out

0756893241

С указанием critical

[saa@cluster omp]$ icc -openmp ./single.cpp

./single.cpp(7) : (col. 1) remark: OpenMP DEFINED LOOP WAS PARALLELIZED. [saa@cluster omp]$ OMP_NUM_THREADS=10 ./a.out

0

5

2

7

9

3

6

1

4

8

Видимость данный

Используется совместно с for, section или после определения данных

SHARED (данные) – данные совместного использования – все сложности работы ложатся на программиста

PRIVATE (данные) – данные являются частными данными потока, после выполнения потока не сохраняются

THREADPRIVATE (данные) – глобальные данные являются частными данными потока, но должны быть консистентны для всех потоков и сохранятся после выполнения

Пример частных и общих данных

#include <stdio.h>

int alpha[10], beta[10], i; #pragma omp threadprivate(alpha)

main () {

/* First parallel region */

#pragma omp parallel private(i,beta) for (i=0; i < 10; i++)

alpha[i] = beta[i] = i;

/* Second parallel region */ #pragma omp parallel

printf("alpha[3]= %d and beta[3]= %d\n",alpha[3],beta[3]);

}

Пример выполнения

[saa@cluster omp]$ icc -openmp ./threadprivate.c

./threadprivate.c(9) : (col. 1) remark: OpenMP DEFINED REGION WAS PARALLELIZED.

./threadprivate.c(14) : (col. 1) remark: OpenMP DEFINED REGION WAS PARALLELIZED. [saa@cluster omp]$ OMP_NUM_THREADS=2 ./a.out

alpha[3]= 3 and beta[3]= 0 alpha[3]= 3 and beta[3]= 0

Beta[] – данные потерялись

Alpha[] – данные не потерялись

Операции редукции

Reduce(оператор:данные)

Используется для указания параллельных блоков в котором выполняется операция редукции

Опепраторы могут быть +,-,*,+=,-=,*=

Пример редукции

#include <iostream>

#include <cmath> using namespace std;

int k=0,l=0; int main (void){

#pragma omp parallel for shared(l) reduction(+:k) for (int i =0; i<100000; i++){

k++;

l++;

}

cout << "k="<<k<<endl<<flush; cout << "l="<<l<<endl<<flush;

return 0;

}

Соседние файлы в папке Лекции