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>
 |