Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
type(GathervSpec), | intent(in) | :: | spec | |||
integer, | intent(out), | optional | :: | rc |
subroutine run(spec, rc) type(GathervSpec), intent(in) :: spec integer, optional, intent(out) :: rc integer :: status real :: tot_time real :: tot_time_sq real :: avg_time real :: rel_std_time type(GathervKernel) :: kernel 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) kernel = make_GathervKernel(spec, gather_comm, _RC) call write_header(MPI_COMM_WORLD, _RC) tot_time = 0 tot_time_sq = 0 associate (n => spec%n_tries) do i = 1, n t = time(kernel, writer_comm, _RC) tot_time = tot_time + t tot_time_sq = tot_time_sq + t**2 end do avg_time = tot_time / n rel_std_time = -1 ! unless if (n > 1) then rel_std_time = sqrt((tot_time_sq - spec%n_tries*avg_time**2)/(n-1))/avg_time end if end associate call report(spec, avg_time, rel_std_time, MPI_COMM_WORLD, _RC) _RETURN(_SUCCESS) end subroutine run