Calculate column distribution for a rank
Distributes ncols columns across nranks as evenly as possible. Extra columns go to lower-numbered ranks.
| Type | Intent | Optional | 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 |
| Type | Visibility | Attributes | Name | Initial | |||
|---|---|---|---|---|---|---|---|
| integer(kind=int32), | private | :: | base_cols | ||||
| integer(kind=int32), | private | :: | extra |
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