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