1 static char help[] = "Augmenting PETSc profiling by add events.\n\ 2 Run this program with one of the\n\ 3 following options to generate logging information: -log, -log_view,\n\ 4 -log_all. The PETSc routines automatically log event times and flops,\n\ 5 so this monitoring is intended solely for users to employ in application\n\ 6 codes.\n\n"; 7 8 /* 9 Include "petscsys.h" so that we can use PETSc profiling routines. 10 */ 11 #include <petscsys.h> 12 #include <petscviewer.h> 13 14 int main(int argc, char **argv) 15 { 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 (void)icount; 39 PetscCall(PetscLogFlops(imax)); 40 PetscCall(PetscSleep(0.5)); 41 PetscCall(PetscLogEventEnd(USER_EVENT, 0, 0, 0, 0)); 42 43 /* 44 We disable the logging of an event. 45 46 */ 47 PetscCall(PetscLogEventDeactivate(USER_EVENT)); 48 PetscCall(PetscLogEventBegin(USER_EVENT, 0, 0, 0, 0)); 49 PetscCall(PetscSleep(0.5)); 50 PetscCall(PetscLogEventEnd(USER_EVENT, 0, 0, 0, 0)); 51 52 /* 53 We next enable the logging of an event 54 */ 55 PetscCall(PetscLogEventActivate(USER_EVENT)); 56 PetscCall(PetscLogEventBegin(USER_EVENT, 0, 0, 0, 0)); 57 PetscCall(PetscSleep(0.5)); 58 PetscCall(PetscLogEventEnd(USER_EVENT, 0, 0, 0, 0)); 59 60 /* 61 We test event logging imbalance 62 */ 63 PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank)); 64 if (rank == 0) PetscCall(PetscSleep(0.5)); 65 PetscCall(PetscLogEventSync(USER_EVENT, PETSC_COMM_WORLD)); 66 PetscCall(PetscLogEventBegin(USER_EVENT, 0, 0, 0, 0)); 67 PetscCallMPI(MPI_Barrier(PETSC_COMM_WORLD)); 68 PetscCall(PetscSleep(0.5)); 69 PetscCall(PetscLogEventEnd(USER_EVENT, 0, 0, 0, 0)); 70 71 PetscCall(PetscFinalize()); 72 return 0; 73 } 74 75 /*TEST 76 77 build: 78 requires: defined(PETSC_USE_LOG) 79 80 test: 81 output_file: output/empty.out 82 83 TEST*/ 84