DSDP
|
00001 #include "dsdpsys.h" 00002 #include <stdio.h> 00003 #include <stdlib.h> 00004 00005 #define DSDP_MAX_EVENT_NAME_LENGTH 50 00006 #define DSDP_MAX_EVENTS 30 00007 00012 FILE *dsdpoutputfile; 00013 00014 typedef struct { 00015 int counter; 00016 double begintime; 00017 double totaltime; 00018 char ename[DSDP_MAX_EVENT_NAME_LENGTH]; 00019 } EventInfo; 00020 00021 00022 typedef struct{ 00023 EventInfo event[DSDP_MAX_EVENTS]; 00024 int nevents; 00025 int neventsmax; 00026 double time0; 00027 } EventLog; 00028 00029 static EventLog eventlog; 00030 00031 00032 #undef __FUNCT__ 00033 #define __FUNCT__ "DSDPEventLogBegin" 00034 int DSDPEventLogBegin(int eventid){ 00035 double tt; 00036 DSDPTime(&tt); 00037 if (eventid<=0){return 0;} 00038 if (eventlog.event[eventid].begintime!=0 && eventid!=DSDP_MAX_EVENTS-1){ 00039 DSDPPrintf("Timing error: id: %d %s. Call begin without calling end.%4.4e\n",eventid,eventlog.event[eventid].ename,eventlog.event[eventid].begintime); 00040 }; 00041 eventlog.event[eventid].begintime=tt; 00042 eventlog.event[eventid].counter++; 00043 return 0; 00044 } 00045 00046 #undef __FUNCT__ 00047 #define __FUNCT__ "DSDPEventLogEnd" 00048 int DSDPEventLogEnd(int eventid){ 00049 double tt; 00050 DSDPTime(&tt); 00051 if (eventid<=0){return 0;} 00052 tt=tt-eventlog.event[eventid].begintime; 00053 eventlog.event[eventid].totaltime+=tt; 00054 eventlog.event[eventid].begintime=0; 00055 return 0; 00056 } 00057 00058 #undef __FUNCT__ 00059 #define __FUNCT__ "DSDPEventLogRegister" 00060 int DSDPEventLogRegister(const char *ename, int *eventid){ 00061 int id; 00062 id=eventlog.nevents; 00063 if (id<0 || id>=DSDP_MAX_EVENTS){ *eventid=DSDP_MAX_EVENTS-1;return 0;} 00064 eventlog.event[id].begintime=0; 00065 eventlog.event[id].totaltime=0; 00066 eventlog.event[id].counter=0; 00067 strncpy(eventlog.event[id].ename,ename,DSDP_MAX_EVENT_NAME_LENGTH-1); 00068 eventlog.nevents++; 00069 *eventid=id; 00070 return 0; 00071 } 00072 00073 #undef __FUNCT__ 00074 #define __FUNCT__ "DSDPEventLogInitialize" 00075 int DSDPEventLogInitialize(void){ 00076 int i; 00077 double t0; 00078 DSDPTime(&t0); 00079 eventlog.time0=t0; 00080 for (i=0;i<DSDP_MAX_EVENTS;i++){ 00081 eventlog.event[i].begintime=0; 00082 eventlog.event[i].totaltime=0; 00083 eventlog.event[i].counter=0; 00084 strncpy(eventlog.event[i].ename,"",DSDP_MAX_EVENT_NAME_LENGTH-1); 00085 } 00086 eventlog.nevents=1; 00087 return 0; 00088 } 00089 00090 #undef __FUNCT__ 00091 #define __FUNCT__ "DSDPEventLogSummary" 00092 int DSDPEventLogSummary(void){ 00093 int i; 00094 double etime,ttime,tfinal; 00095 DSDPTime(&tfinal); 00096 if (tfinal==0){ 00097 DSDPPrintf("DSDP Timing is not turned on. Check installation and recompile. \n\n"); 00098 } 00099 ttime=tfinal-eventlog.time0; 00100 /* DSDPMemoryLog(); */ 00101 DSDPPrintf("PERFORMANCE SUMMARY\n"); 00102 DSDPPrintf(" Event Calls Time(s) Time(%%)\n"); 00103 DSDPPrintf("--------------------------------------------------------------------------\n"); 00104 for (i=1;i<eventlog.nevents;i++){ 00105 etime=eventlog.event[i].totaltime; 00106 if (etime==0 || eventlog.event[i].counter==0) continue; 00107 DSDPPrintf(" %40s %9d %4.4e %5.2f\n",eventlog.event[i].ename,eventlog.event[i].counter,etime,100*etime/ttime); 00108 } 00109 DSDPPrintf("--------------------------------------------------------------------------\n"); 00110 00111 if (dsdpoutputfile){ 00112 fprintf(dsdpoutputfile,"PERFORMANCE SUMMARY\n"); 00113 fprintf(dsdpoutputfile," Event Calls Time(s) Time(%%)\n"); 00114 fprintf(dsdpoutputfile,"--------------------------------------------------------------------------\n"); 00115 for (i=1;i<eventlog.nevents;i++){ 00116 etime=eventlog.event[i].totaltime; 00117 if (etime==0 || eventlog.event[i].counter==0) continue; 00118 fprintf(dsdpoutputfile," %40s %9d %4.4e %5.2f\n",eventlog.event[i].ename,eventlog.event[i].counter,etime,100*etime/ttime); 00119 } 00120 fprintf(dsdpoutputfile,"--------------------------------------------------------------------------\n"); 00121 } 00122 fflush(NULL); 00123 return 0; 00124 } 00125