Actual source code: mpiutils.h

      1: #pragma once

      3: #include <petscsys.h>

      5: PETSC_EXTERN PetscErrorCode PetscGatherNumberOfMessages_Private(MPI_Comm, const PetscMPIInt[], const PetscInt[], PetscMPIInt *);
      6: PETSC_EXTERN PetscErrorCode PetscGatherMessageLengths_Private(MPI_Comm, PetscMPIInt, PetscMPIInt, const PetscInt[], PetscMPIInt **, PetscInt **);

      8: #if !defined(PETSC_HAVE_MPI_LARGE_COUNT) /* No matter PetscInt is 32-bit or 64-bit, without MPI large count we always do casting before MPI calls */
      9: /* Cast PetscInt <a> to PetscMPIInt <b>, where <a> is likely used for the 'count' argument in MPI routines.
     10:     It is similar to PetscMPIIntCast() except that here it returns an MPI error code.
     11:   */
     12: static inline PetscMPIInt PetscMPIIntCast_Internal(PetscInt a, PetscMPIInt *b)
     13: {
     14:   *b = (PetscMPIInt)(a);
     15:   if (PetscDefined(USE_64BIT_INDICIES) && PetscUnlikely(a > PETSC_MPI_INT_MAX)) return MPI_ERR_COUNT;
     16:   return MPI_SUCCESS;
     17: }

     19: static inline PetscMPIInt MPIU_Send(const void *buf, PetscInt count, MPI_Datatype datatype, PetscMPIInt dest, PetscMPIInt tag, MPI_Comm comm)
     20: {
     21:   PetscMPIInt count2;

     23:   PetscFunctionBegin;
     24:   PetscCallMPI(PetscMPIIntCast_Internal(count, &count2));
     25:   PetscCallMPI(MPI_Send(buf, count2, datatype, dest, tag, comm));
     26:   PetscFunctionReturn(MPI_SUCCESS);
     27: }

     29: static inline PetscMPIInt MPIU_Send_init(const void *buf, PetscInt count, MPI_Datatype datatype, PetscMPIInt dest, PetscMPIInt tag, MPI_Comm comm, MPI_Request *request)
     30: {
     31:   PetscMPIInt count2;

     33:   PetscFunctionBegin;
     34:   PetscCallMPI(PetscMPIIntCast_Internal(count, &count2));
     35:   PetscCallMPI(MPI_Send_init(buf, count2, datatype, dest, tag, comm, request));
     36:   PetscFunctionReturn(MPI_SUCCESS);
     37: }

     39: static inline PetscMPIInt MPIU_Isend(const void *buf, PetscInt count, MPI_Datatype datatype, PetscMPIInt dest, PetscMPIInt tag, MPI_Comm comm, MPI_Request *request)
     40: {
     41:   PetscMPIInt count2;

     43:   PetscFunctionBegin;
     44:   PetscCallMPI(PetscMPIIntCast_Internal(count, &count2));
     45:   PetscCallMPI(MPI_Isend(buf, count2, datatype, dest, tag, comm, request));
     46:   PetscFunctionReturn(MPI_SUCCESS);
     47: }

     49: static inline PetscMPIInt MPIU_Recv(void *buf, PetscInt count, MPI_Datatype datatype, PetscMPIInt source, PetscMPIInt tag, MPI_Comm comm, MPI_Status *status)
     50: {
     51:   PetscMPIInt count2;

     53:   PetscFunctionBegin;
     54:   PetscCallMPI(PetscMPIIntCast_Internal(count, &count2));
     55:   PetscCallMPI(MPI_Recv(buf, count2, datatype, source, tag, comm, status));
     56:   PetscFunctionReturn(MPI_SUCCESS);
     57: }

     59: static inline PetscMPIInt MPIU_Recv_init(void *buf, PetscInt count, MPI_Datatype datatype, PetscMPIInt source, PetscMPIInt tag, MPI_Comm comm, MPI_Request *request)
     60: {
     61:   PetscMPIInt count2;

     63:   PetscFunctionBegin;
     64:   PetscCallMPI(PetscMPIIntCast_Internal(count, &count2));
     65:   PetscCallMPI(MPI_Recv_init(buf, count2, datatype, source, tag, comm, request));
     66:   PetscFunctionReturn(MPI_SUCCESS);
     67: }

     69: static inline PetscMPIInt MPIU_Irecv(void *buf, PetscInt count, MPI_Datatype datatype, PetscMPIInt source, PetscMPIInt tag, MPI_Comm comm, MPI_Request *request)
     70: {
     71:   PetscMPIInt count2;

     73:   PetscFunctionBegin;
     74:   PetscCallMPI(PetscMPIIntCast_Internal(count, &count2));
     75:   PetscCallMPI(MPI_Irecv(buf, count2, datatype, source, tag, comm, request));
     76:   PetscFunctionReturn(MPI_SUCCESS);
     77: }
     78:   #if defined(PETSC_HAVE_MPI_REDUCE_LOCAL)
     79: static inline PetscMPIInt MPIU_Reduce_local(const void *inbuf, void *inoutbuf, PetscInt count, MPI_Datatype datatype, MPI_Op op)
     80: {
     81:   PetscMPIInt count2;

     83:   PetscFunctionBegin;
     84:   PetscCallMPI(PetscMPIIntCast_Internal(count, &count2));
     85:   PetscCallMPI(MPI_Reduce_local(inbuf, inoutbuf, count, datatype, op));
     86:   PetscFunctionReturn(MPI_SUCCESS);
     87: }
     88:   #endif

     90: #elif defined(PETSC_USE_64BIT_INDICES)
     91:   #define MPIU_Send(buf, count, datatype, dest, tag, comm)                 MPI_Send_c(buf, count, datatype, dest, tag, comm)
     92:   #define MPIU_Send_init(buf, count, datatype, dest, tag, comm, request)   MPI_Send_init_c(buf, count, datatype, dest, tag, comm, request)
     93:   #define MPIU_Isend(buf, count, datatype, dest, tag, comm, request)       MPI_Isend_c(buf, count, datatype, dest, tag, comm, request)
     94:   #define MPIU_Recv(buf, count, datatype, source, tag, comm, status)       MPI_Recv_c(buf, count, datatype, source, tag, comm, status)
     95:   #define MPIU_Recv_init(buf, count, datatype, source, tag, comm, request) MPI_Recv_init_c(buf, count, datatype, source, tag, comm, request)
     96:   #define MPIU_Irecv(buf, count, datatype, source, tag, comm, request)     MPI_Irecv_c(buf, count, datatype, source, tag, comm, request)
     97:   #if defined(PETSC_HAVE_MPI_REDUCE_LOCAL)
     98:     #define MPIU_Reduce_local(inbuf, inoutbuf, count, datatype, op) MPI_Reduce_local_c(inbuf, inoutbuf, count, datatype, op)
     99:   #endif
    100: #else
    101:   #define MPIU_Send(buf, count, datatype, dest, tag, comm)                 MPI_Send(buf, count, datatype, dest, tag, comm)
    102:   #define MPIU_Send_init(buf, count, datatype, dest, tag, comm, request)   MPI_Send_init(buf, count, datatype, dest, tag, comm, request)
    103:   #define MPIU_Isend(buf, count, datatype, dest, tag, comm, request)       MPI_Isend(buf, count, datatype, dest, tag, comm, request)
    104:   #define MPIU_Recv(buf, count, datatype, source, tag, comm, status)       MPI_Recv(buf, count, datatype, source, tag, comm, status)
    105:   #define MPIU_Recv_init(buf, count, datatype, source, tag, comm, request) MPI_Recv_init(buf, count, datatype, source, tag, comm, request)
    106:   #define MPIU_Irecv(buf, count, datatype, source, tag, comm, request)     MPI_Irecv(buf, count, datatype, source, tag, comm, request)
    107:   #if defined(PETSC_HAVE_MPI_REDUCE_LOCAL)
    108:     #define MPIU_Reduce_local(inbuf, inoutbuf, count, datatype, op) MPI_Reduce_local(inbuf, inoutbuf, count, datatype, op)
    109:   #endif
    110: #endif

    112: /* These APIs use arrays of MPI_Count/MPI_Aint */
    113: #if defined(PETSC_HAVE_MPI_LARGE_COUNT) && defined(PETSC_USE_64BIT_INDICES)
    114:   #define MPIU_Neighbor_alltoallv(a, b, c, d, e, f, g, h, i)            MPI_Neighbor_alltoallv_c(a, b, c, d, e, f, g, h, i)
    115:   #define MPIU_Neighbor_alltoallv_init(a, b, c, d, e, f, g, h, i, j, k) MPI_Neighbor_alltoallv_init_c(a, b, c, d, e, f, g, h, i, j, k)
    116:   #define MPIU_Ineighbor_alltoallv(a, b, c, d, e, f, g, h, i, j)        MPI_Ineighbor_alltoallv_c(a, b, c, d, e, f, g, h, i, j)
    117: #else
    118:   #define MPIU_Neighbor_alltoallv(a, b, c, d, e, f, g, h, i)            MPI_Neighbor_alltoallv(a, b, c, d, e, f, g, h, i)
    119:   #define MPIU_Neighbor_alltoallv_init(a, b, c, d, e, f, g, h, i, j, k) MPI_Neighbor_alltoallv_init(a, b, c, d, e, f, g, h, i, j, k)
    120:   #define MPIU_Ineighbor_alltoallv(a, b, c, d, e, f, g, h, i, j)        MPI_Ineighbor_alltoallv(a, b, c, d, e, f, g, h, i, j)
    121: #endif