module m use omp_lib implicit none (type, external) contains subroutine foo (x, a) integer, value :: x integer, contiguous :: a(0:) integer :: i !$omp masked if (omp_get_thread_num () /= 0) & stop 1 a(128) = a(128) + 1 !$omp end masked !$omp masked filter (0) if (omp_get_thread_num () /= 0) & stop 2 a(129) = a(129) + 1 !$omp end masked !$omp masked filter (7) if (omp_get_thread_num () /= 7) & stop 3 a(130) = a(130) + 1 !$omp end masked !$omp masked filter (x) if (omp_get_thread_num () /= x) & stop 4 a(131) = a(131) + 1 !$omp end masked !$omp masked taskloop simd filter (x) shared(a) grainsize (12) simdlen (4) do i = 0, 127 a(i) = a(i) + i end do !$omp end masked taskloop simd end end program main use m implicit none (type, external) integer :: i integer :: a(0:135) a = 0 !$omp parallel num_threads (4) call foo (4, a) !$omp end parallel do i = 0, 127 if (a(i) /= 0) & stop 5 end do if (a(128) /= 1 .or. a(129) /= 1 .or. a(130) /= 0 .or. a(131) /= 0) & stop 6 !$omp parallel num_threads (4) call foo (3, a) !$omp end parallel do i = 0, 127 if (a(i) /= i) & stop 7 end do if (a(128) /= 2 .or. a(129) /= 2 .or. a(130) /= 0 .or. a(131) /= 1) & stop 8 !$omp parallel num_threads (8) call foo (8, a) !$omp end parallel do i = 0, 127 if (a(i) /= i) & stop 9 end do if (a(128) /= 3 .or. a(129) /= 3 .or. a(130) /= 1 .or. a(131) /= 1) & stop 10 !$omp parallel num_threads (8) call foo (6, a) !$omp end parallel do i = 0, 127 if (a(i) /= 2 * i) & stop 11 end do if (a(128) /= 4 .or. a(129) /= 4 .or. a(130) /= 2 .or. a(131) /= 2) & stop 12 do i = 0, 7 a(i) = 0 end do ! The filter expression can evaluate to different values in different threads. !$omp parallel masked num_threads (8) filter (omp_get_thread_num () + 1) a(omp_get_thread_num ()) = a(omp_get_thread_num ()) + 1 !$omp end parallel masked do i = 0, 7 if (a(i) /= 0) & stop 13 end do ! And multiple threads can be filtered. !$omp parallel masked num_threads (8) filter (iand (omp_get_thread_num (), not(1))) a(omp_get_thread_num ()) = a(omp_get_thread_num ()) + 1 !$omp end parallel masked do i = 0, 7 block integer :: j j = iand (i, 1) if (j /= 0) then j = 0 else j = 1 end if if (a(i) /= j) & stop 14 end block end do end program main