forked from OSchip/llvm-project
143 lines
3.9 KiB
Fortran
143 lines
3.9 KiB
Fortran
<ompts:test>
|
|
<ompts:testdescription>Test which checks if WORKSHARE is present.</ompts:testdescription>
|
|
<ompts:ompversion>2.0</ompts:ompversion>
|
|
<ompts:directive>omp workshare</ompts:directive>
|
|
<ompts:dependences>omp critical</ompts:dependences>
|
|
<ompts:testcode>
|
|
!********************************************************************
|
|
! Function: omp_workshare
|
|
!
|
|
! by Chunhua Liao, University of Houston
|
|
! Oct. 2005 - First version
|
|
!
|
|
! The idea for the test is that if WORKSHARE is not present,
|
|
! the array assignment in PARALLEL region will be executed by each
|
|
! thread and then wrongfully repeated several times.
|
|
!
|
|
! TODO:Do we need test for WHERE and FORALL?
|
|
! A simple test for WHERE and FORALL is added by Zhenying Liu
|
|
!********************************************************************
|
|
INTEGER FUNCTION <ompts:testcode:functionname>omp_workshare</ompts:testcode:functionname>()
|
|
IMPLICIT NONE
|
|
INTEGER result,i
|
|
INTEGER scalar02,scalar12,scalar22,scalar32,count
|
|
REAL, DIMENSION(1000)::FF
|
|
<ompts:orphan:vars>
|
|
INTEGER scalar0,scalar1,scalar2,scalar3
|
|
INTEGER, DIMENSION(1000)::AA,BB,CC
|
|
REAL, DIMENSION(1000)::DD
|
|
COMMON /orphvars/ scalar0,scalar1,scalar2,scalar3,
|
|
& AA,BB,CC,DD
|
|
</ompts:orphan:vars>
|
|
|
|
result=0
|
|
scalar0=0
|
|
scalar02=0
|
|
scalar1=0
|
|
scalar12=0
|
|
scalar2=0
|
|
scalar22=0
|
|
scalar3=0
|
|
scalar32=0
|
|
|
|
count = 0
|
|
|
|
AA=0
|
|
BB=0
|
|
|
|
do i=1,1000
|
|
CC(i) = i
|
|
FF(i) = 1.0/i
|
|
end do
|
|
|
|
!$OMP PARALLEL
|
|
<ompts:orphan>
|
|
<ompts:check>!$OMP WORKSHARE</ompts:check>
|
|
|
|
! test if work is divided or not for array assignment
|
|
AA=AA+1
|
|
|
|
! test if scalar assignment is treated as a single unit of work
|
|
scalar0=scalar0+1
|
|
|
|
! test if atomic is treated as a single unit of work
|
|
!$OMP ATOMIC
|
|
scalar1=scalar1+1
|
|
! test if critical is treated as a single unit of work
|
|
!$OMP CRITICAL
|
|
scalar2=scalar2+1
|
|
!$OMP END CRITICAL
|
|
|
|
! test if PARALLEL is treated as a single unit of work
|
|
!$OMP PARALLEL
|
|
scalar3=scalar3+1
|
|
!$OMP END PARALLEL
|
|
|
|
WHERE ( CC .ne. 0 ) DD = 1.0/CC
|
|
|
|
FORALL (I=1:1000) CC(i) = -i
|
|
|
|
<ompts:check>!$OMP END WORKSHARE</ompts:check>
|
|
</ompts:orphan>
|
|
!$OMP END PARALLEL
|
|
|
|
!sequential equivalent statements for comparison
|
|
BB=BB+1
|
|
scalar02=scalar02+1
|
|
scalar12=scalar12+1
|
|
scalar22=scalar22+1
|
|
scalar32=scalar32+1
|
|
|
|
! write (1,*) "ck:sum of AA is",SUM(AA)," sum of BB is ",sum(BB)
|
|
if (SUM(AA)/=SUM(BB)) then
|
|
write(1,*) "Array assignment has some problem"
|
|
result=result +1
|
|
endif
|
|
if (scalar0/=scalar02) then
|
|
write(1,*) "Scalar assignment has some problem"
|
|
result = result +1
|
|
endif
|
|
if (scalar1/=scalar12) then
|
|
write(1,*) "Atomic inside WORKSHARE has some problem"
|
|
result = result +1
|
|
endif
|
|
if (scalar2/=scalar22) then
|
|
write(1,*) "CRITICAL inside WORKSHARE has some problem"
|
|
result = result +1
|
|
endif
|
|
if (scalar3/=scalar32) then
|
|
write(1,*) "PARALLEL inside WORKSHARE has some problem"
|
|
result = result +1
|
|
endif
|
|
do i=1,1000
|
|
if ( abs( DD(i)- FF(i)) .gt. 1.0E-4 ) then
|
|
count = count + 1
|
|
end if
|
|
end do
|
|
if ( count .ne. 0 ) then
|
|
result = result + 1
|
|
write(1,*) "WHERE has some problem"
|
|
end if
|
|
|
|
count = 0
|
|
do i=1,1000
|
|
if ( CC(i) .ne. -i ) then
|
|
count = count + 1
|
|
end if
|
|
end do
|
|
if ( count .ne. 0 ) then
|
|
result = result + 1
|
|
write(1,*) "FORALL has some problem"
|
|
end if
|
|
|
|
|
|
!if anything is wrong, set return value to 0
|
|
if (result==0) then
|
|
<testfunctionname></testfunctionname> = 1
|
|
else
|
|
<testfunctionname></testfunctionname> = 0
|
|
end if
|
|
end
|
|
</ompts:testcode>
|
|
</ompts:test>
|