Вперед: 3.2.4. Разделение работы, директива WORKSHARE
Назад: 3.2.2. Разделение работы, параллельные циклы
К содержанию: Оглавление


3.2.3. Разделение работы, параллельные секции

Директива позволяет организовать в программе параллельное выполнение независимых блоков кода.

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
 


Вперед: 3.2.4. Разделение работы, директива WORKSHARE
Назад: 3.2.2. Разделение работы, параллельные циклы
К содержанию: Оглавление