242 lines
7.5 KiB
FortranFixed
242 lines
7.5 KiB
FortranFixed
|
C*********************************************************************
|
||
|
C
|
||
|
C This benchmark test program is measuring a cpu performance
|
||
|
C of floating point operation by a Poisson equation solver.
|
||
|
CC
|
||
|
C If you have any question, please ask me via email.
|
||
|
C written by Ryutaro HIMENO, November 26, 2001.
|
||
|
C Version 3.0
|
||
|
C ----------------------------------------------
|
||
|
C Ryutaro Himeno, Dr. of Eng.
|
||
|
C Head of Computer Information Division,
|
||
|
C RIKEN (The Institute of Pysical and Chemical Research)
|
||
|
C Email : himeno@postman.riken.go.jp
|
||
|
C ---------------------------------------------------------------
|
||
|
C You can adjust the size of this benchmark code to fit your target
|
||
|
C computer. In that case, please chose following sets of
|
||
|
C (mimax,mjmax,mkmax):
|
||
|
C small : 65,33,33
|
||
|
C small : 129,65,65
|
||
|
C midium: 257,129,129
|
||
|
C large : 513,257,257
|
||
|
C ext.large: 1025,513,513
|
||
|
C This program is to measure a computer performance in MFLOPS
|
||
|
C by using a kernel which appears in a linear solver of pressure
|
||
|
C Poisson eq. which appears in an incompressible Navier-Stokes solver.
|
||
|
C A point-Jacobi method is employed in this solver as this method can
|
||
|
C be easyly vectrized and be parallelized.
|
||
|
C ------------------
|
||
|
C Finite-difference method, curvilinear coodinate system
|
||
|
C Vectorizable and parallelizable on each grid point
|
||
|
C No. of grid points : imax x jmax x kmax including boundaries
|
||
|
C ------------------
|
||
|
C A,B,C:coefficient matrix, wrk1: source term of Poisson equation
|
||
|
C wrk2 : working area, OMEGA : relaxation parameter
|
||
|
C BND:control variable for boundaries and objects ( = 0 or 1)
|
||
|
C P: pressure
|
||
|
C -------------------
|
||
|
C -------------------
|
||
|
C "use portlib" statement on the next line is for Visual fortran
|
||
|
C to use UNIX libraries. Please remove it if your system is UNIX.
|
||
|
C -------------------
|
||
|
! use portlib
|
||
|
use omp_lib
|
||
|
IMPLICIT REAL*4(a-h,o-z)
|
||
|
real*8 t1,t2
|
||
|
C
|
||
|
C PARAMETER (mimax=513,mjmax=257,mkmax=257)
|
||
|
C PARAMETER (mimax=257,mjmax=129,mkmax=129)
|
||
|
PARAMETER (mimax=129,mjmax=65,mkmax=65)
|
||
|
C PARAMETER (mimax=65,mjmax=33,mkmax=33)
|
||
|
C
|
||
|
C ttarget specifys the measuring period in sec
|
||
|
PARAMETER (ttarget=60.0)
|
||
|
CC Arrey
|
||
|
common /pres/ p(mimax,mjmax,mkmax)
|
||
|
common /mtrx/ a(mimax,mjmax,mkmax,4),
|
||
|
+ b(mimax,mjmax,mkmax,3),c(mimax,mjmax,mkmax,3)
|
||
|
common /bound/ bnd(mimax,mjmax,mkmax)
|
||
|
common /work/ wrk1(mimax,mjmax,mkmax),wrk2(mimax,mjmax,mkmax)
|
||
|
CC Other constants
|
||
|
common /others/ imax,jmax,kmax,omega
|
||
|
C
|
||
|
dimension time0(2),time1(2)
|
||
|
C
|
||
|
omega=0.8
|
||
|
imax=mimax-1
|
||
|
jmax=mjmax-1
|
||
|
kmax=mkmax-1
|
||
|
CC Initializing matrixes
|
||
|
call initmt
|
||
|
write(*,*) ' mimax=',mimax,' mjmax=',mjmax,' mkmax=',mkmax
|
||
|
write(*,*) ' imax=',imax,' jmax=',jmax,' kmax=',kmax
|
||
|
CC Start measuring
|
||
|
C
|
||
|
nn=10000
|
||
|
write(*,*) ' Start rehearsal measurement process.'
|
||
|
write(*,*) ' Measure the performance in 10000 times.'
|
||
|
C
|
||
|
cpu0=dtime(time0)
|
||
|
t1 = omp_get_wtime()
|
||
|
!$OMP PARALLEL DO
|
||
|
C
|
||
|
C Jacobi iteration
|
||
|
call jacobi(nn,gosa)
|
||
|
C
|
||
|
cpu1= dtime(time1)
|
||
|
!$OMP END PARALLEL DO
|
||
|
t2 = omp_get_wtime()
|
||
|
cpu = cpu1
|
||
|
cpu = t2-t1
|
||
|
flop=real(kmax-2)*real(jmax-2)*real(imax-2)*34.0*real(nn)
|
||
|
xmflops2=flop/cpu*1.0e-6
|
||
|
write(*,*) ' MFLOPS:',xmflops2,' time(s):',cpu,gosa
|
||
|
C
|
||
|
C end the test loop
|
||
|
! nn=ifix(ttarget/(cpu/3.0))
|
||
|
! write(*,*) 'Now, start the actual measurement process.'
|
||
|
! write(*,*) 'The loop will be excuted in',nn,' times.'
|
||
|
! write(*,*) 'This will take about one minute.'
|
||
|
! write(*,*) 'Wait for a while.'
|
||
|
C
|
||
|
C Jacobi iteration
|
||
|
! cpu0=dtime(time0)
|
||
|
! call jacobi(nn,gosa)
|
||
|
C
|
||
|
! cpu1= dtime(time1)
|
||
|
! cpu = cpu1
|
||
|
! flop=real(kmax-2)*real(jmax-2)*real(imax-2)*34.0*real(nn)
|
||
|
! xmflops2=flop*1.0e-6/cpu
|
||
|
C
|
||
|
CCC xmflops2=nflop/cpu*1.0e-6*float(nn)
|
||
|
C
|
||
|
! write(*,*) ' Loop executed for ',nn,' times'
|
||
|
! write(*,*) ' Gosa :',gosa
|
||
|
! write(*,*) ' MFLOPS:',xmflops2, ' time(s):',cpu
|
||
|
! score=xmflops2/82.84
|
||
|
! write(*,*) ' Score based on Pentium III 600MHz :',score
|
||
|
C
|
||
|
! pause
|
||
|
stop
|
||
|
END
|
||
|
C
|
||
|
C
|
||
|
C**************************************************************
|
||
|
subroutine initmt
|
||
|
C**************************************************************
|
||
|
IMPLICIT REAL*4(a-h,o-z)
|
||
|
C
|
||
|
C PARAMETER (mimax=513,mjmax=257,mkmax=257)
|
||
|
C PARAMETER (mimax=257,mjmax=129,mkmax=129)
|
||
|
PARAMETER (mimax=129,mjmax=65,mkmax=65)
|
||
|
C PARAMETER (mimax=65,mjmax=33,mkmax=33)
|
||
|
C
|
||
|
|
||
|
|
||
|
CC Arrey
|
||
|
common /pres/ p(mimax,mjmax,mkmax)
|
||
|
common /mtrx/ a(mimax,mjmax,mkmax,4),
|
||
|
+ b(mimax,mjmax,mkmax,3),c(mimax,mjmax,mkmax,3)
|
||
|
common /bound/ bnd(mimax,mjmax,mkmax)
|
||
|
common /work/ wrk1(mimax,mjmax,mkmax),wrk2(mimax,mjmax,mkmax)
|
||
|
CC other constants
|
||
|
common /others/ imax,jmax,kmax,omega
|
||
|
C
|
||
|
do k=1,mkmax
|
||
|
do j=1,mjmax
|
||
|
do i=1,mimax
|
||
|
a(i,j,k,1)=0.0
|
||
|
a(i,j,k,2)=0.0
|
||
|
a(i,j,k,3)=0.0
|
||
|
a(i,j,k,4)=0.0
|
||
|
b(i,j,k,1)=0.0
|
||
|
b(i,j,k,2)=0.0
|
||
|
b(i,j,k,3)=0.0
|
||
|
c(i,j,k,1)=0.0
|
||
|
c(i,j,k,2)=0.0
|
||
|
c(i,j,k,3)=0.0
|
||
|
p(i,j,k) =0.0
|
||
|
wrk1(i,j,k)=0.0
|
||
|
bnd(i,j,k)=0.0
|
||
|
enddo
|
||
|
enddo
|
||
|
enddo
|
||
|
C
|
||
|
do k=1,kmax
|
||
|
do j=1,jmax
|
||
|
do i=1,imax
|
||
|
a(i,j,k,1)=1.0
|
||
|
a(i,j,k,2)=1.0
|
||
|
a(i,j,k,3)=1.0
|
||
|
a(i,j,k,4)=1.0/6.0
|
||
|
b(i,j,k,1)=0.0
|
||
|
b(i,j,k,2)=0.0
|
||
|
b(i,j,k,3)=0.0
|
||
|
c(i,j,k,1)=1.0
|
||
|
c(i,j,k,2)=1.0
|
||
|
c(i,j,k,3)=1.0
|
||
|
p(i,j,k) =float((k-1)*(k-1))/float((kmax-1)*(kmax-1))
|
||
|
wrk1(i,j,k)=0.0
|
||
|
bnd(i,j,k)=1.0
|
||
|
enddo
|
||
|
enddo
|
||
|
enddo
|
||
|
C
|
||
|
return
|
||
|
end
|
||
|
C
|
||
|
C*************************************************************
|
||
|
subroutine jacobi(nn,gosa)
|
||
|
C*************************************************************
|
||
|
IMPLICIT REAL*4(a-h,o-z)
|
||
|
C
|
||
|
C PARAMETER (mimax=513,mjmax=257,mkmax=257)
|
||
|
C PARAMETER (mimax=257,mjmax=129,mkmax=129)
|
||
|
PARAMETER (mimax=129,mjmax=65,mkmax=65)
|
||
|
C PARAMETER (mimax=65,mjmax=33,mkmax=33)
|
||
|
C
|
||
|
|
||
|
CC Arrey
|
||
|
common /pres/ p(mimax,mjmax,mkmax)
|
||
|
common /mtrx/ a(mimax,mjmax,mkmax,4),
|
||
|
+ b(mimax,mjmax,mkmax,3),c(mimax,mjmax,mkmax,3)
|
||
|
common /bound/ bnd(mimax,mjmax,mkmax)
|
||
|
common /work/ wrk1(mimax,mjmax,mkmax),wrk2(mimax,mjmax,mkmax)
|
||
|
CC other constants
|
||
|
common /others/ imax,jmax,kmax,omega
|
||
|
C
|
||
|
C
|
||
|
DO loop=1,nn
|
||
|
gosa=0.0
|
||
|
DO K=2,kmax-1
|
||
|
DO J=2,jmax-1
|
||
|
DO I=2,imax-1
|
||
|
S0=a(I,J,K,1)*p(I+1,J,K)+a(I,J,K,2)*p(I,J+1,K)
|
||
|
1 +a(I,J,K,3)*p(I,J,K+1)
|
||
|
2 +b(I,J,K,1)*(p(I+1,J+1,K)-p(I+1,J-1,K)
|
||
|
3 -p(I-1,J+1,K)+p(I-1,J-1,K))
|
||
|
4 +b(I,J,K,2)*(p(I,J+1,K+1)-p(I,J-1,K+1)
|
||
|
5 -p(I,J+1,K-1)+p(I,J-1,K-1))
|
||
|
6 +b(I,J,K,3)*(p(I+1,J,K+1)-p(I-1,J,K+1)
|
||
|
7 -p(I+1,J,K-1)+p(I-1,J,K-1))
|
||
|
8 +c(I,J,K,1)*p(I-1,J,K)+c(I,J,K,2)*p(I,J-1,K)
|
||
|
9 +c(I,J,K,3)*p(I,J,K-1)+wrk1(I,J,K)
|
||
|
SS=(S0*a(I,J,K,4)-p(I,J,K))*bnd(I,J,K)
|
||
|
GOSA=GOSA+SS*SS
|
||
|
wrk2(I,J,K)=p(I,J,K)+OMEGA *SS
|
||
|
enddo
|
||
|
enddo
|
||
|
enddo
|
||
|
C
|
||
|
DO K=2,kmax-1
|
||
|
DO J=2,jmax-1
|
||
|
DO I=2,imax-1
|
||
|
p(I,J,K)=wrk2(I,J,K)
|
||
|
enddo
|
||
|
enddo
|
||
|
enddo
|
||
|
C
|
||
|
enddo
|
||
|
CC End of iteration
|
||
|
return
|
||
|
end
|