24 static double get_time_of_day()
26 struct timeval time_val;
27 struct timezone time_zone;
28 gettimeofday(&time_val, &time_zone);
29 return (
double)(time_val.tv_sec) + (
double)(time_val.tv_usec) / 1000000.0;
53 eventStartCore[thread_rank][eventNumCore[thread_rank]] = get_time_of_day();
66 eventStopCore [thread_rank][eventNumCore[thread_rank]] = get_time_of_day();
67 eventColorCore[thread_rank][eventNumCore[thread_rank]] = color;
68 eventNumCore[thread_rank]++;
82 MPI_Comm_rank(MPI_COMM_WORLD, &mpi_rank);
83 MPI_Comm_size(MPI_COMM_WORLD, &mpi_size);
88 double max_time = 0.0;
91 eventStopCore [core][eventNumCore[core]-1] -
98 &max_time, &max_time_out, 1, MPI_DOUBLE, MPI_MAX, 0, MPI_COMM_WORLD);
99 double hscale = 2000.0 / max_time_out;
103 if (eventNumCore[core] > 1)
107 &max_core_in, &max_core, 1, MPI_INT, MPI_MAX, 0, MPI_COMM_WORLD);
108 double vscale = 1000.0 / ((max_core+1)*mpi_size);
112 sprintf(trace_file_name,
"trace_%d.svg", (
int)(time(NULL)));
113 FILE *trace_file = fopen(trace_file_name,
"w");
114 assert(trace_file != NULL);
116 "<svg width=\"200mm\" height=\"100mm\" viewBox=\"0 0 2000 1000\">\n"
119 for (proc = 0; proc < mpi_size; proc++) {
124 proc, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
126 &eventStartCore[0][0],
127 SVG_TRACE_MAX_CORES*SVG_TRACE_MAX_EVENTS, MPI_DOUBLE,
128 proc, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
130 &eventStopCore[0][0],
131 SVG_TRACE_MAX_CORES*SVG_TRACE_MAX_EVENTS, MPI_DOUBLE,
132 proc, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
134 &eventColorCore[0][0],
135 SVG_TRACE_MAX_CORES*SVG_TRACE_MAX_EVENTS, MPI_INT,
136 proc, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
139 for (event = 0;
event < eventNumCore[core];
event++) {
140 double start = eventStartCore[core][event] - eventStopCore[0][0];
141 double stop = eventStopCore [core][event] - eventStopCore[0][0];
142 double width = (stop-start) * hscale;
143 int color = eventColorCore[core][event];
144 int thread = proc*(max_core+1)+core;
147 "<rect x=\"%.2lf\" y=\"%.0lf\" width=\"%.2lf\" height=\"%.0lf\" "
148 "fill=\"#%06x\" stroke=\"#%06x\" stroke-width=\"1\"/>\n",
151 width < 2.0 ? 2.0 : width,
154 color < 0 ? color : 0);
167 MPI_INT, 0, 0, MPI_COMM_WORLD);
169 &eventStartCore[0][0],
170 SVG_TRACE_MAX_CORES*SVG_TRACE_MAX_EVENTS,
171 MPI_DOUBLE, 0, 0, MPI_COMM_WORLD);
173 &eventStopCore[0][0],
174 SVG_TRACE_MAX_CORES*SVG_TRACE_MAX_EVENTS,
175 MPI_DOUBLE, 0, 0, MPI_COMM_WORLD);
177 &eventColorCore[0][0],
178 SVG_TRACE_MAX_CORES*SVG_TRACE_MAX_EVENTS,
179 MPI_INT, 0, 0, MPI_COMM_WORLD);
void svg_trace_init(int num_cores)
Initialize tracing.
#define SVG_TRACE_MAX_CORES
maximum values cores per node, events per core, maximum size of trace file name
#define SVG_TRACE_FILE_NAME_SIZE
void svg_trace_start(int thread_rank)
Start tracing an event.
void svg_trace_finish()
Finish tracing. Collect traces from all nodes. Write the combined trace to an SVG file...
void svg_trace_stop(int thread_rank, int color)
Stop tracing an event.
#define SVG_TRACE_MAX_EVENTS