diff --git a/configure.ac b/configure.ac index e979580470671143348d986e82ad1d1861eb3129..8a2d0f30ae297993b34153bc9a4c04085f4748f5 100644 --- a/configure.ac +++ b/configure.ac @@ -189,6 +189,18 @@ if test "$enable_task_debugging" = "yes"; then AC_DEFINE([SWIFT_DEBUG_TASKS],1,[Enable task debugging]) fi +# Check if the general timers are switched on. +AC_ARG_ENABLE([timers], + [AS_HELP_STRING([--enable-timers], + [Activate the basic timers @<:@yes/no@:>@] + )], + [enable_timers="$enableval"], + [enable_timers="no"] +) +if test "$enable_timers" = "yes"; then + AC_DEFINE([SWIFT_USE_TIMERS],1,[Enable individual timers]) +fi + # Check if expensive debugging is on. AC_ARG_ENABLE([debugging-checks], [AS_HELP_STRING([--enable-debugging-checks], @@ -874,6 +886,7 @@ AC_MSG_RESULT([ Multipole order : $with_multipole_order No gravity below ID : $no_gravity_below_id + Individual timers : $enable_timers Task debugging : $enable_task_debugging Debugging checks : $enable_debugging_checks Gravity checks : $gravity_force_checks diff --git a/examples/Makefile.am b/examples/Makefile.am index dd13fb7eb4b82fbbfbb1ae450e20d01b13f2a455..1dd240fb6015fe5fdd2465cccb1bb221706efeed 100644 --- a/examples/Makefile.am +++ b/examples/Makefile.am @@ -16,7 +16,7 @@ # along with this program. If not, see <http://www.gnu.org/licenses/>. # Common flags -MYFLAGS = -DTIMER +MYFLAGS = # Add the source directory and debug to CFLAGS AM_CFLAGS = -I$(top_srcdir)/src $(HDF5_CPPFLAGS) diff --git a/examples/main.c b/examples/main.c index 66d9b2d40ae4c270dd6d00a99d8021a201146f98..afe8265c623861be449903afdc683b5706cc3cac 100644 --- a/examples/main.c +++ b/examples/main.c @@ -610,35 +610,25 @@ int main(int argc, char *argv[]) { engine_dump_snapshot(&e); /* Legend */ - if (myrank == 0) { + if (myrank == 0) printf("# %6s %14s %14s %10s %10s %10s %16s [%s]\n", "Step", "Time", "Time-step", "Updates", "g-Updates", "s-Updates", "Wall-clock time", clocks_getunit()); - if (with_verbose_timers) { - printf("timers: "); - for (int k = 0; k < timer_count; k++) printf("%s\t", timers_names[k]); - printf("\n"); - } - } + /* File for the timers */ + if (with_verbose_timers) timers_open_file(); /* Main simulation loop */ for (int j = 0; !engine_is_done(&e) && e.step - 1 != nsteps; j++) { /* Reset timers */ - timers_reset(timers_mask_all); + timers_reset_all(); /* Take a step. */ engine_step(&e); /* Print the timers. */ - if (with_verbose_timers) { - printf("timers: "); - for (int k = 0; k < timer_count; k++) - printf("%.3f\t", clocks_from_ticks(timers[k])); - printf("\n"); - timers_reset(timers_mask_all); - } + if (with_verbose_timers) timers_print(e.step); #ifdef SWIFT_DEBUG_TASKS /* Dump the task data using the given frequency. */ @@ -744,6 +734,7 @@ int main(int argc, char *argv[]) { #endif /* Clean everything */ + if (with_verbose_timers) timers_close_file(); engine_clean(&e); free(params); diff --git a/src/Makefile.am b/src/Makefile.am index 644094eefb62abd635ec5d6066802de006f05177..7bec5327f4759fcf7d3e1af9d041677ffbc7ab55 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -16,7 +16,7 @@ # along with this program. If not, see <http://www.gnu.org/licenses/>. # Add the debug flag to the whole thing -AM_CFLAGS = -DTIMER $(HDF5_CPPFLAGS) +AM_CFLAGS = $(HDF5_CPPFLAGS) # Assign a "safe" version number AM_LDFLAGS = $(HDF5_LDFLAGS) $(FFTW_LIBS) -version-info 0:0:0 diff --git a/src/atomic.h b/src/atomic.h index be24f96e5a9d2e955132f0d6d34bdfa58bc1649c..4f180c643a304a801a9d70940fd12f9f193941e1 100644 --- a/src/atomic.h +++ b/src/atomic.h @@ -19,6 +19,9 @@ #ifndef SWIFT_ATOMIC_H #define SWIFT_ATOMIC_H +/* Config parameters. */ +#include "../config.h" + /* Includes. */ #include "inline.h" diff --git a/src/engine.c b/src/engine.c index e6d5484781daafceefca7384ee2631518e18641c..07fd121a14fc9617a440e6abc9bdfa3774ef41a8 100644 --- a/src/engine.c +++ b/src/engine.c @@ -2742,7 +2742,8 @@ void engine_rebuild(struct engine *e) { */ void engine_prepare(struct engine *e) { - TIMER_TIC; + TIMER_TIC2; + const ticks tic = getticks(); #ifdef SWIFT_DEBUG_CHECKS if (e->forcerepart || e->forcerebuild) { @@ -2769,7 +2770,7 @@ void engine_prepare(struct engine *e) { } e->tasks_age += 1; - TIMER_TOC(timer_prepare); + TIMER_TOC2(timer_prepare); if (e->verbose) message("took %.3f %s (including unskip and reweight).", diff --git a/src/inline.h b/src/inline.h index c4dd9d59becabf54895b60cf3ac7ba809ac150c5..538f6f520c9d6187dc02f1cbd5d59480aac7bdb2 100644 --- a/src/inline.h +++ b/src/inline.h @@ -20,6 +20,9 @@ #ifndef SWIFT_INLINE_H #define SWIFT_INLINE_H +/* Config parameters. */ +#include "../config.h" + /** * @brief Defines inline */ diff --git a/src/runner_doiact.h b/src/runner_doiact.h index 21b7ba5535f9eef3a36223e17cc75e2017b56c5c..46cdbcf0902325115459ed6b079d5204ecb252a2 100644 --- a/src/runner_doiact.h +++ b/src/runner_doiact.h @@ -255,7 +255,7 @@ void DOPAIR2_NAIVE(struct runner *r, struct cell *restrict ci, const struct engine *e = r->e; #ifndef SWIFT_DEBUG_CHECKS -// error("Don't use in actual runs ! Slow code !"); + error("Don't use in actual runs ! Slow code !"); #endif #ifdef WITH_OLD_VECTORIZATION @@ -562,7 +562,7 @@ void DOPAIR_SUBSET_NAIVE(struct runner *r, struct cell *restrict ci, IACT_NONSYM(r2q[k], &dxq[3 * k], hiq[k], hjq[k], piq[k], pjq[k]); #endif - TIMER_TOC(timer_dopair_subset); + TIMER_TOC(timer_dopair_subset_naive); } /** @@ -857,7 +857,7 @@ void DOSELF_SUBSET(struct runner *r, struct cell *restrict ci, IACT_NONSYM(r2q[k], &dxq[3 * k], hiq[k], hjq[k], piq[k], pjq[k]); #endif - TIMER_TOC(timer_dopair_subset); + TIMER_TOC(timer_doself_subset); } /** @@ -3179,5 +3179,5 @@ void DOSUB_SUBSET(struct runner *r, struct cell *ci, struct part *parts, } /* otherwise, pair interaction. */ - if (gettimer) TIMER_TOC(TIMER_DOSUB_PAIR); + if (gettimer) TIMER_TOC(timer_dosub_subset); } diff --git a/src/timers.c b/src/timers.c index 558ac109c224d939272152aa43684ad842c511de..153f782da4328321cd2c1a2e9bf3429fb101b400 100644 --- a/src/timers.c +++ b/src/timers.c @@ -21,16 +21,21 @@ ******************************************************************************/ /* Config parameters. */ -#include "../config.h" /* This object's header. */ #include "timers.h" +/* Some standard headers. */ +#include <stdio.h> + +/* Local includes. */ +#include "clocks.h" + /* The timers. */ ticks timers[timer_count]; /* Timer names. */ -char *timers_names[timer_count] = { +const char* timers_names[timer_count] = { "none", "prepare", "init", @@ -63,20 +68,27 @@ char *timers_names[timer_count] = { "dosub_pair_gradient", "dosub_pair_force", "dosub_pair_grav", + "doself_subset", "dopair_subset", + "dopair_subset_naive", + "dosub_subset", "do_ghost", "do_extra_ghost", "dorecv_part", "dorecv_gpart", "dorecv_spart", + "do_cooling", "gettask", "qget", "qsteal", + "locktree", "runners", "step", - "do_cooling", }; +/* File to store the timers */ +static FILE* timers_file; + /** * @brief Re-set the timers. * @@ -90,3 +102,39 @@ void timers_reset(unsigned long long mask) { for (int k = 0; k < timer_count; k++) if (mask & (1ull << k)) timers[k] = 0; } + +/** + * @brief Re-set all the timers. + * + */ +void timers_reset_all() { timers_reset(timers_mask_all); } + +/** + * @brief Outputs all the timers to the timers dump file. + * + * @param step The current step. + */ +void timers_print(int step) { + fprintf(timers_file, "%d\t", step); + for (int k = 0; k < timer_count; k++) + fprintf(timers_file, "%.3f\t", clocks_from_ticks(timers[k])); + fprintf(timers_file, "\n"); +} + +/** + * @brief Opens the file to contain the timers info and print a header + */ +void timers_open_file() { + + timers_file = fopen("timers.txt", "w"); + + fprintf(timers_file, "# timers: \n# step | "); + for (int k = 0; k < timer_count; k++) + fprintf(timers_file, "%s\t", timers_names[k]); + fprintf(timers_file, "\n"); +} + +/** + * @brief Close the file containing the timer info. + */ +void timers_close_file() { fclose(timers_file); } diff --git a/src/timers.h b/src/timers.h index ef84a82eab4c0b11f758d75bb8f530d320707814..23ae61b83fbe21e650cc592c0cf30445cb85b08f 100644 --- a/src/timers.h +++ b/src/timers.h @@ -22,7 +22,10 @@ #ifndef SWIFT_TIMERS_H #define SWIFT_TIMERS_H -/* Includes. */ +/* Config parameters. */ +#include "../config.h" + +/* Local includes. */ #include "atomic.h" #include "cycle.h" #include "inline.h" @@ -66,18 +69,22 @@ enum { timer_dosub_pair_gradient, timer_dosub_pair_force, timer_dosub_pair_grav, + timer_doself_subset, timer_dopair_subset, + timer_dopair_subset_naive, + timer_dosub_subset, timer_do_ghost, timer_do_extra_ghost, timer_dorecv_part, timer_dorecv_gpart, timer_dorecv_spart, + timer_do_cooling, timer_gettask, timer_qget, timer_qsteal, + timer_locktree, timer_runners, timer_step, - timer_do_cooling, timer_count, }; @@ -85,32 +92,34 @@ enum { extern ticks timers[timer_count]; /* The timer names. */ -extern char *timers_names[]; +extern const char *timers_names[]; /* Mask for all timers. */ #define timers_mask_all ((1ull << timer_count) - 1) /* Define the timer macros. */ -#ifdef TIMER -#define TIMER_TIC_ND tic = getticks(); -#define TIMER_TIC2_ND ticks tic2 = getticks(); -#define TIMER_TIC ticks tic = getticks(); +#ifdef SWIFT_USE_TIMERS +#define TIMER_TIC const ticks tic = getticks(); #define TIMER_TOC(t) timers_toc(t, tic) -#define TIMER_TIC2 ticks tic2 = getticks(); +#define TIMER_TIC2 const ticks tic2 = getticks(); #define TIMER_TOC2(t) timers_toc(t, tic2) INLINE static ticks timers_toc(unsigned int t, ticks tic) { - ticks d = (getticks() - tic); + const ticks d = (getticks() - tic); atomic_add(&timers[t], d); return d; } #else #define TIMER_TIC -#define TIMER_TOC(t) +#define TIMER_TOC(t) (void)0 #define TIMER_TIC2 -#define TIMER_TOC2(t) +#define TIMER_TOC2(t) (void)0 #endif /* Function prototypes. */ +void timers_reset_all(); void timers_reset(unsigned long long mask); +void timers_open_file(); +void timers_close_file(); +void timers_print(int step); #endif /* SWIFT_TIMERS_H */ diff --git a/tests/Makefile.am b/tests/Makefile.am index 10343c05db2d6d1133ccdc847c6774c169414d83..a51b8eb82a17313818ff956ca3f15a232df8df65 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -15,8 +15,7 @@ # along with this program. If not, see <http://www.gnu.org/licenses/>. # Add the source directory and debug to CFLAGS -AM_CFLAGS = -I$(top_srcdir)/src $(HDF5_CPPFLAGS) -DTIMER - +AM_CFLAGS = -I$(top_srcdir)/src $(HDF5_CPPFLAGS) AM_LDFLAGS = ../src/.libs/libswiftsim.a $(HDF5_LDFLAGS) $(HDF5_LIBS) $(FFTW_LIBS)