1 #include "dsdpsys.h"
2 #include <stdio.h>
3 #include <stdlib.h>
4 
5 #define DSDP_MAX_EVENT_NAME_LENGTH 50
6 #define DSDP_MAX_EVENTS            30
7 
8 /*! \file dsdplog.c
9 \brief Profile the performance of DSDP
10 
11 */
12 FILE *dsdpoutputfile;
13 
14 typedef struct {
15   int counter;
16   double begintime;
17   double totaltime;
18   char ename[DSDP_MAX_EVENT_NAME_LENGTH];
19 } EventInfo;
20 
21 
22 typedef struct{
23   EventInfo event[DSDP_MAX_EVENTS];
24   int nevents;
25   int neventsmax;
26   double time0;
27 } EventLog;
28 
29 static EventLog eventlog;
30 
31 
32 #undef __FUNCT__
33 #define __FUNCT__ "DSDPEventLogBegin"
DSDPEventLogBegin(int eventid)34 int DSDPEventLogBegin(int eventid){
35   double tt;
36   DSDPTime(&tt);
37   if (eventid<=0){return 0;}
38   if (eventlog.event[eventid].begintime!=0 && eventid!=DSDP_MAX_EVENTS-1){
39     DSDPPrintf("Timing error: id: %d %s.  Call begin without calling end.%4.4e\n",eventid,eventlog.event[eventid].ename,eventlog.event[eventid].begintime);
40   };
41   eventlog.event[eventid].begintime=tt;
42   eventlog.event[eventid].counter++;
43   return 0;
44 }
45 
46 #undef __FUNCT__
47 #define __FUNCT__ "DSDPEventLogEnd"
DSDPEventLogEnd(int eventid)48 int DSDPEventLogEnd(int eventid){
49   double tt;
50   DSDPTime(&tt);
51   if (eventid<=0){return 0;}
52   tt=tt-eventlog.event[eventid].begintime;
53   eventlog.event[eventid].totaltime+=tt;
54   eventlog.event[eventid].begintime=0;
55   return 0;
56 }
57 
58 #undef __FUNCT__
59 #define __FUNCT__ "DSDPEventLogRegister"
DSDPEventLogRegister(const char * ename,int * eventid)60 int DSDPEventLogRegister(const char *ename, int *eventid){
61   int id;
62   id=eventlog.nevents;
63   if (id<0 || id>=DSDP_MAX_EVENTS){ *eventid=DSDP_MAX_EVENTS-1;return 0;}
64   eventlog.event[id].begintime=0;
65   eventlog.event[id].totaltime=0;
66   eventlog.event[id].counter=0;
67   strncpy(eventlog.event[id].ename,ename,DSDP_MAX_EVENT_NAME_LENGTH-1);
68   eventlog.nevents++;
69   *eventid=id;
70   return 0;
71 }
72 
73 #undef __FUNCT__
74 #define __FUNCT__ "DSDPEventLogInitialize"
DSDPEventLogInitialize(void)75 int DSDPEventLogInitialize(void){
76   int i;
77   double t0;
78   DSDPTime(&t0);
79   eventlog.time0=t0;
80   for (i=0;i<DSDP_MAX_EVENTS;i++){
81     eventlog.event[i].begintime=0;
82     eventlog.event[i].totaltime=0;
83     eventlog.event[i].counter=0;
84     strncpy(eventlog.event[i].ename,"",DSDP_MAX_EVENT_NAME_LENGTH-1);
85   }
86   eventlog.nevents=1;
87   return 0;
88 }
89 
90 #undef __FUNCT__
91 #define __FUNCT__ "DSDPEventLogSummary"
DSDPEventLogSummary(void)92 int DSDPEventLogSummary(void){
93   int i;
94   double etime,ttime,tfinal;
95   DSDPTime(&tfinal);
96   if (tfinal==0){
97     DSDPPrintf("DSDP Timing is not turned on.  Check installation and recompile. \n\n");
98   }
99   ttime=tfinal-eventlog.time0;
100   /*  DSDPMemoryLog(); */
101   DSDPPrintf("PERFORMANCE SUMMARY\n");
102   DSDPPrintf("                     Event                      Calls    Time(s)   Time(%%)\n");
103   DSDPPrintf("--------------------------------------------------------------------------\n");
104   for (i=1;i<eventlog.nevents;i++){
105     etime=eventlog.event[i].totaltime;
106     if (etime==0 || eventlog.event[i].counter==0) continue;
107     DSDPPrintf(" %40s   %9d   %4.4e  %5.2f\n",eventlog.event[i].ename,eventlog.event[i].counter,etime,100*etime/ttime);
108   }
109   DSDPPrintf("--------------------------------------------------------------------------\n");
110 
111   if (dsdpoutputfile){
112     fprintf(dsdpoutputfile,"PERFORMANCE SUMMARY\n");
113     fprintf(dsdpoutputfile,"                     Event                      Calls    Time(s)   Time(%%)\n");
114     fprintf(dsdpoutputfile,"--------------------------------------------------------------------------\n");
115     for (i=1;i<eventlog.nevents;i++){
116       etime=eventlog.event[i].totaltime;
117       if (etime==0 || eventlog.event[i].counter==0) continue;
118       fprintf(dsdpoutputfile," %40s   %9d   %4.4e  %5.2f\n",eventlog.event[i].ename,eventlog.event[i].counter,etime,100*etime/ttime);
119     }
120     fprintf(dsdpoutputfile,"--------------------------------------------------------------------------\n");
121   }
122   fflush(NULL);
123   return 0;
124 }
125 
126