10f8e0872SSatish Balay /*
20f8e0872SSatish Balay Code for tracing mistakes in MPI usage. For example, sends that are never received,
30f8e0872SSatish Balay nonblocking messages that are not correctly waited for, etc.
40f8e0872SSatish Balay */
50f8e0872SSatish Balay
6c6db04a5SJed Brown #include <petscsys.h> /*I "petscsys.h" I*/
70f8e0872SSatish Balay
8994fe344SLisandro Dalcin #if defined(PETSC_USE_LOG) && !defined(PETSC_HAVE_MPIUNI)
90f8e0872SSatish Balay
100f8e0872SSatish Balay /*@C
110f8e0872SSatish Balay PetscMPIDump - Dumps a listing of incomplete MPI operations, such as sends that
120f8e0872SSatish Balay have never been received, etc.
130f8e0872SSatish Balay
14811af0c4SBarry Smith Collective on `PETSC_COMM_WORLD`
150f8e0872SSatish Balay
160f8e0872SSatish Balay Input Parameter:
17*aec76313SJacob Faibussowitsch . fd - file pointer. If fp is `NULL`, `stdout` is assumed.
180f8e0872SSatish Balay
190f8e0872SSatish Balay Options Database Key:
200f8e0872SSatish Balay . -mpidump - Dumps MPI incompleteness during call to PetscFinalize()
210f8e0872SSatish Balay
220f8e0872SSatish Balay Level: developer
230f8e0872SSatish Balay
24db781477SPatrick Sanan .seealso: `PetscMallocDump()`
250f8e0872SSatish Balay @*/
PetscMPIDump(FILE * fd)26d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscMPIDump(FILE *fd)
27d71ae5a4SJacob Faibussowitsch {
280f8e0872SSatish Balay PetscMPIInt rank;
290f8e0872SSatish Balay double tsends, trecvs, work;
300f8e0872SSatish Balay
310f8e0872SSatish Balay PetscFunctionBegin;
329566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank));
33da9f1d6bSBarry Smith if (!fd) fd = PETSC_STDOUT;
340f8e0872SSatish Balay
350f8e0872SSatish Balay /* Did we wait on all the non-blocking sends and receives? */
369566063dSJacob Faibussowitsch PetscCall(PetscSequentialPhaseBegin(PETSC_COMM_WORLD, 1));
37ad39c06fSJed Brown if (petsc_irecv_ct + petsc_isend_ct != petsc_sum_of_waits_ct) {
389566063dSJacob Faibussowitsch PetscCall(PetscFPrintf(PETSC_COMM_SELF, fd, "[%d]You have not waited on all non-blocking sends and receives", rank));
399566063dSJacob 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));
40c69effb2SJacob Faibussowitsch PetscCall(PetscFFlush(fd));
410f8e0872SSatish Balay }
429566063dSJacob Faibussowitsch PetscCall(PetscSequentialPhaseEnd(PETSC_COMM_WORLD, 1));
430f8e0872SSatish Balay /* Did we receive all the messages that we sent? */
44ad39c06fSJed Brown work = petsc_irecv_ct + petsc_recv_ct;
459566063dSJacob Faibussowitsch PetscCallMPI(MPI_Reduce(&work, &trecvs, 1, MPI_DOUBLE, MPI_SUM, 0, PETSC_COMM_WORLD));
46ad39c06fSJed Brown work = petsc_isend_ct + petsc_send_ct;
479566063dSJacob Faibussowitsch PetscCallMPI(MPI_Reduce(&work, &tsends, 1, MPI_DOUBLE, MPI_SUM, 0, PETSC_COMM_WORLD));
48dd400576SPatrick Sanan if (rank == 0 && tsends != trecvs) {
499566063dSJacob Faibussowitsch PetscCall(PetscFPrintf(PETSC_COMM_SELF, fd, "Total number sends %g not equal receives %g\n", tsends, trecvs));
50c69effb2SJacob Faibussowitsch PetscCall(PetscFFlush(fd));
510f8e0872SSatish Balay }
523ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
530f8e0872SSatish Balay }
540f8e0872SSatish Balay
550f8e0872SSatish Balay #else
560f8e0872SSatish Balay
PetscMPIDump(FILE * fd)57d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscMPIDump(FILE *fd)
58d71ae5a4SJacob Faibussowitsch {
590f8e0872SSatish Balay PetscFunctionBegin;
603ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
610f8e0872SSatish Balay }
620f8e0872SSatish Balay
630f8e0872SSatish Balay #endif
64