1*0f8e0872SSatish Balay #define PETSC_DLL 2*0f8e0872SSatish Balay /* 3*0f8e0872SSatish Balay Code for tracing mistakes in MPI usage. For example, sends that are never received, 4*0f8e0872SSatish Balay nonblocking messages that are not correctly waited for, etc. 5*0f8e0872SSatish Balay */ 6*0f8e0872SSatish Balay 7*0f8e0872SSatish Balay #include "petsc.h" /*I "petsc.h" I*/ 8*0f8e0872SSatish Balay 9*0f8e0872SSatish Balay #if defined(PETSC_USE_LOG) && !defined(_petsc_mpi_uni) 10*0f8e0872SSatish Balay 11*0f8e0872SSatish Balay #undef __FUNCT__ 12*0f8e0872SSatish Balay #define __FUNCT__ "PetscMPIDump" 13*0f8e0872SSatish Balay /*@C 14*0f8e0872SSatish Balay PetscMPIDump - Dumps a listing of incomplete MPI operations, such as sends that 15*0f8e0872SSatish Balay have never been received, etc. 16*0f8e0872SSatish Balay 17*0f8e0872SSatish Balay Collective on PETSC_COMM_WORLD 18*0f8e0872SSatish Balay 19*0f8e0872SSatish Balay Input Parameter: 20*0f8e0872SSatish Balay . fp - file pointer. If fp is NULL, stdout is assumed. 21*0f8e0872SSatish Balay 22*0f8e0872SSatish Balay Options Database Key: 23*0f8e0872SSatish Balay . -mpidump - Dumps MPI incompleteness during call to PetscFinalize() 24*0f8e0872SSatish Balay 25*0f8e0872SSatish Balay Level: developer 26*0f8e0872SSatish Balay 27*0f8e0872SSatish Balay .seealso: PetscMallocDump() 28*0f8e0872SSatish Balay @*/ 29*0f8e0872SSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscMPIDump(FILE *fd) 30*0f8e0872SSatish Balay { 31*0f8e0872SSatish Balay PetscErrorCode ierr; 32*0f8e0872SSatish Balay PetscMPIInt rank; 33*0f8e0872SSatish Balay double tsends,trecvs,work; 34*0f8e0872SSatish Balay 35*0f8e0872SSatish Balay PetscFunctionBegin; 36*0f8e0872SSatish Balay ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr); 37*0f8e0872SSatish Balay if (!fd) fd = stdout; 38*0f8e0872SSatish Balay 39*0f8e0872SSatish Balay /* Did we wait on all the non-blocking sends and receives? */ 40*0f8e0872SSatish Balay ierr = PetscSequentialPhaseBegin(PETSC_COMM_WORLD,1);CHKERRQ(ierr); 41*0f8e0872SSatish Balay if (irecv_ct + isend_ct != sum_of_waits_ct) { 42*0f8e0872SSatish Balay ierr = PetscFPrintf(PETSC_COMM_SELF,fd,"[%d]You have not waited on all non-blocking sends and receives",rank);CHKERRQ(ierr); 43*0f8e0872SSatish 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); 44*0f8e0872SSatish Balay fflush(fd); 45*0f8e0872SSatish Balay } 46*0f8e0872SSatish Balay ierr = PetscSequentialPhaseEnd(PETSC_COMM_WORLD,1);CHKERRQ(ierr); 47*0f8e0872SSatish Balay /* Did we receive all the messages that we sent? */ 48*0f8e0872SSatish Balay work = irecv_ct + recv_ct; 49*0f8e0872SSatish Balay ierr = MPI_Reduce(&work,&trecvs,1,MPI_DOUBLE,MPI_SUM,0,PETSC_COMM_WORLD);CHKERRQ(ierr); 50*0f8e0872SSatish Balay work = isend_ct + send_ct; 51*0f8e0872SSatish Balay ierr = MPI_Reduce(&work,&tsends,1,MPI_DOUBLE,MPI_SUM,0,PETSC_COMM_WORLD);CHKERRQ(ierr); 52*0f8e0872SSatish Balay if (!rank && tsends != trecvs) { 53*0f8e0872SSatish Balay ierr = PetscFPrintf(PETSC_COMM_SELF,fd,"Total number sends %g not equal receives %g\n",tsends,trecvs);CHKERRQ(ierr); 54*0f8e0872SSatish Balay fflush(fd); 55*0f8e0872SSatish Balay } 56*0f8e0872SSatish Balay PetscFunctionReturn(0); 57*0f8e0872SSatish Balay } 58*0f8e0872SSatish Balay 59*0f8e0872SSatish Balay #else 60*0f8e0872SSatish Balay 61*0f8e0872SSatish Balay #undef __FUNCT__ 62*0f8e0872SSatish Balay #define __FUNCT__ "PetscMPIDump" 63*0f8e0872SSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscMPIDump(FILE *fd) 64*0f8e0872SSatish Balay { 65*0f8e0872SSatish Balay PetscFunctionBegin; 66*0f8e0872SSatish Balay PetscFunctionReturn(0); 67*0f8e0872SSatish Balay } 68*0f8e0872SSatish Balay 69*0f8e0872SSatish Balay #endif 70*0f8e0872SSatish Balay 71*0f8e0872SSatish Balay 72*0f8e0872SSatish Balay 73*0f8e0872SSatish Balay 74*0f8e0872SSatish Balay 75*0f8e0872SSatish Balay 76*0f8e0872SSatish Balay 77*0f8e0872SSatish Balay 78*0f8e0872SSatish Balay 79