f1a41c7c1deafaab2fab161d891d8a9c8546bfb0
[charm.git] / examples / bigsim / tools / rewritelog / rewritelog.C
1 /*
2    rewritelog.C
3
4    Author: Isaac Dooley
5    email : idooley2@uiuc.edu
6    date  : Jan 06, 2007
7
8    This program will take in a set of bgTrace files from a run
9    of the Big Emulator and it will rewrite the files so that
10    named events can be replaced with better approximate timings
11    supplied interactively by the user of this program. For example
12    a cycle-accurate simulator might be able to give the exact times
13    for some Charm++ entry methods.
14
15    The modified bgTrace files are put into a directory called
16    "newtraces"
17
18    The user supplies durations which are used to change the end
19    times for each log entry with the associated name. Any messages
20    sent during this duration are mapped linearly onto the new times
21    range for the log entry. For example, an message sent one-third
22    the way through the old time range for the event will still occur
23    one-third the way through the new time range.
24
25    Currently nothing else in the trace files is modified.
26
27    This program was written by someone with little experience with
28    the POSE based Big Simulator, so these traces might not quite
29    act as the author expected. Please report any problems to
30    ppl@cs.uiuc.edu
31
32
33 */
34
35
36
37 #include "blue.h"
38 #include "blue_impl.h"
39 #include "blue.h"
40 #include "blue_impl.h"
41 #include "blue_types.h"
42 #include "bigsim_logs.h"
43 #include "assert.h"
44 #include <sys/stat.h>
45 #include <sys/types.h>
46
47 #include <string>
48 #include <iostream>
49 #include <map>
50
51 #define OUTPUTDIR "newtraces/"
52
53
54 int main()
55 {
56     int totalProcs, numX, numY, numZ, numCth, numWth, numPes;
57
58     // Create output directory
59     mkdir(OUTPUTDIR, 0777);
60
61     bool done = false;
62     double newtime=1.0;
63     std::string eventname;
64     std::map<std::string,double> newtimes;
65     std::cout << "Enter event name followed by its new time duration.\nEnter \"none -1.0\" after finishing. Don't use any spaces in names." << std::endl;
66     while(!done) {
67         std::cin >> eventname >> newtime;
68         if(newtime < 0.0)
69             done = 1;
70         else
71             newtimes[eventname]=newtime;
72     }
73
74     std::cout << "You entered " << newtimes.size() << " distinct events with their associated durations" << std::endl;
75
76     // load bg trace summary file
77     printf("Loading bgTrace ... \n");
78     int status = BgLoadTraceSummary("bgTrace", totalProcs, numX, numY, numZ, numCth, numWth, numPes);
79     if (status == -1) exit(1);
80     printf("========= BgLog Version: %d ========= \n", bglog_version);
81     printf("Found %d (%dx%dx%d:%dw-%dc) emulated procs on %d real procs.\n", totalProcs, numX, numY, numZ, numWth, numCth, numPes);
82
83     int* allNodeOffsets = BgLoadOffsets(totalProcs,numPes);
84
85     printf("========= Loading All Logs ========= \n");
86
87     // load each individual trace file for each bg proc
88     for (int procNum=0; procNum<totalProcs; procNum++)
89     {
90         BgTimeLineRec tlinerec;
91
92         int procNum = i;
93         int fileNum = BgReadProc(procNum,numWth,numPes,totalProcs,allNodeOffsets,tlinerec);
94         CmiAssert(fileNum != -1);
95         printf("Load log of BG proc %d from bgTrace%d... \n", procNum, fileNum);
96
97         BgTimeLine &timeLine = tlinerec.timeline; // Really a CkQ< BgTimeLog *>
98
99         printf("%d entries in timeLine\n", timeLine.length());
100
101         // Scan through each event for this emulated processor
102         for(int j=0;j<timeLine.length();j++){
103             BgTimeLog* timeLog = timeLine[j];
104             std::string name(timeLog->name);
105
106             // If name of this event is one that needs to have its duration modified
107             if( newtimes.find(name) != newtimes.end() ) {
108                 double oldstart = timeLog->startTime;
109                 double oldend   = timeLog->endTime;
110                 double newstart = oldstart;
111                 double newend   = oldstart+newtimes[name];
112
113                 timeLog->startTime = newstart;
114                 timeLog->endTime   = newend;
115
116                 printf("Rewriting duration of event %d name=%s from [%.10lf , %.10lf] to [%.10lf , %.10lf]\n", j, timeLog->name, oldstart,oldend,newstart,newend);
117
118                 for(int m=0;m<timeLog->msgs.length();m++){
119                     double oldsendtime = timeLog->msgs[m]->sendTime;
120                     double newsendtime;
121
122                     if(oldstart == oldend){
123                         newsendtime = oldstart;
124                     } else {
125                         // Linearly map the old range onto the new range
126                         newsendtime = newstart + (oldsendtime-oldstart)/(oldend-oldstart) * (newend-newstart);
127                     }
128
129                     timeLog->msgs[m]->sendTime = newsendtime;
130                     printf("changing message %d send time from %.10lf to %.10lf\n", m, oldsendtime, newsendtime);
131                 }
132
133             }
134
135         }
136
137         BgWriteTimelines(procNum, tlinerec, 1, numWth, OUTPUTDIR);
138
139     }
140
141     BgWriteTraceSummary(totalProcs, 1, numX, numY, numZ, numCth, numWth, OUTPUTDIR);
142
143     delete [] allNodeOffsets;
144     printf("End of program\n");
145 }
146
147