Collects statistics from all MPI-ranks
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
type(stats_type), | intent(inout) | :: | report | |||
integer, | intent(in) | :: | group |
SUBROUTINE stats_collect_from_ranks(report, group)
!! Collects statistics from all MPI-ranks
TYPE(stats_type), INTENT(INOUT) :: report
INTEGER, INTENT(IN) :: group
INTEGER :: i, myrank, nranks, sending_rank
INTEGER, ALLOCATABLE, DIMENSION(:) :: mnk_collected
INTEGER, DIMENSION(3) :: mnk
!$OMP MASTER
CALL mp_environ(nranks, myrank, group)
report%max_acc_flop = report%acc_flop
CALL mp_max(report%max_acc_flop, group)
report%max_smm_flop = report%smm_flop
CALL mp_max(report%max_smm_flop, group)
report%max_cpu_flop = report%cpu_flop
CALL mp_max(report%max_cpu_flop, group)
CALL mp_sum(report%acc_flop, group)
CALL mp_sum(report%smm_flop, group)
CALL mp_sum(report%cpu_flop, group)
CALL mp_sum(report%cpu_num_stacks, group)
CALL mp_sum(report%smm_num_stacks, group)
CALL mp_sum(report%acc_num_stacks, group)
! array mnk_collected is used as a logical-array, allows to use minloc
ALLOCATE (mnk_collected(SIZE(report%num_mnk_stacks, 1)))
mnk_collected = 0 ! init all to false
! broadcast stats of all mnk-combinations, which occurred on any mpi rank
DO
! each rank with uncollected stats tries to become the sending_rank
sending_rank = -1
IF (.NOT. ALL(mnk_collected == 1)) sending_rank = myrank
CALL mp_max(sending_rank, group)
IF (sending_rank < 0) EXIT ! every rank got all mnk collected
IF (sending_rank == myrank) THEN
i = MINLOC(mnk_collected, dim=1)
mnk = INT(report%num_mnk_stacks(i, 1:3), kind=int_4)
END IF
CALL mp_bcast(msg=mnk, source=sending_rank, gid=group)
CALL stats_add(report, m=mnk(1), n=mnk(2), k=mnk(3), stacksize_cpu=0_int_8, stacksize_acc=0_int_8)
DO i = 1, SIZE(report%num_mnk_stacks, 1)
IF (ALL(report%num_mnk_stacks(i, 1:3) == mnk)) THEN
IF (i <= SIZE(mnk_collected)) mnk_collected(i) = 1
CALL mp_sum(report%num_mnk_stacks(i, 4:9), group)
END IF
END DO
END DO
!$OMP END MASTER
END SUBROUTINE stats_collect_from_ranks