Директива 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