1*c4762a1bSJed Brown 2*c4762a1bSJed Brown static char help[] = "Augmenting PETSc profiling by add events.\n\ 3*c4762a1bSJed Brown Run this program with one of the\n\ 4*c4762a1bSJed Brown following options to generate logging information: -log, -log_view,\n\ 5*c4762a1bSJed Brown -log_all. The PETSc routines automatically log event times and flops,\n\ 6*c4762a1bSJed Brown so this monitoring is intended solely for users to employ in application\n\ 7*c4762a1bSJed Brown codes.\n\n"; 8*c4762a1bSJed Brown 9*c4762a1bSJed Brown /*T 10*c4762a1bSJed Brown Concepts: PetscLog^user-defined event profiling 11*c4762a1bSJed Brown Concepts: profiling^user-defined event 12*c4762a1bSJed Brown Concepts: PetscLog^activating/deactivating events for profiling 13*c4762a1bSJed Brown Concepts: profiling^activating/deactivating events 14*c4762a1bSJed Brown Processors: n 15*c4762a1bSJed Brown T*/ 16*c4762a1bSJed Brown 17*c4762a1bSJed Brown 18*c4762a1bSJed Brown 19*c4762a1bSJed Brown /* 20*c4762a1bSJed Brown Include "petscsys.h" so that we can use PETSc profiling routines. 21*c4762a1bSJed Brown */ 22*c4762a1bSJed Brown #include <petscsys.h> 23*c4762a1bSJed Brown #include <petscviewer.h> 24*c4762a1bSJed Brown 25*c4762a1bSJed Brown int main(int argc,char **argv) 26*c4762a1bSJed Brown { 27*c4762a1bSJed Brown PetscErrorCode ierr; 28*c4762a1bSJed Brown PetscMPIInt rank; 29*c4762a1bSJed Brown int i,imax=10000,icount; 30*c4762a1bSJed Brown PetscLogEvent USER_EVENT,check_USER_EVENT; 31*c4762a1bSJed Brown 32*c4762a1bSJed Brown ierr = PetscInitialize(&argc,&argv,NULL,help);if (ierr) return ierr; 33*c4762a1bSJed Brown 34*c4762a1bSJed Brown /* 35*c4762a1bSJed Brown Create a new user-defined event. 36*c4762a1bSJed Brown - Note that PetscLogEventRegister() returns to the user a unique 37*c4762a1bSJed Brown integer event number, which should then be used for profiling 38*c4762a1bSJed Brown the event via PetscLogEventBegin() and PetscLogEventEnd(). 39*c4762a1bSJed Brown - The user can also optionally log floating point operations 40*c4762a1bSJed Brown with the routine PetscLogFlops(). 41*c4762a1bSJed Brown */ 42*c4762a1bSJed Brown ierr = PetscLogEventRegister("User event",PETSC_VIEWER_CLASSID,&USER_EVENT);CHKERRQ(ierr); 43*c4762a1bSJed Brown ierr = PetscLogEventGetId("User event",&check_USER_EVENT);CHKERRQ(ierr); 44*c4762a1bSJed Brown if (USER_EVENT != check_USER_EVENT) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Event Ids do not match"); 45*c4762a1bSJed Brown 46*c4762a1bSJed Brown ierr = PetscLogEventBegin(USER_EVENT,0,0,0,0);CHKERRQ(ierr); 47*c4762a1bSJed Brown icount = 0; 48*c4762a1bSJed Brown for (i=0; i<imax; i++) icount++; 49*c4762a1bSJed Brown ierr = PetscLogFlops(imax);CHKERRQ(ierr); 50*c4762a1bSJed Brown ierr = PetscSleep(0.5);CHKERRQ(ierr); 51*c4762a1bSJed Brown ierr = PetscLogEventEnd(USER_EVENT,0,0,0,0);CHKERRQ(ierr); 52*c4762a1bSJed Brown 53*c4762a1bSJed Brown /* 54*c4762a1bSJed Brown We disable the logging of an event. 55*c4762a1bSJed Brown 56*c4762a1bSJed Brown */ 57*c4762a1bSJed Brown ierr = PetscLogEventDeactivate(USER_EVENT);CHKERRQ(ierr); 58*c4762a1bSJed Brown ierr = PetscLogEventBegin(USER_EVENT,0,0,0,0);CHKERRQ(ierr); 59*c4762a1bSJed Brown ierr = PetscSleep(0.5);CHKERRQ(ierr); 60*c4762a1bSJed Brown ierr = PetscLogEventEnd(USER_EVENT,0,0,0,0);CHKERRQ(ierr); 61*c4762a1bSJed Brown 62*c4762a1bSJed Brown /* 63*c4762a1bSJed Brown We next enable the logging of an event 64*c4762a1bSJed Brown */ 65*c4762a1bSJed Brown ierr = PetscLogEventActivate(USER_EVENT);CHKERRQ(ierr); 66*c4762a1bSJed Brown ierr = PetscLogEventBegin(USER_EVENT,0,0,0,0);CHKERRQ(ierr); 67*c4762a1bSJed Brown ierr = PetscSleep(0.5);CHKERRQ(ierr); 68*c4762a1bSJed Brown ierr = PetscLogEventEnd(USER_EVENT,0,0,0,0);CHKERRQ(ierr); 69*c4762a1bSJed Brown 70*c4762a1bSJed Brown /* 71*c4762a1bSJed Brown We test event logging imbalance 72*c4762a1bSJed Brown */ 73*c4762a1bSJed Brown ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr); 74*c4762a1bSJed Brown if (!rank) {ierr = PetscSleep(0.5);CHKERRQ(ierr);} 75*c4762a1bSJed Brown ierr = PetscLogEventSync(USER_EVENT,PETSC_COMM_WORLD);CHKERRQ(ierr); 76*c4762a1bSJed Brown ierr = PetscLogEventBegin(USER_EVENT,0,0,0,0);CHKERRQ(ierr); 77*c4762a1bSJed Brown ierr = MPI_Barrier(PETSC_COMM_WORLD);CHKERRQ(ierr); 78*c4762a1bSJed Brown ierr = PetscSleep(0.5);CHKERRQ(ierr); 79*c4762a1bSJed Brown ierr = PetscLogEventEnd(USER_EVENT,0,0,0,0);CHKERRQ(ierr); 80*c4762a1bSJed Brown 81*c4762a1bSJed Brown ierr = PetscFinalize(); 82*c4762a1bSJed Brown return ierr; 83*c4762a1bSJed Brown } 84*c4762a1bSJed Brown 85*c4762a1bSJed Brown 86*c4762a1bSJed Brown 87*c4762a1bSJed Brown /*TEST 88*c4762a1bSJed Brown 89*c4762a1bSJed Brown build: 90*c4762a1bSJed Brown requires: define(PETSC_USE_LOG) 91*c4762a1bSJed Brown 92*c4762a1bSJed Brown test: 93*c4762a1bSJed Brown 94*c4762a1bSJed Brown TEST*/ 95