!-------------------------------------------------------------------------! ! ! ! N A S P A R A L L E L B E N C H M A R K S 3.3 ! ! ! ! B T ! ! ! !-------------------------------------------------------------------------! ! ! ! This benchmark is part of the NAS Parallel Benchmark 3.3 suite. ! ! It is described in NAS Technical Reports 95-020 and 02-007. ! ! ! ! Permission to use, copy, distribute and modify this software ! ! for any purpose with or without fee is hereby granted. We ! ! request, however, that all derived work reference the NAS ! ! Parallel Benchmarks 3.3. This software is provided "as is" ! ! without express or implied warranty. ! ! ! ! Information on NPB 3.3, including the technical report, the ! ! original specifications, source code, results and information ! ! on how to submit new results, is available at: ! ! ! ! http://www.nas.nasa.gov/Software/NPB/ ! ! ! ! Send comments or suggestions to npb@nas.nasa.gov ! ! ! ! NAS Parallel Benchmarks Group ! ! NASA Ames Research Center ! ! Mail Stop: T27A-1 ! ! Moffett Field, CA 94035-1000 ! ! ! ! E-mail: npb@nas.nasa.gov ! ! Fax: (650) 604-3957 ! ! ! !-------------------------------------------------------------------------! c--------------------------------------------------------------------- c c Authors: R. F. Van der Wijngaart c T. Harris c M. Yarrow c c--------------------------------------------------------------------- c--------------------------------------------------------------------- program MPBT c--------------------------------------------------------------------- include 'header.h' include 'mpinpb.h' integer i, niter, step, c, error, fstatus double precision navg, mflops, mbytes, n3 external timer_read double precision t, tmax, tiominv, tpc, timer_read logical verified character class, cbuff*40 integer wr_interval call setup_mpi if (.not. active) goto 999 c--------------------------------------------------------------------- c Root node reads input file (if it exists) else takes c defaults from parameters c--------------------------------------------------------------------- if (node .eq. root) then write(*, 1000) open (unit=2,file='inputbt.data',status='old', iostat=fstatus) c rd_interval = 0 if (fstatus .eq. 0) then write(*,233) 233 format(' Reading from input file inputbt.data') read (2,*) niter read (2,*) dt read (2,*) grid_points(1), grid_points(2), grid_points(3) if (iotype .ne. 0) then read (2,'(A)') cbuff read (cbuff,*,iostat=i) wr_interval, rd_interval if (i .ne. 0) rd_interval = 0 if (wr_interval .le. 0) wr_interval = wr_default endif if (iotype .eq. 1) then read (2,*) collbuf_nodes, collbuf_size write(*,*) 'collbuf_nodes ', collbuf_nodes write(*,*) 'collbuf_size ', collbuf_size endif close(2) else write(*,234) niter = niter_default dt = dt_default grid_points(1) = problem_size grid_points(2) = problem_size grid_points(3) = problem_size wr_interval = wr_default if (iotype .eq. 1) then c set number of nodes involved in collective buffering to 4, c unless total number of nodes is smaller than that. c set buffer size for collective buffering to 1MB per node c collbuf_nodes = min(4,no_nodes) c set default to No-File-Hints with a value of 0 collbuf_nodes = 0 collbuf_size = 1000000 endif endif 234 format(' No input file inputbt.data. Using compiled defaults') write(*, 1001) grid_points(1), grid_points(2), grid_points(3) write(*, 1002) niter, dt if (no_nodes .ne. total_nodes) write(*, 1004) total_nodes if (no_nodes .ne. maxcells*maxcells) > write(*, 1005) maxcells*maxcells write(*, 1003) no_nodes if (iotype .eq. 1) write(*, 1006) 'FULL MPI-IO', wr_interval if (iotype .eq. 2) write(*, 1006) 'SIMPLE MPI-IO', wr_interval if (iotype .eq. 3) write(*, 1006) 'EPIO', wr_interval if (iotype .eq. 4) write(*, 1006) 'FORTRAN IO', wr_interval 1000 format(//, ' NAS Parallel Benchmarks 3.3 -- BT Benchmark ',/) 1001 format(' Size: ', i4, 'x', i4, 'x', i4) 1002 format(' Iterations: ', i4, ' dt: ', F11.7) 1004 format(' Total number of processes: ', i5) 1005 format(' WARNING: compiled for ', i5, ' processes ') 1003 format(' Number of active processes: ', i5, /) 1006 format(' BTIO -- ', A, ' write interval: ', i3 /) endif call mpi_bcast(niter, 1, MPI_INTEGER, > root, comm_setup, error) call mpi_bcast(dt, 1, dp_type, > root, comm_setup, error) call mpi_bcast(grid_points(1), 3, MPI_INTEGER, > root, comm_setup, error) call mpi_bcast(wr_interval, 1, MPI_INTEGER, > root, comm_setup, error) call mpi_bcast(rd_interval, 1, MPI_INTEGER, > root, comm_setup, error) call make_set do c = 1, maxcells if ( (cell_size(1,c) .gt. IMAX) .or. > (cell_size(2,c) .gt. JMAX) .or. > (cell_size(3,c) .gt. KMAX) ) then print *,node, c, (cell_size(i,c),i=1,3) print *,' Problem size too big for compiled array sizes' goto 999 endif end do call set_constants call initialize call setup_btio idump = 0 call lhsinit call exact_rhs call compute_buffer_size(5) c--------------------------------------------------------------------- c do one time step to touch all code, and reinitialize c--------------------------------------------------------------------- call adi call initialize call timer_clear(2) c--------------------------------------------------------------------- c Synchronize before placing time stamp c--------------------------------------------------------------------- call mpi_barrier(comm_setup, error) call timer_clear(1) call timer_start(1) do step = 1, niter if (node .eq. root) then if (mod(step, 20) .eq. 0 .or. step .eq. niter .or. > step .eq. 1) then write(*, 200) step 200 format(' Time step ', i4) endif endif call adi if (iotype .ne. 0) then call timer_start(2) if (mod(step, wr_interval).eq.0 .or. step .eq. niter) then if (node .eq. root) then print *, 'Writing data set, time step', step endif if (step .eq. niter .and. rd_interval .gt. 1) then rd_interval = 1 endif call output_timestep idump = idump + 1 endif call timer_stop(2) endif end do call btio_cleanup call timer_stop(1) t = timer_read(1) call verify(niter, class, verified) call mpi_reduce(t, tmax, 1, > dp_type, MPI_MAX, > root, comm_setup, error) if (iotype .ne. 0) then t = timer_read(2) if (t .ne. 0.d0) t = 1.0d0 / t call mpi_reduce(t, tiominv, 1, > dp_type, MPI_SUM, > root, comm_setup, error) endif if( node .eq. root ) then n3 = 1.0d0*grid_points(1)*grid_points(2)*grid_points(3) navg = (grid_points(1)+grid_points(2)+grid_points(3))/3.0 if( tmax .ne. 0. ) then mflops = 1.0e-6*float(niter)* > (3478.8*n3-17655.7*navg**2+28023.7*navg) > / tmax else mflops = 0.0 endif if (iotype .ne. 0) then mbytes = n3 * 40.0 * idump * 1.0d-6 tiominv = tiominv / no_nodes t = 0.0 if (tiominv .ne. 0.) t = 1.d0 / tiominv tpc = 0.0 if (tmax .ne. 0.) tpc = t * 100.0 / tmax write(*,1100) t, tpc, mbytes, mbytes*tiominv 1100 format(/' BTIO -- statistics:'/ > ' I/O timing in seconds : ', f14.2/ > ' I/O timing percentage : ', f14.2/ > ' Total data written (MB) : ', f14.2/ > ' I/O data rate (MB/sec) : ', f14.2) endif call print_results('BT', class, grid_points(1), > grid_points(2), grid_points(3), niter, maxcells*maxcells, > total_nodes, tmax, mflops, ' floating point', > verified, npbversion,compiletime, cs1, cs2, cs3, cs4, cs5, > cs6, '(none)') endif 999 continue call mpi_barrier(MPI_COMM_WORLD, error) call mpi_finalize(error) end