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