Директивы распределения задач в OpenMP

advertisement
Начало
Директивы распределения итераций цикла
Директивы явного распределения задач/распараллеливания
Директивы выделения задачи для одного из потоков
Название
Директивы распределения задач в 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
Download