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 /* 10 Include "petscsys.h" so that we can use PETSc profiling routines. 11 */ 12 #include <petscsys.h> 13 #include <petscviewer.h> 14 15 int main(int argc, char **argv) { 16 PetscMPIInt rank; 17 int i, imax = 10000, icount; 18 PetscLogEvent USER_EVENT, check_USER_EVENT; 19 20 PetscFunctionBeginUser; 21 PetscCall(PetscInitialize(&argc, &argv, NULL, help)); 22 23 /* 24 Create a new user-defined event. 25 - Note that PetscLogEventRegister() returns to the user a unique 26 integer event number, which should then be used for profiling 27 the event via PetscLogEventBegin() and PetscLogEventEnd(). 28 - The user can also optionally log floating point operations 29 with the routine PetscLogFlops(). 30 */ 31 PetscCall(PetscLogEventRegister("User event", PETSC_VIEWER_CLASSID, &USER_EVENT)); 32 PetscCall(PetscLogEventGetId("User event", &check_USER_EVENT)); 33 PetscCheck(USER_EVENT == check_USER_EVENT, PETSC_COMM_SELF, PETSC_ERR_PLIB, "Event Ids do not match"); 34 35 PetscCall(PetscLogEventBegin(USER_EVENT, 0, 0, 0, 0)); 36 icount = 0; 37 for (i = 0; i < imax; i++) icount++; 38 PetscCall(PetscLogFlops(imax)); 39 PetscCall(PetscSleep(0.5)); 40 PetscCall(PetscLogEventEnd(USER_EVENT, 0, 0, 0, 0)); 41 42 /* 43 We disable the logging of an event. 44 45 */ 46 PetscCall(PetscLogEventDeactivate(USER_EVENT)); 47 PetscCall(PetscLogEventBegin(USER_EVENT, 0, 0, 0, 0)); 48 PetscCall(PetscSleep(0.5)); 49 PetscCall(PetscLogEventEnd(USER_EVENT, 0, 0, 0, 0)); 50 51 /* 52 We next enable the logging of an event 53 */ 54 PetscCall(PetscLogEventActivate(USER_EVENT)); 55 PetscCall(PetscLogEventBegin(USER_EVENT, 0, 0, 0, 0)); 56 PetscCall(PetscSleep(0.5)); 57 PetscCall(PetscLogEventEnd(USER_EVENT, 0, 0, 0, 0)); 58 59 /* 60 We test event logging imbalance 61 */ 62 PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank)); 63 if (rank == 0) PetscCall(PetscSleep(0.5)); 64 PetscCall(PetscLogEventSync(USER_EVENT, PETSC_COMM_WORLD)); 65 PetscCall(PetscLogEventBegin(USER_EVENT, 0, 0, 0, 0)); 66 PetscCallMPI(MPI_Barrier(PETSC_COMM_WORLD)); 67 PetscCall(PetscSleep(0.5)); 68 PetscCall(PetscLogEventEnd(USER_EVENT, 0, 0, 0, 0)); 69 70 PetscCall(PetscFinalize()); 71 return 0; 72 } 73 74 /*TEST 75 76 build: 77 requires: defined(PETSC_USE_LOG) 78 79 test: 80 81 TEST*/ 82