Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- c
- c flops.f
- c
- c Author:
- c Yuri Sbitnev <yuri@linux-ekb.info>
- c
- c Copyright (c) 2008-2009 Yuri Sbitnev
- c
- c This program is free software; you can redistribute it and/or modify
- c it under the terms of the GNU General Public License as published by
- c the Free Software Foundation; either version 2 of the License, or
- c (at your option) any later version.
- c
- c This program is distributed in the hope that it will be useful,
- c but WITHOUT ANY WARRANTY; without even the implied warranty of
- c MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- c GNU General Public License for more details.
- c
- c You should have received a copy of the GNU General Public License
- c along with this program; if not, write to the Free Software
- c Foundation, Inc., 59 Temple Place, Suite 330, Boston,
- c MA 02111-1307 USA
- program calc_mflops
- include 'mpif.h'
- integer i, j, n
- double precision w, gsum, sum
- double precision v
- integer np, myid, ierr, niter, status(MPI_STATUS_SIZE)
- real*8 time, amflops, amflops1, time1, time2, dsecnd
- integer mflops, mflops1
- c Initialize MPI. Find number of processors.
- call MPI_INIT( ierr )
- call MPI_COMM_RANK( MPI_COMM_WORLD, myid, ierr )
- call MPI_COMM_SIZE( MPI_COMM_WORLD, np, ierr )
- c Zero process determines the number of points.
- if ( myid .eq. 0 ) then
- n = 200000000
- endif
- time1 = MPI_Wtime()
- c Send number of point from zero process to all other processes
- call MPI_BCAST(n, 1, MPI_INTEGER, 0, MPI_COMM_WORLD, ierr)
- c Calculate partial sum
- w = 1.0 / n
- do j = 1, 4
- sum = 0.0d0
- do i = myid+1, n, np
- v = (i - 0.5d0 ) * w
- v = 4.0d0 / (1.0d0 + v * v)
- sum = sum + v
- end do
- end do
- c Summarize the partial sums and store it in zero process
- call MPI_REDUCE(sum, gsum, 1, MPI_DOUBLE_PRECISION,
- $ MPI_SUM, 0, MPI_COMM_WORLD, ierr)
- time2 = MPI_Wtime()
- time = (time2 - time1) / 4
- niter = 0
- do i = myid+1, n, np
- niter = niter + 1
- end do
- mflops1 = 9 * niter / (1000000.0 * time)
- c Zero process prints cluster benchmark results
- if (myid .eq. 0) then
- mflops = 9 * n / (1000000.0 * time)
- print *, ' '
- print '(A)', ' HPC Test ----------------------------------------'
- print '(A,I2.1)', ' Quantity of processors = ', np
- print '(A,F6.2,A)',
- $' Calculation time = ', time, ' seconds'
- print '(A,I6.1,A)',
- $' Cluster speed = ', mflops, ' MFLOPS'
- print '(A)', ' -------------------------------------------------'
- print '(A,I2.2,A,I6.1,A)',
- $' Cluster node N',0,' speed = ', mflops1, ' MFLOPS'
- c Collect and print benchmark results from individual processes
- do i = 1, np-1
- CALL MPI_RECV(mflops1, 1, MPI_REAL8, i, 0,
- $ MPI_COMM_WORLD, status, ierr)
- print '(A,I2.2,A,I6.1,A)',
- $' Cluster node N', i, ' speed = ', mflops1, ' MFLOPS'
- end do
- print '(A)', ' -------------------------------------------------'
- print *, ' '
- else
- c Send local process benchmark result to zero process
- call MPI_SEND(mflops1, 1, MPI_REAL8, 0, 0,
- $ MPI_COMM_WORLD, ierr)
- endif
- c Close MPI
- call MPI_FINALIZE(ierr)
- end
Add Comment
Please, Sign In to add comment