Changeset 894a5f for src/base/timer.cpp
- Timestamp:
- Feb 2, 2012, 1:58:12 PM (14 years ago)
- Children:
- 32ff22
- Parents:
- 01be70
- File:
-
- 1 edited
-
src/base/timer.cpp (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
src/base/timer.cpp
r01be70 r894a5f 114 114 comm.PrintStringOnce("Running times:"); 115 115 for (iter=Timer::td.begin(); iter!=Timer::td.end(); ++iter) 116 comm.PrintStringOnce(" %s: %e s", iter->first.c_str(), iter->second.duration);116 comm.PrintStringOnce(" %s: %e s (%d)", iter->first.c_str(), iter->second.duration, iter->second.total); 117 117 } 118 118 #endif 119 119 } 120 120 121 template <class T> 122 static T min(T* data, int num_data, int& at_rank) 123 { 124 at_rank = 0; 125 T min = data[0]; 126 127 for (int i=1; i<num_data; ++i) 128 if (data[i] < min) { 129 at_rank = i; 130 min = data[i]; 131 } 132 return min; 133 } 134 135 template <class T> 136 static T max(T* data, int num_data, int& at_rank) 137 { 138 at_rank = 0; 139 T max = data[0]; 140 141 for (int i=1; i<num_data; ++i) 142 if (data[i] > max) { 143 at_rank = i; 144 max = data[i]; 145 } 146 return max; 147 } 148 149 template <class T> 150 static vmg_float avg(T* data, int num_data) 151 { 152 vmg_float average = 0.0; 153 vmg_float num_data_inv = 1.0 / static_cast<vmg_float>(num_data); 154 for (int i=0; i<num_data; ++i) 155 average += data[i] * num_data_inv; 156 return average; 157 } 158 159 void Timer::PrintGlobal() 160 { 161 #ifdef DEBUG_MEASURE_TIME 162 std::map<std::string, TimerData>::const_iterator iter; 163 Comm& comm = *MG::GetComm(); 164 char name[80]; 165 int rank, size; 166 167 MPI_Comm_rank(MPI_COMM_WORLD, &rank); 168 MPI_Comm_size(MPI_COMM_WORLD, &size); 169 170 vmg_float times[size]; 171 int calls[size]; 172 173 comm.PrintStringOnce("Running times (global):"); 174 175 for (iter=Timer::td.begin(); iter!=Timer::td.end(); ++iter) { 176 std::strcpy(name, iter->first.c_str()); 177 MPI_Bcast(name, 80, MPI_CHAR, 0, MPI_COMM_WORLD); 178 MPI_Gather(&Timer::td[name].duration, 1, MPI_DOUBLE, times, 1, MPI_DOUBLE, 0, MPI_COMM_WORLD); 179 MPI_Gather(&Timer::td[name].total, 1, MPI_INT, calls, 1, MPI_INT, 0, MPI_COMM_WORLD); 180 181 if (rank == 0) { 182 int min_calls, max_calls, avg_calls; 183 vmg_float min_duration, max_duration, avg_duration; 184 int rank_min_calls, rank_max_calls, rank_min_duration, rank_max_duration; 185 186 min_duration = min(times, size, rank_min_duration); 187 max_duration = max(times, size, rank_max_duration); 188 avg_duration = avg(times, size); 189 min_calls = min(calls, size, rank_min_calls); 190 max_calls = max(calls, size, rank_max_calls); 191 avg_calls = avg(calls, size); 192 193 comm.PrintStringOnce(" %s: %e s (%d)", iter->first.c_str(), iter->second.duration, iter->second.total); 194 comm.PrintStringOnce(" Min: %e s @ %d", min_duration, rank_min_duration); 195 comm.PrintStringOnce(" Max: %e s @ %d", max_duration, rank_max_duration); 196 comm.PrintStringOnce(" Avg: %e s", avg_duration); 197 comm.PrintStringOnce(" Min calls: %d @ %d", min_calls, rank_min_calls); 198 comm.PrintStringOnce(" Max calls: %d @ %d", max_calls, rank_max_calls); 199 comm.PrintStringOnce(" Avg calls: %f", avg_calls); 200 } 201 } 202 203 #endif 204 } 205 121 206 std::ostream& VMG::operator<<(std::ostream& out, const Timer&) 122 207 {
Note:
See TracChangeset
for help on using the changeset viewer.
