Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
type(BW_BenchmarkSpec), | intent(in) | :: | spec | |||
integer, | intent(out), | optional | :: | rc |
subroutine run(spec, rc) type(BW_BenchmarkSpec), intent(in) :: spec integer, optional, intent(out) :: rc integer :: status real :: tot_time real :: tot_time_sq real :: avg_time real :: std_time type(BW_Benchmark) :: benchmark integer :: writer_comm integer :: gather_comm integer :: i real :: t integer :: color, rank, npes call MPI_Comm_rank(MPI_COMM_WORLD, rank, status) _VERIFY(status) call MPI_Comm_size(MPI_COMM_WORLD, npes, status) _VERIFY(status) color = (rank*spec%n_writers) / npes call MPI_Comm_split(MPI_COMM_WORLD, color, 0, gather_comm, status) _VERIFY(status) call MPI_Comm_rank(gather_comm, rank, status) _VERIFY(status) call MPI_Comm_split(MPI_COMM_WORLD, rank, 0, writer_comm, status) _VERIFY(status) if (rank /= 0) writer_comm = MPI_COMM_NULL _RETURN_IF(writer_comm == MPI_COMM_NULL) benchmark = make_BW_Benchmark(spec, writer_comm, _RC) call write_header(writer_comm, _RC) tot_time = 0 tot_time_sq = 0 associate (n => spec%n_tries) do i = 1, n t = time(benchmark, writer_comm, _RC) tot_time = tot_time + t tot_time_sq = tot_time_sq + t**2 end do avg_time = tot_time / n std_time = -1 ! unless if (n > 1) then std_time = sqrt((tot_time_sq - spec%n_tries*avg_time**2)/(n-1)) end if end associate call report(spec, avg_time, std_time, writer_comm, _RC) _RETURN(_SUCCESS) end subroutine run