Вперед: 3.2.10. Явное управление распределением работы
Назад: 3.2.8. Директива ATOMIC
К содержанию: Оглавление


3.2.9. Директива ORDERED

Директива ORDERED /END ORDERED определяет блок внутри тела цикла, который должен выполняться в том порядке, в котором итерации идут в последовательном цикле. Директива применима к объемлющему параллельному циклу for/DO, содержащему ключ ORDERED. Запрещаются переходы внутрь или из блока ORDERED.

C/C++:

#pragma omp ordered

Fortran:

!$OMP ORDERED
<БЛОК ОПЕРАТОРОВ>
!$OMP END ORDERED

Пример программы:

Программа ordered.c

 #include <stdio.h>
 #include <stdlib.h>
 int main()
{
  int i, TID, n = 9;
  int a[n];
  for (i=0; i<n; i++)
    a[i] = i;
#pragma omp parallel for default(none) ordered schedule(runtime) private(i,TID) shared(n,a)
  for (i=0; i<n; i++)
  {
    TID = omp_get_thread_num();
    printf("Нить %d обновляет a[%d]\n",TID,i);
    a[i] = i;
#pragma omp ordered
   {printf("ORDERED нить %d a[%d] = %d\n",TID,i,a[i]);}
  } /*-- End of parallel for --*/
  return(0);
}

Программа ordered.f

 program ordered
   integer i,n,TID,a(0:9),omp_get_thread_num

   n = 9
   do i = 0, n-1
   a(i) = i
   end do
!$OMP PARALLEL DO ORDERED PRIVATE(i,TID) SHARED(n,a) 
   do i = 0, n-1
   TID = omp_get_thread_num()
   write(*,10) TID,i
 10 format (2x,'Thread ',I2,' modifying a(',I2,')')   
   a(i) = i
!$OMP ORDERED
   write(*,11) TID,i,a(i)
 11 format (2x,'ORDERED thread ',I2,' a(',I2,')=',I2)   
!$OMP END ORDERED
   end do   
!$OMP END PARALLEL DO
   End


Вперед: 3.2.10. Явное управление распределением работы
Назад: 3.2.8. Директива ATOMIC
К содержанию: Оглавление