aboutsummaryrefslogtreecommitdiff
path: root/final/testsuite/fortran/omp_workshare.f
diff options
context:
space:
mode:
Diffstat (limited to 'final/testsuite/fortran/omp_workshare.f')
-rw-r--r--final/testsuite/fortran/omp_workshare.f142
1 files changed, 142 insertions, 0 deletions
diff --git a/final/testsuite/fortran/omp_workshare.f b/final/testsuite/fortran/omp_workshare.f
new file mode 100644
index 0000000..a8faa27
--- /dev/null
+++ b/final/testsuite/fortran/omp_workshare.f
@@ -0,0 +1,142 @@
+<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>