OpenMP-Examples/sources/Example_taskloop_simd_reduction.1.f90

64 lines
1.6 KiB
Fortran

! @@name: taskloop_simd_reduction.1f90
! @@type: F-free
! @@compilable: yes, omp_5.0
! @@linkable: no
! @@expect: success
program main
use omp_lib
integer, parameter :: N=100
integer :: i, a(N), asum=0
a = [( i, i=1,N )] !! initialize
!! taskloop reductions
!$omp parallel master
!$omp taskloop reduction(+:asum) !! taskloop 1
do i=1,N; asum = asum + a(i); enddo
!$omp end taskloop
!$omp end parallel master
!$omp parallel reduction(task, +:asum) !! parallel reduction a
!$omp master
!$omp task in_reduction(+:asum) !! task 2
do i=1,N; asum = asum + a(i); enddo
!$omp end task
!$omp end master
!$omp master taskloop in_reduction(+:asum) !! taskloop 2
do i=1,N; asum = asum + a(i); enddo
!$omp end master taskloop
!$omp end parallel
!! taskloop simd reductions
!$omp parallel master
!$omp taskloop simd reduction(+:asum) !! taskloop simd 3
do i=1,N; asum = asum + a(i); enddo
!$omp end taskloop simd
!$omp end parallel master
!$omp parallel reduction(task, +:asum) !! parallel reduction b
!$omp master
!$omp task in_reduction(+:asum) !! task 4
do i=1,N; asum = asum + a(i); enddo
!$omp end task
!$omp end master
!$omp master taskloop simd in_reduction(+:asum) !! taskloop simd 4
do i=1,N; asum = asum + a(i); enddo
!$omp end master taskloop simd
!$omp end parallel
print*,"asum=",asum !! output: asum=30300
end program