From 52c57c5fcee43db61f718664a2b87e3fb3b54bc0 Mon Sep 17 00:00:00 2001 From: Ian Hinder Date: Fri, 26 Oct 2012 01:00:07 +0200 Subject: Add a timer tree for measuring time spent in each Carpet mode * This can be used for determining which mode, or which refinement level or map, is taking up a lot of time in a simulation * Add parameters to control whether local mode and each map are timed * Time the transitions between modes --- Carpet/Carpet/param.ccl | 8 +++ Carpet/Carpet/src/CarpetStartup.cc | 4 ++ Carpet/Carpet/src/Evolve.cc | 1 + Carpet/Carpet/src/modes.cc | 106 ++++++++++++++++++++++++++++++++++++- Carpet/Carpet/src/variables.cc | 2 + Carpet/Carpet/src/variables.hh | 2 + 6 files changed, 121 insertions(+), 2 deletions(-) diff --git a/Carpet/Carpet/param.ccl b/Carpet/Carpet/param.ccl index ae45d2c41..cfda801a2 100644 --- a/Carpet/Carpet/param.ccl +++ b/Carpet/Carpet/param.ccl @@ -426,6 +426,14 @@ BOOLEAN output_xml_timer_tree "Output timing information in tree form as XML" ST { } "no" +BOOLEAN include_maps_in_mode_timer_tree "Include a breakdown of time spent on different multipatch maps in the mode timer tree" STEERABLE=always +{ +} "no" + +BOOLEAN include_local_mode_in_mode_timer_tree "Include a node for the time spent in local mode in the mode timer tree" STEERABLE=always +{ +} "no" + CCTK_REAL timer_tree_threshold_percentage "The percentage of the root timer below which timers are omitted" STEERABLE=always { 0:* :: "" diff --git a/Carpet/Carpet/src/CarpetStartup.cc b/Carpet/Carpet/src/CarpetStartup.cc index caa7bd96a..96d061f50 100644 --- a/Carpet/Carpet/src/CarpetStartup.cc +++ b/Carpet/Carpet/src/CarpetStartup.cc @@ -70,6 +70,10 @@ namespace Carpet { main_timer_tree.current = 0; // No timer has been started yet main_timer_tree.root->start(); + mode_timer_tree.root = new TimerNode(&mode_timer_tree,"meta mode"); + mode_timer_tree.current = 0; // No timer has been started yet + mode_timer_tree.root->start(); + return 0; } diff --git a/Carpet/Carpet/src/Evolve.cc b/Carpet/Carpet/src/Evolve.cc index aa51efe23..2d1541f72 100644 --- a/Carpet/Carpet/src/Evolve.cc +++ b/Carpet/Carpet/src/Evolve.cc @@ -99,6 +99,7 @@ namespace Carpet { { TimerNode *et = main_timer_tree.root->getChildTimer("Evolve"); et->print(cout, et->getTime(), 0, timer_tree_threshold_percentage, timer_tree_output_precision); + mode_timer_tree.root->print(cout, mode_timer_tree.root->getTime(), 0, timer_tree_threshold_percentage, timer_tree_output_precision); } timer.stop(); } diff --git a/Carpet/Carpet/src/modes.cc b/Carpet/Carpet/src/modes.cc index 88404984b..84b58b349 100644 --- a/Carpet/Carpet/src/modes.cc +++ b/Carpet/Carpet/src/modes.cc @@ -14,7 +14,7 @@ #include - +#include "Timers.hh" namespace Carpet { @@ -84,6 +84,9 @@ namespace Carpet { assert (ml>=0 and mlcctk_delta_time = 0.0; @@ -272,6 +293,8 @@ namespace Carpet { mglevel = -1; mglevelfact = -deadbeef; cctkGH->cctk_convlevel = -deadbeef; + + ftimer.stop(); assert (is_meta_mode()); } @@ -288,6 +311,9 @@ namespace Carpet { assert (rl>=0 and rlcctk_mode = CCTK_MODE_LEVEL; @@ -321,6 +347,13 @@ namespace Carpet { } else { tt->set_time (mglevel, reflevel, timelevel, cctkGH->cctk_time); } + + ftimer.stop(); + + ostringstream mode_s; + mode_s << "level(" << rl << ")"; + Timer timer(mode_s.str(), &mode_timer_tree); + timer.start(); assert (is_level_mode()); } @@ -334,7 +367,18 @@ namespace Carpet { if (reflevel == -1) return; // early return Checkpoint ("Leaving level mode"); - + + if (mode_timer_tree.current != mode_timer_tree.root) + { + ostringstream mode_s; + mode_s << "level(" << reflevel << ")"; + Timer timer(mode_s.str(), &mode_timer_tree); + timer.stop(); + } + + Timer ftimer("leave_level_mode", &mode_timer_tree); + ftimer.start(); + CCTK_INT const deadbeef = get_deadbeef(); // Save and unset current time @@ -373,6 +417,8 @@ namespace Carpet { ivect_ref(cctkGH->cctk_levfac) = spacereflevelfact; cctkGH->cctk_timefac = timereflevelfact; + ftimer.stop(); + assert (is_global_mode()); } @@ -383,6 +429,8 @@ namespace Carpet { void enter_singlemap_mode (cGH * const cctkGH, int const m, int const grouptype) { + DECLARE_CCTK_PARAMETERS + assert (is_level_mode()); assert (mc_grouptype == -1); assert (m>=0 and mcctk_mode = CCTK_MODE_SINGLEMAP; @@ -432,6 +483,16 @@ namespace Carpet { } // if mc_grouptype + ftimer.stop(); + + if (include_maps_in_mode_timer_tree) + { + ostringstream mode_s; + mode_s << "map(" << map << ")"; + Timer timer(mode_s.str(), &mode_timer_tree); + timer.start(); + } + assert (is_singlemap_mode()); } @@ -445,6 +506,17 @@ namespace Carpet { Checkpoint ("Leaving singlemap mode"); + if (mode_timer_tree.current != mode_timer_tree.root && include_maps_in_mode_timer_tree) + { + ostringstream mode_s; + mode_s << "map(" << map << ")"; + Timer timer(mode_s.str(), &mode_timer_tree); + timer.stop(); + } + + Timer ftimer("leave_singlemap_mode", &mode_timer_tree); + ftimer.start(); + assert (mc_grouptype == CCTK_SCALAR or mc_grouptype == CCTK_ARRAY or mc_grouptype == CCTK_GF); @@ -491,6 +563,8 @@ namespace Carpet { mc_grouptype = -1; carpetGH.map = map = -1; + ftimer.stop(); + assert (is_level_mode()); } @@ -501,6 +575,8 @@ namespace Carpet { void enter_local_mode (cGH * const cctkGH, int const c, int const lc, int const grouptype) { + DECLARE_CCTK_PARAMETERS + assert (is_singlemap_mode()); if (mc_grouptype == CCTK_GF) { assert (c>=0 and ccomponents(reflevel)); @@ -511,6 +587,9 @@ namespace Carpet { } Checkpoint ("Entering local mode"); + Timer ftimer("enter_local_mode", &mode_timer_tree); + ftimer.start(); + // Set mode #ifdef HAVE_CGH_CCTK_MODE cctkGH->cctk_mode = CCTK_MODE_LOCAL; @@ -631,6 +710,16 @@ namespace Carpet { } // if mc_grouptype + ftimer.stop(); + + if (include_local_mode_in_mode_timer_tree) + { + ostringstream mode_s; + mode_s << "local"; + Timer timer(mode_s.str(), &mode_timer_tree); + timer.start(); + } + assert (is_local_mode()); } @@ -644,6 +733,17 @@ namespace Carpet { Checkpoint ("Leaving local mode"); + if (mode_timer_tree.current != mode_timer_tree.root && include_local_mode_in_mode_timer_tree) + { + ostringstream mode_s; + mode_s << "local"; + Timer timer(mode_s.str(), &mode_timer_tree); + timer.stop(); + } + + Timer ftimer("leave_local_mode", &mode_timer_tree); + ftimer.start(); + if (mc_grouptype == CCTK_GF) { CCTK_INT const deadbeef = get_deadbeef(); @@ -707,6 +807,8 @@ namespace Carpet { component = -1; local_component = -1; + ftimer.stop(); + assert (is_singlemap_mode()); } diff --git a/Carpet/Carpet/src/variables.cc b/Carpet/Carpet/src/variables.cc index e06881339..d7fef9e80 100644 --- a/Carpet/Carpet/src/variables.cc +++ b/Carpet/Carpet/src/variables.cc @@ -28,6 +28,8 @@ namespace Carpet { vect maxspacereflevelfact; TimerTree main_timer_tree; + TimerTree mode_timer_tree; + // Base multigrid level int basemglevel; diff --git a/Carpet/Carpet/src/variables.hh b/Carpet/Carpet/src/variables.hh index c673b1699..60f934dd3 100644 --- a/Carpet/Carpet/src/variables.hh +++ b/Carpet/Carpet/src/variables.hh @@ -95,6 +95,8 @@ namespace Carpet { extern vect spacereflevelfact; extern TimerTree main_timer_tree; + extern TimerTree mode_timer_tree; + // Current multigrid factor extern int mglevelfact; -- cgit v1.2.3