Начало Директивы распределения итераций цикла Директивы явного распределения задач/распараллеливания Директивы выделения задачи для одного из потоков Название Директивы распределения задач в OpenMP Семинар по использованию вычислительного кластера 4 апреля 2010 г. Семинар по использованию вычислительного кластера 1 / 22 Начало Директивы распределения итераций цикла Директивы явного распределения задач/распараллеливания Директивы выделения задачи для одного из потоков Директива for/do Директива parallel for/parallel do Директива for/do Формат директивы (С/C ++) #pragma omp for [hпредложенияi] hциклы fori Формат директивы (Fortran) [hпредложенияi] hциклы doi [ !$omp end do [ nowait ] ] !$omp do Семинар по использованию вычислительного кластера 2 / 22 Начало Директивы распределения итераций цикла Директивы явного распределения задач/распараллеливания Директивы выделения задачи для одного из потоков Директива for/do Директива parallel for/parallel do Директива for/do (продолжение) Ограничения на заголовок цикла (С/C ++) (Единственный) счётчик — целого типа, указатель, или итератор произвольного доступа. Должен изменяться только в заголовке цикла. Условие цикла: сравнение переменной с инвариантным к циклу выражением при помощи <, <=, >, >=. Изменение счётчика: при помощи ++, --, i += d, i -= d, i = i + d, i = d + i, i = i - d (d — инвариантное к циклу целое выражение). Семинар по использованию вычислительного кластера 3 / 22 Начало Директивы распределения итераций цикла Директивы явного распределения задач/распараллеливания Директивы выделения задачи для одного из потоков Директива for/do Директива parallel for/parallel do Директива for/do (продолжение) Предложения директивы цикла collapse (hконстантное целое положительноеi) (тесная вложенность) nowait (С/C ++) schedule (hтип распределения итерацийi[ , hразмер группы итерацийi] ) Семинар по использованию вычислительного кластера 4 / 22 Начало Директивы распределения итераций цикла Директивы явного распределения задач/распараллеливания Директивы выделения задачи для одного из потоков Директива for/do Директива parallel for/parallel do Директива for/do (окончание) Типы распределения итераций цикла schedule (static [ , hразмер группы итерацийi] ) schedule (dynamic [ , schedule (guided [ , hразмер группы итерацийi] ) hразмер группы итерацийi] ) schedule (auto) schedule (runtime) Семинар по использованию вычислительного кластера 5 / 22 Начало Директивы распределения итераций цикла Директивы явного распределения задач/распараллеливания Директивы выделения задачи для одного из потоков Директива for/do Директива parallel for/parallel do Директива parallel for/parallel do Формат директивы (С/C ++) #pragma omp parallel for [hпредложенияi] hциклы fori Формат директивы (Fortran) !$omp parallel do [hпредложенияi] hциклы doi [ !$omp end parallel do ] Семинар по использованию вычислительного кластера 6 / 22 Начало Директивы распределения итераций цикла Директивы явного распределения задач/распараллеливания Директивы выделения задачи для одного из потоков Директива for/do Директива parallel for/parallel do Директива parallel for/parallel do (продолжение) Пример (C ++) bool sum(const Vector &rcA, const Vector &rcB, Vector &rS) { const Vector::size_type cuSize = rcA.size(); if (cuSize != rcB.size()) return false; // rS.resize(cuSize); #pragma omp parallel for for (Vector::size_type i = 0; i < cuSize; ++ i) rS[i] = rcA[i] + rcB[i]; // return true; } Семинар по использованию вычислительного кластера 7 / 22 Начало Директивы распределения итераций цикла Директивы явного распределения задач/распараллеливания Директивы выделения задачи для одного из потоков Директива for/do Директива parallel for/parallel do Директива parallel for/parallel do (окончание) Пример (Fortran) subroutine summ(N, A, B, S) integer N real A(*), B(*), S(*) integer I !$omp parallel do do I = 1, N S(I) = A(I) + B(I) enddo end subroutine summ Семинар по использованию вычислительного кластера 8 / 22 Начало Директивы распределения итераций цикла Директивы явного распределения задач/распараллеливания Директивы выделения задачи для одного из потоков Директива Директива Директива Директива workshare parallel workshare sections parallel sections Директива workshare Формат директивы (Fortran) !$omp workshare hструктурный блокi !$omp end workshare [ nowait ] Семинар по использованию вычислительного кластера 9 / 22 Начало Директивы распределения итераций цикла Директивы явного распределения задач/распараллеливания Директивы выделения задачи для одного из потоков Директива Директива Директива Директива workshare parallel workshare sections parallel sections Директива parallel workshare Формат директивы (Fortran) !$omp parallel workshare hструктурный блокi !$omp end parallel workshare Семинар по использованию вычислительного кластера 10 / 22 Начало Директивы распределения итераций цикла Директивы явного распределения задач/распараллеливания Директивы выделения задачи для одного из потоков Директива Директива Директива Директива workshare parallel workshare sections parallel sections Директива parallel workshare (окончание) Пример (Fortran) subroutine shift(A, B, C, D) real A(100), B(100), C(100), D(100) integer I !$omp parallel workshare B(51:100) = A(1:50) where (C .ne. 0) C = 1 forall (I = 1:50) D(I) = I !$omp end parallel workshare end subroutine shift Семинар по использованию вычислительного кластера 11 / 22 Начало Директивы распределения итераций цикла Директивы явного распределения задач/распараллеливания Директивы выделения задачи для одного из потоков Директива Директива Директива Директива workshare parallel workshare sections parallel sections Директива sections Формат директивы (С/C ++) #pragma omp sections { [hпредложенияi] [ #pragma omp section ] hструктурный блокi {#pragma omp section hструктурный блокi} } Семинар по использованию вычислительного кластера 12 / 22 Начало Директивы распределения итераций цикла Директивы явного распределения задач/распараллеливания Директивы выделения задачи для одного из потоков Директива Директива Директива Директива workshare parallel workshare sections parallel sections Директива sections (окончание) Формат директивы (Fortran) !$omp sections [hпредложенияi] [ !$omp section ] hструктурный блокi {!$omp section hструктурный блокi} !$omp end sections [ nowait ] Семинар по использованию вычислительного кластера 13 / 22 Начало Директивы распределения итераций цикла Директивы явного распределения задач/распараллеливания Директивы выделения задачи для одного из потоков Директива Директива Директива Директива workshare parallel workshare sections parallel sections Директива parallel sections Формат директивы (С/C ++) #pragma omp parallel sections { [hпредложенияi] [ #pragma omp section ] hструктурный блокi {#pragma omp section hструктурный блокi} } Семинар по использованию вычислительного кластера 14 / 22 Начало Директивы распределения итераций цикла Директивы явного распределения задач/распараллеливания Директивы выделения задачи для одного из потоков Директива Директива Директива Директива workshare parallel workshare sections parallel sections Директива parallel sections (продолжение) Формат директивы (Fortran) !$omp parallel sections [ !$omp section ] [hпредложенияi] hструктурный блокi {!$omp section hструктурный блокi} !$omp end parallel sections Семинар по использованию вычислительного кластера 15 / 22 Начало Директивы распределения итераций цикла Директивы явного распределения задач/распараллеливания Директивы выделения задачи для одного из потоков Директива Директива Директива Директива workshare parallel workshare sections parallel sections Директива parallel sections (продолжение) Пример (C ++) void solve2( const Matrix &rcA1, const Vector &rcB1, const Matrix &rcA2, const Vector &rcB2, Vector &rX1, Vector &rX2) { #pragma omp parallel sections { #pragma omp section solve_methodA(rcA1, rcB1, rX1) #pragma omp section solve_methodB(rcA2, rcB2, rX2) } } Семинар по использованию вычислительного кластера 16 / 22 Начало Директивы распределения итераций цикла Директивы явного распределения задач/распараллеливания Директивы выделения задачи для одного из потоков Директива Директива Директива Директива workshare parallel workshare sections parallel sections Директива parallel sections (окончание) Пример (Fortran) subroutine solve2(N, A1, B1, A2, B2, X1, X2) integer N real A1(N, N), A2(N, N), B1(N), B2(N), X1(N), X2(N) !$omp parallel sections !$omp section call solve_methodA(A1, B1, X1) !$omp section call solve_methodB(A2, B2, X2) !$omp end parallel sections end subroutine solve2 Семинар по использованию вычислительного кластера 17 / 22 Начало Директивы распределения итераций цикла Директивы явного распределения задач/распараллеливания Директивы выделения задачи для одного из потоков Директива master Директива single Директива master Формат директивы (С/C ++) #pragma omp master hструктурный блокi Формат директивы (Fortran) !$omp master hструктурный блокi !$omp end master Семинар по использованию вычислительного кластера 18 / 22 Начало Директивы распределения итераций цикла Директивы явного распределения задач/распараллеливания Директивы выделения задачи для одного из потоков Директива master Директива single Директива master (продолжение) Пример (C ++) #pragma omp parallel { #pragma omp for for (int i = 0; i < 100; ++ i) a[i] = i; // . . . Пример (C ++, окончание) #pragma omp master { for (int i = 0; i < 100; ++ i) cout << a[i] << " "; cout << endl; } #pragma omp for for (int i = 0; i < 100; ++ i) b[i] = a[i]; } // #pragma omp parallel Семинар по использованию вычислительного кластера 19 / 22 Начало Директивы распределения итераций цикла Директивы явного распределения задач/распараллеливания Директивы выделения задачи для одного из потоков Директива master Директива single Директива master (окончание) Пример (Fortran) program test2 integer I real A(100), B(100) !$omp parallel !$omp do do I = 1, 100 A(i) = i enddo !$omp master print *, A !$omp end master Семинар по использованию вычислительного кластера Пример (Fortran, окончание) !$omp do do I = 1, 100 B(i) = A(i) enddo !$omp end parallel end 20 / 22 Начало Директивы распределения итераций цикла Директивы явного распределения задач/распараллеливания Директивы выделения задачи для одного из потоков Директива master Директива single Директива single Формат директивы (С/C ++) [hпредложенияi] hструктурный блокi #pragma omp single Формат директивы (Fortran) [hпредложения в началеi] hструктурный блокi !$omp end single [hпредложения в концеi] !$omp single Семинар по использованию вычислительного кластера 21 / 22 Начало Директивы распределения итераций цикла Директивы явного распределения задач/распараллеливания Директивы выделения задачи для одного из потоков Директива master Директива single Директива single (продолжение) Пример (C ++) #pragma omp parallel { #pragma omp for for (int i = 0; i < 100; ++ i) a[i] = f(i); // . . . Семинар по использованию вычислительного кластера Пример (C ++, окончание) #pragma omp single nowait { x = a[0]; } #pragma omp for for (int i = 0; i < 100; ++ i) b[i] = a[i]; } // #pragma omp parallel 22 / 22