Actual source code: ex3.c

      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";

      8: /*
      9:   Include "petscsys.h" so that we can use PETSc profiling routines.
     10: */
     11: #include <petscsys.h>
     12: #include <petscviewer.h>

     14: int main(int argc, char **argv)
     15: {
     16:   PetscMPIInt   rank;
     17:   int           i, imax = 10000, icount;
     18:   PetscLogEvent USER_EVENT, check_USER_EVENT;

     20:   PetscFunctionBeginUser;
     21:   PetscCall(PetscInitialize(&argc, &argv, NULL, help));

     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");

     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));

     43:   /*
     44:      We disable the logging of an event.

     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));

     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));

     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));

     71:   PetscCall(PetscFinalize());
     72:   return 0;
     73: }

     75: /*TEST

     77:    build:
     78:      requires: defined(PETSC_USE_LOG)

     80:    test:
     81:      output_file: output/empty.out

     83: TEST*/