10f8e0872SSatish Balay #define PETSC_DLL 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 70f8e0872SSatish Balay #include "petsc.h" /*I "petsc.h" I*/ 80f8e0872SSatish Balay 90f8e0872SSatish Balay #if defined(PETSC_USE_LOG) && !defined(_petsc_mpi_uni) 100f8e0872SSatish Balay 110f8e0872SSatish Balay #undef __FUNCT__ 120f8e0872SSatish Balay #define __FUNCT__ "PetscMPIDump" 130f8e0872SSatish Balay /*@C 140f8e0872SSatish Balay PetscMPIDump - Dumps a listing of incomplete MPI operations, such as sends that 150f8e0872SSatish Balay have never been received, etc. 160f8e0872SSatish Balay 170f8e0872SSatish Balay Collective on PETSC_COMM_WORLD 180f8e0872SSatish Balay 190f8e0872SSatish Balay Input Parameter: 200f8e0872SSatish Balay . fp - file pointer. If fp is NULL, stdout is assumed. 210f8e0872SSatish Balay 220f8e0872SSatish Balay Options Database Key: 230f8e0872SSatish Balay . -mpidump - Dumps MPI incompleteness during call to PetscFinalize() 240f8e0872SSatish Balay 250f8e0872SSatish Balay Level: developer 260f8e0872SSatish Balay 270f8e0872SSatish Balay .seealso: PetscMallocDump() 280f8e0872SSatish Balay @*/ 290f8e0872SSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscMPIDump(FILE *fd) 300f8e0872SSatish Balay { 310f8e0872SSatish Balay PetscErrorCode ierr; 320f8e0872SSatish Balay PetscMPIInt rank; 330f8e0872SSatish Balay double tsends,trecvs,work; 340f8e0872SSatish Balay 350f8e0872SSatish Balay PetscFunctionBegin; 360f8e0872SSatish Balay ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr); 37*da9f1d6bSBarry Smith if (!fd) fd = PETSC_STDOUT; 380f8e0872SSatish Balay 390f8e0872SSatish Balay /* Did we wait on all the non-blocking sends and receives? */ 400f8e0872SSatish Balay ierr = PetscSequentialPhaseBegin(PETSC_COMM_WORLD,1);CHKERRQ(ierr); 410f8e0872SSatish Balay if (irecv_ct + isend_ct != sum_of_waits_ct) { 420f8e0872SSatish Balay ierr = PetscFPrintf(PETSC_COMM_SELF,fd,"[%d]You have not waited on all non-blocking sends and receives",rank);CHKERRQ(ierr); 430f8e0872SSatish Balay ierr = PetscFPrintf(PETSC_COMM_SELF,fd,"[%d]Number non-blocking sends %g receives %g number of waits %g\n",rank,isend_ct,irecv_ct,sum_of_waits_ct);CHKERRQ(ierr); 440f8e0872SSatish Balay fflush(fd); 450f8e0872SSatish Balay } 460f8e0872SSatish Balay ierr = PetscSequentialPhaseEnd(PETSC_COMM_WORLD,1);CHKERRQ(ierr); 470f8e0872SSatish Balay /* Did we receive all the messages that we sent? */ 480f8e0872SSatish Balay work = irecv_ct + recv_ct; 490f8e0872SSatish Balay ierr = MPI_Reduce(&work,&trecvs,1,MPI_DOUBLE,MPI_SUM,0,PETSC_COMM_WORLD);CHKERRQ(ierr); 500f8e0872SSatish Balay work = isend_ct + send_ct; 510f8e0872SSatish Balay ierr = MPI_Reduce(&work,&tsends,1,MPI_DOUBLE,MPI_SUM,0,PETSC_COMM_WORLD);CHKERRQ(ierr); 520f8e0872SSatish Balay if (!rank && tsends != trecvs) { 530f8e0872SSatish Balay ierr = PetscFPrintf(PETSC_COMM_SELF,fd,"Total number sends %g not equal receives %g\n",tsends,trecvs);CHKERRQ(ierr); 540f8e0872SSatish Balay fflush(fd); 550f8e0872SSatish Balay } 560f8e0872SSatish Balay PetscFunctionReturn(0); 570f8e0872SSatish Balay } 580f8e0872SSatish Balay 590f8e0872SSatish Balay #else 600f8e0872SSatish Balay 610f8e0872SSatish Balay #undef __FUNCT__ 620f8e0872SSatish Balay #define __FUNCT__ "PetscMPIDump" 630f8e0872SSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscMPIDump(FILE *fd) 640f8e0872SSatish Balay { 650f8e0872SSatish Balay PetscFunctionBegin; 660f8e0872SSatish Balay PetscFunctionReturn(0); 670f8e0872SSatish Balay } 680f8e0872SSatish Balay 690f8e0872SSatish Balay #endif 700f8e0872SSatish Balay 710f8e0872SSatish Balay 720f8e0872SSatish Balay 730f8e0872SSatish Balay 740f8e0872SSatish Balay 750f8e0872SSatish Balay 760f8e0872SSatish Balay 770f8e0872SSatish Balay 780f8e0872SSatish Balay 79