DSDP
dsdplog.c
Go to the documentation of this file.
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 
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"
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"
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"
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"
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"
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 
Error handling, printing, and profiling.