All-to-all data exchange, rank 1 arrays, equal sizes
Index meaning
The first two indices specify the data while the last index counts the processes
Sizes of ranks All processes have the same data size.
MPI mapping mpi_alltoall
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
complex(kind=real_4), | intent(in), | CONTIGUOUS | :: | sb(:) |
array with data to send |
|
complex(kind=real_4), | intent(out), | CONTIGUOUS | :: | rb(:) |
array into which data is received |
|
integer, | intent(in) | :: | count |
number of elements to send/receive (product of the extents of the first two dimensions) |
||
type(mp_comm_type), | intent(in) | :: | group |
Message passing environment identifier |
SUBROUTINE mp_alltoall_c (sb, rb, count, group) !! All-to-all data exchange, rank 1 arrays, equal sizes !! !! Index meaning !! !! The first two indices specify the data while the last index counts !! the processes !! !! Sizes of ranks !! All processes have the same data size. !! !! MPI mapping !! mpi_alltoall COMPLEX(kind=real_4), CONTIGUOUS, INTENT(IN) :: sb(:) !! array with data to send COMPLEX(kind=real_4), CONTIGUOUS, INTENT(OUT) :: rb(:) !! array into which data is received INTEGER, INTENT(IN) :: count !! number of elements to send/receive (product of the extents of the first two dimensions) TYPE(mp_comm_type), INTENT(IN) :: group !! Message passing environment identifier CHARACTER(LEN=*), PARAMETER :: routineN = 'mp_alltoall_c' INTEGER :: handle, ierr #if defined(__parallel) INTEGER :: msglen, np #endif ierr = 0 CALL timeset(routineN, handle) #if defined(__parallel) CALL mpi_alltoall(sb, count, MPI_COMPLEX, & rb, count, MPI_COMPLEX, group%handle, ierr) IF (ierr /= 0) CALL mp_stop(ierr, "mpi_alltoall @ "//routineN) CALL mpi_comm_size(group%handle, np, ierr) IF (ierr /= 0) CALL mp_stop(ierr, "mpi_comm_size @ "//routineN) msglen = 2*count*np CALL add_perf(perf_id=6, msg_size=msglen*(2*real_4_size)) #else MARK_USED(count) MARK_USED(group) rb = sb #endif CALL timestop(handle) END SUBROUTINE mp_alltoall_c