Presentation is loading. Please wait.

Presentation is loading. Please wait.

Директивы OpenMP Юрий Долгов, Дмитрий Шкурко. Optimization of applications for Intel* platforms Синтаксис OpenMP Общий синтаксис OpenMP директив Directive.

Similar presentations


Presentation on theme: "Директивы OpenMP Юрий Долгов, Дмитрий Шкурко. Optimization of applications for Intel* platforms Синтаксис OpenMP Общий синтаксис OpenMP директив Directive."— Presentation transcript:

1 Директивы OpenMP Юрий Долгов, Дмитрий Шкурко

2 Optimization of applications for Intel* platforms Синтаксис OpenMP Общий синтаксис OpenMP директив Directive определяет тип операции OpenMP Распараллеливание Синхронизация И т.п. Clauses (опционально) меняет/дополняет семантику Directive #pragma omp directive [clause…] CR

3 Optimization of applications for Intel* platforms Синтаксис OpenMP PARALLEL синтаксис Пример: Вывод: (T=4) #pragma omp parallel { printf(“Hello!\n”); } // implicit barrier Hello! #pragma omp parallel [clause…] CR structured_block

4 Optimization of applications for Intel* platforms Синтаксис OpenMP DO/for синтаксис (DO-Fortran, for-C) Пример: #pragma omp parallel { #pragma omp for private(i) shared(x) \ schedule(static,x/N) for(i=0;i<x;i++) printf(“Hello!\n”); } // implicit barrier Замечание: должно быть внутри параллельного региона #pragma omp for [clause…] CR for_loop

5 Optimization of applications for Intel* platforms Синтаксис OpenMP Sections синтаксис #pragma omp sections { #pragma omp section doFirstPartOfWork() #pragma omp section doSecondPartOfWork() } Замечание: должно быть внутри параллельного региона #pragma omp sections [clause…] CR { #pragma omp section CR structured_block … }

6 Optimization of applications for Intel* platforms Синтаксис OpenMP PARALLEL FOR (одна директива вместо двух) Пример: #pragma omp parallel for shared(x)\ private(i) \ schedule(dynamic) for(i=0;i<x;i++) { printf(“Hello!\n”); } #pragma omp parallel for [clause…] CR for_loop

7 Optimization of applications for Intel* platforms Синтаксис OpenMP ATOMIC синтаксис Пример: #pragma omp parallel shared(x) { #pragma omp atomic x++; } // implicit barrier #pragma omp atomic CR simple_statement

8 Optimization of applications for Intel* platforms Синтаксис OpenMP CRITICAL ситаксис Пример: #pragma omp parallel shared(x) { #pragma omp critical { // only one thread in here } } // implicit barrier #pragma omp critical CR structured_block

9 Optimization of applications for Intel* platforms Синтаксис OpenMP BARRIER синтаксис Неявные barrier в конце блоков DO, SECTIONS NOWAIT отменяет это поведение Локи Работа с локами вдется с помощью функций (прототипы в файле omp.h) omp_init_lock() omp_destroy_lock() omp_test_lock() omp_set_lock() omp_unset_lock() #pragma omp barrier CR

10 Optimization of applications for Intel* platforms Синтаксис OpenMP FLUSH синтаксис Гарантирует корректность состояния памяти с точки зрения потоков Зачем? Recall OpenMP directives… Код генерируется с помощью директив во время компиляции –Переменные не всегда объявлены как volatile –Расположение переменных на регистрах может показаться нарушением корректности Синхронизации имеют неявный flush в конце блока –ATOMIC, CRITICAL, ORDERED, BARRIER MASTER/END MASTER –Нет неявного flush’а #pragma omp flush CR

11 Optimization of applications for Intel* platforms Другие функции OpenMP Функции omp_set_num_threads() omp_get_num_threads() omp_get_max_threads() omp_get_num_procs() omp_get_thread_num() omp_set_dynamic() omp_[init destroy test set unset]_lock()

12 Optimization of applications for Intel* platforms Синхронизация OpenMP Критические секции –Именованные и не именованные –Нет явных локов Barrier директивы Ordered директивы –Если неизвестны зависимости внутри цикла Атомарные операции Явные локи –Могут быть вложенными –Могут потребоваться явные директивы flush Регионы исполняемые одним потоком –master, single директивы #pragma omp critical {/* Critical code here */} #pragma omp barrier omp_set_lock( lock l ); /* Code goes here */ omp_unset_lock( lock l ); #pragma omp single {/* Only executed once */}

13 Optimization of applications for Intel* platforms Предложение schedule директивы for/do schedule предложение определяет, каким образом итерации распределяются между потоками static([chunk]) распределяет итерации статически –Каждый поток получает несколько промежутков в [chunk] итераций Промежутки присваиваются потокам в соответствии с их номерами –По умолчанию [chunk] равен ceil( # iterations / # threads ) dynamic([chunk]) распределяет итерации динамически –Каждый поток получает по [chunk] итераций Новые промежутки присваиваются потокам по мере их готовности –По умолчанию [chunk] равен 1 guided([chunk]) распределение динамическое, но размер убывает экспоненциально –Точный коэффициент убывания зависит от реализации runtime позволяет определить механизм распределения итераций во время запуска (например, с помощью переменных окружения)

14 Optimization of applications for Intel* platforms Статическое распределение итераций // Static Scheduling int chunk = 16/T; int base = tid * chunk; int bound = (tid+1)*chunk; for( i=base; i<bound; i++ ) { doIteration(i); } Barrier(); #pragma omp parallel for \ schedule(static) for( i=0; i<16; i++ ) { doIteration(i); }

15 Optimization of applications for Intel* platforms Динамическое распределение итераций #pragma omp parallel for \ schedule(dynamic) for( i=0; i<16; i++ ) { doIteration(i); } // Dynamic Scheduling int current_i; while( workLeftToDo() ) { current_i = getNextIter(); doIteration(i); } Barrier();

16 Optimization of applications for Intel* platforms Общие данные Данные по типу обращения к ним потоками Общие данные Приватные данные (как правило, располагаются на стеке) OpenMP: shared общие переменные private приватные переменные firstprivate приватные переменные, инициализируются для каждого потока значением общей переменной lastprivate приватные переменные, их значение используется для обновления общей переменной int bigdata[1024]; void* foo(void* bar) { int tid; #pragma omp parallel \ shared ( bigdata ) \ private ( tid ) { /* Calc. here */ }

17 Optimization of applications for Intel* platforms Использование критических секций и атомарных операций ATOMIC используется для простых операций Обычно имеет маленькие накладные расходы Реализуется специальными микропроцессорными командами CRITICAL используется в остальных случаях Может быть реализована с помощью локов

18 Optimization of applications for Intel* platforms Нарушение корректности? #pragma omp parallel for \ shared(x) private(i) for( i=0; i<100; i++ ) { #pragma omp atomic x++; } printf(“%i”,x); #pragma omp parallel for \ shared(x) private(i) for( i=0; i<100; i++ ) { omp_set_lock(my_lock); x++; #pragma omp flush omp_unset_lock(my_lock); } printf(“%i”,x); 100 96 100

19 Optimization of applications for Intel* platforms Q&A

20 Optimization of applications for Intel* platforms Thank you.


Download ppt "Директивы OpenMP Юрий Долгов, Дмитрий Шкурко. Optimization of applications for Intel* platforms Синтаксис OpenMP Общий синтаксис OpenMP директив Directive."

Similar presentations


Ads by Google