Changeset d13e27 for src/base/timer.cpp
- Timestamp:
- Mar 29, 2013, 5:03:13 PM (13 years ago)
- Children:
- f57182
- Parents:
- 5ba22b
- File:
-
- 1 edited
-
src/base/timer.cpp (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/base/timer.cpp
r5ba22b rd13e27 52 52 std::map<std::string, TimerData> Timer::td; 53 53 54 void Timer::Start(std::string event)55 {56 #ifdef HAVE_MPI57 #ifdef DEBUG_MEASURE_TIME58 std::map<std::string, TimerData>::iterator iter = td.find(event);59 if (iter == td.end())60 iter = td.insert(std::make_pair(event, TimerData())).first;61 62 iter->second.time_start = MPI_Wtime();63 #endif64 #endif65 }66 67 void Timer::Stop(std::string event)68 {69 #ifdef HAVE_MPI70 #ifdef DEBUG_MEASURE_TIME71 double time_end = MPI_Wtime();72 73 std::map<std::string, TimerData>::iterator iter = td.find(event);74 75 if (time_end - iter->second.time_start < std::numeric_limits<double>::min())76 ++(iter->second.warning);77 78 ++(iter->second.total);79 80 iter->second.duration += time_end - iter->second.time_start;81 #endif82 #endif83 }84 85 void Timer::Clear()86 {87 td.clear();88 }89 90 pugi::xml_node Timer::ToXMLNode()91 {92 std::map<std::string, TimerData>::iterator iter;93 94 pugi::xml_node node_process;95 node_process.append_attribute("Rank").set_value(MG::GetComm()->GlobalRank());96 97 pugi::xml_node node_timings = node_process.append_child("Timings");98 99 for (iter=Timer::td.begin(); iter!=Timer::td.end(); ++iter) {100 101 pugi::xml_node node_entry = node_timings.append_child("Sample");102 node_entry.append_attribute("Name").set_value(Helper::ToString(iter->first).c_str());103 104 node_entry.append_child("Duration")105 .append_child(pugi::node_pcdata)106 .set_value(Helper::ToString(iter->second.duration).c_str());107 108 node_entry.append_child("Warnings")109 .append_child(pugi::node_pcdata)110 .set_value(Helper::ToString(iter->second.warning).c_str());111 112 node_entry.append_child("Total")113 .append_child(pugi::node_pcdata)114 .set_value(Helper::ToString(iter->second.total).c_str());115 116 }117 118 return node_process;119 }120 121 std::string Timer::ToString()122 {123 pugi::xml_node node = Timer::ToXMLNode();124 std::stringstream str;125 node.print(str);126 return str.str();127 }128 129 void Timer::Print()130 {131 #ifdef DEBUG_MEASURE_TIME132 std::map<std::string, TimerData>::const_iterator iter;133 Comm& comm = *MG::GetComm();134 135 if (comm.GlobalRank() == 0) {136 comm.PrintStringOnce("Running times:");137 for (iter=Timer::td.begin(); iter!=Timer::td.end(); ++iter)138 comm.PrintStringOnce(" %s: %e s (%d)", iter->first.c_str(), iter->second.duration, iter->second.total);139 }140 #endif141 }142 143 54 template <class T> 144 55 static T min(T* data, int num_data, int& at_rank) … … 179 90 } 180 91 92 void Timer::Start(std::string event) 93 { 94 #ifdef HAVE_MPI 95 #ifdef OUTPUT_TIMING 96 std::map<std::string, TimerData>::iterator iter = td.find(event); 97 if (iter == td.end()) 98 iter = td.insert(std::make_pair(event, TimerData())).first; 99 100 iter->second.time_start = MPI_Wtime(); 101 #endif 102 #endif 103 } 104 105 void Timer::Stop(std::string event) 106 { 107 #ifdef HAVE_MPI 108 #ifdef OUTPUT_TIMING 109 double time_end = MPI_Wtime(); 110 111 std::map<std::string, TimerData>::iterator iter = td.find(event); 112 113 if (time_end - iter->second.time_start < std::numeric_limits<double>::min()) 114 ++(iter->second.warning); 115 116 ++(iter->second.total); 117 118 iter->second.duration += time_end - iter->second.time_start; 119 #endif 120 #endif 121 } 122 123 void Timer::Clear() 124 { 125 td.clear(); 126 } 127 128 pugi::xml_node Timer::ToXMLNode() 129 { 130 std::map<std::string, TimerData>::iterator iter; 131 132 pugi::xml_node node_process; 133 node_process.append_attribute("Rank").set_value(MG::GetComm()->GlobalRank()); 134 135 pugi::xml_node node_timings = node_process.append_child("Timings"); 136 137 for (iter=Timer::td.begin(); iter!=Timer::td.end(); ++iter) { 138 139 pugi::xml_node node_entry = node_timings.append_child("Sample"); 140 node_entry.append_attribute("Name").set_value(Helper::ToString(iter->first).c_str()); 141 142 node_entry.append_child("Duration") 143 .append_child(pugi::node_pcdata) 144 .set_value(Helper::ToString(iter->second.duration).c_str()); 145 146 node_entry.append_child("Warnings") 147 .append_child(pugi::node_pcdata) 148 .set_value(Helper::ToString(iter->second.warning).c_str()); 149 150 node_entry.append_child("Total") 151 .append_child(pugi::node_pcdata) 152 .set_value(Helper::ToString(iter->second.total).c_str()); 153 154 } 155 156 return node_process; 157 } 158 159 std::string Timer::ToString() 160 { 161 pugi::xml_node node = Timer::ToXMLNode(); 162 std::stringstream str; 163 node.print(str); 164 return str.str(); 165 } 166 167 void Timer::Print() 168 { 169 #ifdef OUTPUT_TIMING 170 Comm& comm = *MG::GetComm(); 171 if (comm.GlobalRank() == 0) { 172 std::map<std::string, TimerData>::const_iterator iter; 173 comm.PrintOnce(Timing, "Running times:"); 174 for (iter=Timer::td.begin(); iter!=Timer::td.end(); ++iter) 175 comm.PrintOnce(Timing, " %s: %e s (%d)", iter->first.c_str(), iter->second.duration, iter->second.total); 176 } 177 #endif 178 } 181 179 void Timer::PrintGlobal() 182 180 { 183 #ifdef DEBUG_MEASURE_TIME181 #ifdef OUTPUT_TIMING 184 182 std::map<std::string, TimerData>::const_iterator iter; 185 183 Comm& comm = *MG::GetComm(); … … 192 190 int calls[size]; 193 191 194 comm.Print StringOnce("Running times (global):");192 comm.PrintOnce(Timing, "Running times (global):"); 195 193 196 194 int timer_size = Timer::td.size(); … … 216 214 avg_calls = avg(calls, size); 217 215 218 comm.Print StringOnce(" %s: %e s (%d)", iter->first.c_str(), iter->second.duration, iter->second.total);219 comm.Print StringOnce(" Min: %e s @ %d", min_duration, rank_min_duration);220 comm.Print StringOnce(" Max: %e s @ %d", max_duration, rank_max_duration);221 comm.Print StringOnce(" Avg: %e s", avg_duration);222 comm.Print StringOnce(" Min calls: %d @ %d", min_calls, rank_min_calls);223 comm.Print StringOnce(" Max calls: %d @ %d", max_calls, rank_max_calls);224 comm.Print StringOnce(" Avg calls: %f", avg_calls);216 comm.PrintOnce(Timing, " %s: %e s (%d)", iter->first.c_str(), iter->second.duration, iter->second.total); 217 comm.PrintOnce(Timing, " Min: %e s @ %d", min_duration, rank_min_duration); 218 comm.PrintOnce(Timing, " Max: %e s @ %d", max_duration, rank_max_duration); 219 comm.PrintOnce(Timing, " Avg: %e s", avg_duration); 220 comm.PrintOnce(Timing, " Min calls: %d @ %d", min_calls, rank_min_calls); 221 comm.PrintOnce(Timing, " Max calls: %d @ %d", max_calls, rank_max_calls); 222 comm.PrintOnce(Timing, " Avg calls: %f", avg_calls); 225 223 } 226 224 }else {
Note:
See TracChangeset
for help on using the changeset viewer.
