Директива позволяет организовать в программе параллельное выполнение независимых блоков кода.
C/C++:
#pragma omp sections [ ключ [ ключ ] ... ] new-line
{
[#pragma omp section new-line ]
structured-block1
[#pragma omp section new-line
structured-block2 ]
.}
Fortran:
!$OMP SECTIONS[ ключ [ [ , ] ключ ] ... ]
[!$OMP SECTION ]
block1
[!$OMP SECTION
block2 ]
!$OMP END SECTIONS [ nowait ]
Ключи директивы составляют подмножество ключей директивы DO:
PRIVATE (list)
FIRSTPRIVATE (list)
LASTPRIVATE (list)
REDUCTION (operator | intrinsic : list)
Приведем пример программы на языках Си и Фортран с использованием секций.
Программа section.c
#include <stdio.h> #include <stdlib.h> #include <omp.h> void funcA(); void funcB(); void funcC(); int main(int argc,char* argv[]) { int n=3; omp_set_num_threads(n); #pragma omp parallel { #pragma omp sections { #pragma omp section (void) funcA(); #pragma omp section (void) funcB(); #pragma omp section (void) funcC(); } } return(0); } void funcA(){ printf("Функция funcA: выполняется нитью %d\n", omp_get_thread_num()); } void funcB(){ printf("Функция funcB: выполняется нитью %d\n", omp_get_thread_num()); } void funcC(){ printf("Функция funcC: выполняется нитью %d\n", omp_get_thread_num()); }
Программа section.f
program section integer n n = 3 call omp_set_num_threads(n) !$OMP PARALLEL !$OMP SECTIONS !$OMP SECTION call SUB1() !$OMP SECTION call SUB2() !$OMP SECTION call SUB3() !$OMP END SECTIONS !$OMP END PARALLEL END subroutine SUB1() integer omp_get_thread_num print *, 'Subroutine SUB1 doing thread', omp_get_thread_num() end subroutine SUB2() integer omp_get_thread_num print *, 'Subroutine SUB2 doing thread', omp_get_thread_num() end subroutine SUB3() integer omp_get_thread_num print *, 'Subroutine SUB3 doing thread', omp_get_thread_num() end