xref: /petsc/src/sys/utils/mpitr.c (revision c69effb2e05caa58810396c101d616d7ad9da0a7)
17d0a6c19SBarry Smith 
20f8e0872SSatish Balay /*
30f8e0872SSatish Balay     Code for tracing mistakes in MPI usage. For example, sends that are never received,
40f8e0872SSatish Balay   nonblocking messages that are not correctly waited for, etc.
50f8e0872SSatish Balay */
60f8e0872SSatish Balay 
7c6db04a5SJed Brown #include <petscsys.h> /*I "petscsys.h" I*/
80f8e0872SSatish Balay 
9994fe344SLisandro Dalcin #if defined(PETSC_USE_LOG) && !defined(PETSC_HAVE_MPIUNI)
100f8e0872SSatish Balay 
110f8e0872SSatish Balay /*@C
120f8e0872SSatish Balay    PetscMPIDump - Dumps a listing of incomplete MPI operations, such as sends that
130f8e0872SSatish Balay    have never been received, etc.
140f8e0872SSatish Balay 
15811af0c4SBarry Smith    Collective on `PETSC_COMM_WORLD`
160f8e0872SSatish Balay 
170f8e0872SSatish Balay    Input Parameter:
18667f096bSBarry Smith .  fp - file pointer.  If fp is `NULL`, `stdout` is assumed.
190f8e0872SSatish Balay 
200f8e0872SSatish Balay    Options Database Key:
210f8e0872SSatish Balay .  -mpidump - Dumps MPI incompleteness during call to PetscFinalize()
220f8e0872SSatish Balay 
230f8e0872SSatish Balay     Level: developer
240f8e0872SSatish Balay 
25db781477SPatrick Sanan .seealso: `PetscMallocDump()`
260f8e0872SSatish Balay  @*/
27d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscMPIDump(FILE *fd)
28d71ae5a4SJacob Faibussowitsch {
290f8e0872SSatish Balay   PetscMPIInt rank;
300f8e0872SSatish Balay   double      tsends, trecvs, work;
310f8e0872SSatish Balay 
320f8e0872SSatish Balay   PetscFunctionBegin;
339566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank));
34da9f1d6bSBarry Smith   if (!fd) fd = PETSC_STDOUT;
350f8e0872SSatish Balay 
360f8e0872SSatish Balay   /* Did we wait on all the non-blocking sends and receives? */
379566063dSJacob Faibussowitsch   PetscCall(PetscSequentialPhaseBegin(PETSC_COMM_WORLD, 1));
38ad39c06fSJed Brown   if (petsc_irecv_ct + petsc_isend_ct != petsc_sum_of_waits_ct) {
399566063dSJacob Faibussowitsch     PetscCall(PetscFPrintf(PETSC_COMM_SELF, fd, "[%d]You have not waited on all non-blocking sends and receives", rank));
409566063dSJacob Faibussowitsch     PetscCall(PetscFPrintf(PETSC_COMM_SELF, fd, "[%d]Number non-blocking sends %g receives %g number of waits %g\n", rank, petsc_isend_ct, petsc_irecv_ct, petsc_sum_of_waits_ct));
41*c69effb2SJacob Faibussowitsch     PetscCall(PetscFFlush(fd));
420f8e0872SSatish Balay   }
439566063dSJacob Faibussowitsch   PetscCall(PetscSequentialPhaseEnd(PETSC_COMM_WORLD, 1));
440f8e0872SSatish Balay   /* Did we receive all the messages that we sent? */
45ad39c06fSJed Brown   work = petsc_irecv_ct + petsc_recv_ct;
469566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Reduce(&work, &trecvs, 1, MPI_DOUBLE, MPI_SUM, 0, PETSC_COMM_WORLD));
47ad39c06fSJed Brown   work = petsc_isend_ct + petsc_send_ct;
489566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Reduce(&work, &tsends, 1, MPI_DOUBLE, MPI_SUM, 0, PETSC_COMM_WORLD));
49dd400576SPatrick Sanan   if (rank == 0 && tsends != trecvs) {
509566063dSJacob Faibussowitsch     PetscCall(PetscFPrintf(PETSC_COMM_SELF, fd, "Total number sends %g not equal receives %g\n", tsends, trecvs));
51*c69effb2SJacob Faibussowitsch     PetscCall(PetscFFlush(fd));
520f8e0872SSatish Balay   }
533ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
540f8e0872SSatish Balay }
550f8e0872SSatish Balay 
560f8e0872SSatish Balay #else
570f8e0872SSatish Balay 
58d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscMPIDump(FILE *fd)
59d71ae5a4SJacob Faibussowitsch {
600f8e0872SSatish Balay   PetscFunctionBegin;
613ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
620f8e0872SSatish Balay }
630f8e0872SSatish Balay 
640f8e0872SSatish Balay #endif
650f8e0872SSatish Balay 
66b674149eSJunchao Zhang #if defined(PETSC_HAVE_MPI_PROCESS_SHARED_MEMORY)
678198064fSBarry Smith /*
688198064fSBarry Smith     OpenMPI version of MPI_Win_allocate_shared() does not provide __float128 alignment so we provide
698198064fSBarry Smith     a utility that insures alignment up to data item size.
708198064fSBarry Smith */
71d71ae5a4SJacob Faibussowitsch PetscErrorCode MPIU_Win_allocate_shared(MPI_Aint sz, PetscMPIInt szind, MPI_Info info, MPI_Comm comm, void *ptr, MPI_Win *win)
72d71ae5a4SJacob Faibussowitsch {
738198064fSBarry Smith   float *tmp;
740f8e0872SSatish Balay 
758198064fSBarry Smith   PetscFunctionBegin;
769566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Win_allocate_shared(16 + sz, szind, info, comm, &tmp, win));
778198064fSBarry Smith   tmp += ((size_t)tmp) % szind ? szind / 4 - ((((size_t)tmp) % szind) / 4) : 0;
788198064fSBarry Smith   *(void **)ptr = (void *)tmp;
793ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
808198064fSBarry Smith }
818198064fSBarry Smith 
82d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode MPIU_Win_shared_query(MPI_Win win, PetscMPIInt rank, MPI_Aint *sz, PetscMPIInt *szind, void *ptr)
83d71ae5a4SJacob Faibussowitsch {
848198064fSBarry Smith   float *tmp;
858198064fSBarry Smith 
868198064fSBarry Smith   PetscFunctionBegin;
879566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Win_shared_query(win, rank, sz, szind, &tmp));
8808401ef6SPierre Jolivet   PetscCheck(*szind > 0, PETSC_COMM_SELF, PETSC_ERR_LIB, "szkind %d must be positive", *szind);
898198064fSBarry Smith   tmp += ((size_t)tmp) % *szind ? *szind / 4 - ((((size_t)tmp) % *szind) / 4) : 0;
908198064fSBarry Smith   *(void **)ptr = (void *)tmp;
913ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
928198064fSBarry Smith }
938198064fSBarry Smith 
948198064fSBarry Smith #endif
95