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 150f8e0872SSatish Balay Collective on PETSC_COMM_WORLD 160f8e0872SSatish Balay 170f8e0872SSatish Balay Input Parameter: 180f8e0872SSatish Balay . 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 250f8e0872SSatish Balay .seealso: PetscMallocDump() 260f8e0872SSatish Balay @*/ 277087cfbeSBarry Smith PetscErrorCode PetscMPIDump(FILE *fd) 280f8e0872SSatish Balay { 290f8e0872SSatish Balay PetscErrorCode ierr; 300f8e0872SSatish Balay PetscMPIInt rank; 310f8e0872SSatish Balay double tsends,trecvs,work; 32f56c2debSBarry Smith int err; 330f8e0872SSatish Balay 340f8e0872SSatish Balay PetscFunctionBegin; 350f8e0872SSatish Balay ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr); 36da9f1d6bSBarry Smith if (!fd) fd = PETSC_STDOUT; 370f8e0872SSatish Balay 380f8e0872SSatish Balay /* Did we wait on all the non-blocking sends and receives? */ 390f8e0872SSatish Balay ierr = PetscSequentialPhaseBegin(PETSC_COMM_WORLD,1);CHKERRQ(ierr); 40ad39c06fSJed Brown if (petsc_irecv_ct + petsc_isend_ct != petsc_sum_of_waits_ct) { 410f8e0872SSatish Balay ierr = PetscFPrintf(PETSC_COMM_SELF,fd,"[%d]You have not waited on all non-blocking sends and receives",rank);CHKERRQ(ierr); 42ad39c06fSJed Brown ierr = 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);CHKERRQ(ierr); 43f56c2debSBarry Smith err = fflush(fd); 44e32f2f54SBarry Smith if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file"); 450f8e0872SSatish Balay } 460f8e0872SSatish Balay ierr = PetscSequentialPhaseEnd(PETSC_COMM_WORLD,1);CHKERRQ(ierr); 470f8e0872SSatish Balay /* Did we receive all the messages that we sent? */ 48ad39c06fSJed Brown work = petsc_irecv_ct + petsc_recv_ct; 490f8e0872SSatish Balay ierr = MPI_Reduce(&work,&trecvs,1,MPI_DOUBLE,MPI_SUM,0,PETSC_COMM_WORLD);CHKERRQ(ierr); 50ad39c06fSJed Brown work = petsc_isend_ct + petsc_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); 54f56c2debSBarry Smith err = fflush(fd); 55e32f2f54SBarry Smith if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file"); 560f8e0872SSatish Balay } 570f8e0872SSatish Balay PetscFunctionReturn(0); 580f8e0872SSatish Balay } 590f8e0872SSatish Balay 600f8e0872SSatish Balay #else 610f8e0872SSatish Balay 627087cfbeSBarry Smith PetscErrorCode PetscMPIDump(FILE *fd) 630f8e0872SSatish Balay { 640f8e0872SSatish Balay PetscFunctionBegin; 650f8e0872SSatish Balay PetscFunctionReturn(0); 660f8e0872SSatish Balay } 670f8e0872SSatish Balay 680f8e0872SSatish Balay #endif 690f8e0872SSatish Balay 70*b674149eSJunchao Zhang #if defined(PETSC_HAVE_MPI_PROCESS_SHARED_MEMORY) 718198064fSBarry Smith /* 728198064fSBarry Smith OpenMPI version of MPI_Win_allocate_shared() does not provide __float128 alignment so we provide 738198064fSBarry Smith a utility that insures alignment up to data item size. 748198064fSBarry Smith */ 758198064fSBarry Smith PetscErrorCode MPIU_Win_allocate_shared(MPI_Aint sz,PetscMPIInt szind,MPI_Info info,MPI_Comm comm,void *ptr,MPI_Win *win) 768198064fSBarry Smith { 778198064fSBarry Smith PetscErrorCode ierr; 788198064fSBarry Smith float *tmp; 790f8e0872SSatish Balay 808198064fSBarry Smith PetscFunctionBegin; 818198064fSBarry Smith ierr = MPI_Win_allocate_shared(16+sz,szind,info,comm,&tmp,win);CHKERRQ(ierr); 828198064fSBarry Smith tmp += ((size_t)tmp) % szind ? szind/4 - ((((size_t)tmp) % szind)/4) : 0; 838198064fSBarry Smith *(void**)ptr = (void*)tmp; 848198064fSBarry Smith PetscFunctionReturn(0); 858198064fSBarry Smith return 0; 868198064fSBarry Smith } 878198064fSBarry Smith 888198064fSBarry Smith PETSC_EXTERN PetscErrorCode MPIU_Win_shared_query(MPI_Win win,PetscMPIInt rank,MPI_Aint *sz,PetscMPIInt *szind,void *ptr) 898198064fSBarry Smith { 908198064fSBarry Smith PetscErrorCode ierr; 918198064fSBarry Smith float *tmp; 928198064fSBarry Smith 938198064fSBarry Smith PetscFunctionBegin; 948198064fSBarry Smith ierr = MPI_Win_shared_query(win,rank,sz,szind,&tmp);CHKERRQ(ierr); 9561716cb8SBarry Smith if (*szind <= 0) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_LIB,"szkind %d must be positive\n",*szind); 968198064fSBarry Smith tmp += ((size_t)tmp) % *szind ? *szind/4 - ((((size_t)tmp) % *szind)/4) : 0; 978198064fSBarry Smith *(void**)ptr = (void*)tmp; 988198064fSBarry Smith PetscFunctionReturn(0); 998198064fSBarry Smith } 1008198064fSBarry Smith 1018198064fSBarry Smith #endif 1020f8e0872SSatish Balay 1030f8e0872SSatish Balay 1040f8e0872SSatish Balay 1050f8e0872SSatish Balay 1060f8e0872SSatish Balay 1070f8e0872SSatish Balay 1080f8e0872SSatish Balay 109