xref: /petsc/src/sys/tutorials/ex3.c (revision c4762a1b19cd2af06abeed90e8f9d34fb975dd94)
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