calculate_distribution Subroutine

public pure subroutine calculate_distribution(ncols, nranks, rank, first_col, my_ncols)

Calculate column distribution for a rank

Distributes ncols columns across nranks as evenly as possible. Extra columns go to lower-numbered ranks.

Arguments

Type IntentOptional Attributes Name
integer(kind=int32), intent(in) :: ncols

Total number of columns

integer(kind=int32), intent(in) :: nranks

Total number of columns Number of MPI ranks

integer(kind=int32), intent(in) :: rank

Total number of columns Number of MPI ranks This rank’s number (0-indexed)

integer(kind=int32), intent(out) :: first_col

Output: first column owned (0-indexed)

integer(kind=int32), intent(out) :: my_ncols

Called by

proc~~calculate_distribution~~CalledByGraph proc~calculate_distribution calculate_distribution proc~darray_create_dp darray_create_dp proc~darray_create_dp->proc~calculate_distribution proc~darray_create_i32 darray_create_i32 proc~darray_create_i32->proc~calculate_distribution proc~darray_create_i64 darray_create_i64 proc~darray_create_i64->proc~calculate_distribution proc~darray_create_sp darray_create_sp proc~darray_create_sp->proc~calculate_distribution proc~darray_distrib darray_distrib proc~darray_distrib->proc~calculate_distribution proc~get_local_offset get_local_offset proc~get_local_offset->proc~calculate_distribution interface~darray_create darray_create interface~darray_create->proc~darray_create_dp interface~darray_create->proc~darray_create_i32 interface~darray_create->proc~darray_create_i64 interface~darray_create->proc~darray_create_sp proc~darray_acc_dp darray_acc_dp proc~darray_acc_dp->proc~get_local_offset proc~darray_acc_i32 darray_acc_i32 proc~darray_acc_i32->proc~get_local_offset proc~darray_acc_i64 darray_acc_i64 proc~darray_acc_i64->proc~get_local_offset proc~darray_acc_sp darray_acc_sp proc~darray_acc_sp->proc~get_local_offset proc~darray_get_dp darray_get_dp proc~darray_get_dp->proc~get_local_offset proc~darray_get_i32 darray_get_i32 proc~darray_get_i32->proc~get_local_offset proc~darray_get_i64 darray_get_i64 proc~darray_get_i64->proc~get_local_offset proc~darray_get_sp darray_get_sp proc~darray_get_sp->proc~get_local_offset proc~darray_put_dp darray_put_dp proc~darray_put_dp->proc~get_local_offset proc~darray_put_i32 darray_put_i32 proc~darray_put_i32->proc~get_local_offset proc~darray_put_i64 darray_put_i64 proc~darray_put_i64->proc~get_local_offset proc~darray_put_sp darray_put_sp proc~darray_put_sp->proc~get_local_offset interface~darray_acc darray_acc interface~darray_acc->proc~darray_acc_dp interface~darray_acc->proc~darray_acc_i32 interface~darray_acc->proc~darray_acc_i64 interface~darray_acc->proc~darray_acc_sp interface~darray_get darray_get interface~darray_get->proc~darray_get_dp interface~darray_get->proc~darray_get_i32 interface~darray_get->proc~darray_get_i64 interface~darray_get->proc~darray_get_sp interface~darray_put darray_put interface~darray_put->proc~darray_put_dp interface~darray_put->proc~darray_put_i32 interface~darray_put->proc~darray_put_i64 interface~darray_put->proc~darray_put_sp

Variables

Type Visibility Attributes Name Initial
integer(kind=int32), private :: base_cols
integer(kind=int32), private :: extra

Source Code

   pure subroutine calculate_distribution(ncols, nranks, rank, first_col, my_ncols)
      integer(int32), intent(in) :: ncols, nranks, rank
      integer(int32), intent(out) :: first_col, my_ncols
      integer(int32) :: base_cols, extra

      base_cols = ncols/nranks
      extra = mod(ncols, nranks)

      ! Ranks 0..extra-1 get one extra column
      if (rank < extra) then
         my_ncols = base_cols + 1
         first_col = rank*(base_cols + 1)
      else
         my_ncols = base_cols
         first_col = extra*(base_cols + 1) + (rank - extra)*base_cols
      end if
   end subroutine calculate_distribution