forked from OSchip/llvm-project
61 lines
2.2 KiB
Fortran
61 lines
2.2 KiB
Fortran
<ompts:test>
|
|
<ompts:testdescription>Test which checks that the omp_get_num_threads returns the correct number of threads. Therefor it counts up a variable in a parallelized section and compars this value with the result of the omp_get_num_threads function.</ompts:testdescription>
|
|
<ompts:ompversion>2.0</ompts:ompversion>
|
|
<ompts:directive>omp_get_num_threads</ompts:directive>
|
|
<ompts:testcode>
|
|
INTEGER FUNCTION <ompts:testcode:functionname>omp_num_threads</ompts:testcode:functionname>()
|
|
IMPLICIT NONE
|
|
INTEGER i, max_threads
|
|
INTEGER omp_get_num_threads
|
|
<ompts:orphan:vars>
|
|
INTEGER failed,threads,nthreads,tmp
|
|
COMMON /orphvars/ failed,threads,nthreads
|
|
</ompts:orphan:vars>
|
|
|
|
failed = 0
|
|
max_threads = 0
|
|
|
|
!$omp parallel
|
|
!$omp master
|
|
max_threads = OMP_GET_NUM_THREADS()
|
|
!$omp end master
|
|
!$omp end parallel
|
|
! print *, "max threads:",max_threads
|
|
|
|
!Yi Wen added omp_Set_dynamics here to make sure num_threads clause work
|
|
!Thanks to Dr. Yin Ma in Absoft. should be not be called before the test loop
|
|
!because it allows the dynamic adjustment of the number of threads at runtime
|
|
!instead of using the max_threads set.
|
|
|
|
!CALL OMP_SET_DYNAMIC(.TRUE.)
|
|
DO threads = 1, max_threads
|
|
nthreads = 0
|
|
<ompts:orphan>
|
|
!$omp parallel num_threads(threads) reduction(+:failed)
|
|
! print *, threads, omp_get_num_threads()
|
|
tmp = omp_get_num_threads()
|
|
IF ( threads .NE. tmp ) THEN
|
|
failed = failed + 1
|
|
WRITE (1,*) "Error: found ", tmp, " instead of ",
|
|
& threads, " threads"
|
|
END IF
|
|
!$omp atomic
|
|
nthreads = nthreads + 1
|
|
!$omp end parallel
|
|
</ompts:orphan>
|
|
! print *, threads, nthreads
|
|
<ompts:check>IF ( nthreads .NE. threads ) THEN</ompts:check>
|
|
<ompts:crosscheck>IF ( nthreads .EQ. threads ) THEN</ompts:crosscheck>
|
|
failed = failed + 1
|
|
END IF
|
|
END DO
|
|
|
|
IF(failed .NE. 0) THEN
|
|
<testfunctionname></testfunctionname> = 0
|
|
ELSE
|
|
<testfunctionname></testfunctionname> = 1
|
|
END IF
|
|
END FUNCTION
|
|
</ompts:testcode>
|
|
</ompts:test>
|