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