From 461f202f492538b97bdc4b082a98dbc5f571b8cf Mon Sep 17 00:00:00 2001
From: James Willis <james.s.willis@durham.ac.uk>
Date: Mon, 20 Mar 2017 11:57:35 +0000
Subject: [PATCH] Updated profiler to an array of timers and file pointers to
make it easier to add extra timers.
---
src/profiler.c | 163 +++++++++++++++++--------------------------------
src/profiler.h | 63 ++++++++-----------
2 files changed, 81 insertions(+), 145 deletions(-)
diff --git a/src/profiler.c b/src/profiler.c
index ad8338eebf..133dff3f88 100644
--- a/src/profiler.c
+++ b/src/profiler.c
@@ -31,6 +31,46 @@
#include "hydro.h"
#include "version.h"
+/* Array to store the list of file names. Order must match profiler_types
+ * enumerator and profiler_func_names. */
+const char *profiler_file_names[profiler_length] = {"enginecollecttimesteps",
+ "enginedrift",
+ "enginerebuild",
+ "schedulerreweight",
+ "schedulerclearwaits",
+ "schedulerrewait",
+ "schedulerenqueue",
+ "engineprintstats",
+ "enginelaunch",
+ "spacerebuild",
+ "enginemaketasks",
+ "enginemarktasks",
+ "spaceregrid",
+ "spacepartssort",
+ "spacesplit",
+ "spacegetcellid",
+ "spacecountparts"};
+
+/* Array to store the list of function names. Order must match profiler_types
+ * enumerator and profiler_file_names. */
+const char *profiler_func_names[profiler_length] = {"engine_collect_timesteps",
+ "engine_drift",
+ "engine_rebuild",
+ "scheduler_reweight",
+ "scheduler_clear_waits",
+ "scheduler_rewait",
+ "scheduler_enqueue",
+ "engine_print_stats",
+ "engine_launch",
+ "space_rebuild",
+ "engine_maketasks",
+ "engine_marktasks",
+ "space_regrid",
+ "space_parts_sort",
+ "space_split",
+ "space_get_cell_id",
+ "space_count_parts"};
+
/**
* @brief Resets all timers.
*
@@ -38,24 +78,8 @@
* function timers.
*/
void profiler_reset_timers(struct profiler *profiler) {
-
- profiler->collect_timesteps_time = 0;
- profiler->drift_time = 0;
- profiler->rebuild_time = 0;
- profiler->reweight_time = 0;
- profiler->clear_waits_time = 0;
- profiler->re_wait_time = 0;
- profiler->enqueue_time = 0;
- profiler->stats_time = 0;
- profiler->launch_time = 0;
- profiler->space_rebuild_time = 0;
- profiler->engine_maketasks_time = 0;
- profiler->engine_marktasks_time = 0;
- profiler->space_regrid_time = 0;
- profiler->space_parts_sort_time = 0;
- profiler->space_split_time = 0;
- profiler->space_parts_get_cell_id_time = 0;
- profiler->space_count_parts_time = 0;
+ /* Iterate over times array and reset values. */
+ for (int i = 0; i < profiler_length; i++) profiler->times[i] = 0;
}
/**
@@ -66,8 +90,9 @@ void profiler_reset_timers(struct profiler *profiler) {
* @param functionName name of function that is being timed.
* @param file (return) pointer used to open output file.
*/
-void profiler_write_timing_info_header(const struct engine *e, char *fileName,
- char *functionName, FILE **file) {
+void profiler_write_timing_info_header(const struct engine *e,
+ const char *fileName,
+ const char *functionName, FILE **file) {
/* Create the file name in the format: "fileName_(no. of threads)" */
char fullFileName[200] = "";
@@ -103,44 +128,11 @@ void profiler_write_timing_info_header(const struct engine *e, char *fileName,
*/
void profiler_write_all_timing_info_headers(const struct engine *e,
struct profiler *profiler) {
-
- profiler_write_timing_info_header(e, "enginecollecttimesteps",
- "engine_collect_timesteps",
- &profiler->file_engine_collect_timesteps);
- profiler_write_timing_info_header(e, "enginedrift", "engine_drift",
- &profiler->file_engine_drift);
- profiler_write_timing_info_header(e, "enginerebuild", "engine_rebuild",
- &profiler->file_engine_rebuild);
- profiler_write_timing_info_header(e, "schedulerreweight",
- "scheduler_reweight",
- &profiler->file_scheduler_reweight);
- profiler_write_timing_info_header(e, "schedulerclearwaits",
- "scheduler_clear_waits",
- &profiler->file_scheduler_clear_waits);
- profiler_write_timing_info_header(e, "schedulerrewait", "scheduler_rewait",
- &profiler->file_scheduler_re_wait);
- profiler_write_timing_info_header(e, "schedulerenqueue", "scheduler_enqueue",
- &profiler->file_scheduler_enqueue);
- profiler_write_timing_info_header(e, "engineprintstats", "engine_print_stats",
- &profiler->file_engine_stats);
- profiler_write_timing_info_header(e, "enginelaunch", "engine_launch",
- &profiler->file_engine_launch);
- profiler_write_timing_info_header(e, "spacerebuild", "space_rebuild",
- &profiler->file_space_rebuild);
- profiler_write_timing_info_header(e, "enginemaketasks", "engine_maketasks",
- &profiler->file_engine_maketasks);
- profiler_write_timing_info_header(e, "enginemarktasks", "engine_marktasks",
- &profiler->file_engine_marktasks);
- profiler_write_timing_info_header(e, "spaceregrid", "space_regrid",
- &profiler->file_space_regrid);
- profiler_write_timing_info_header(e, "spacepartssort", "space_parts_sort",
- &profiler->file_space_parts_sort);
- profiler_write_timing_info_header(e, "spacesplit", "space_split",
- &profiler->file_space_split);
- profiler_write_timing_info_header(e, "spacegetcellid", "space_get_cell_id",
- &profiler->file_space_parts_get_cell_id);
- profiler_write_timing_info_header(e, "spacecountparts", "space_count_parts",
- &profiler->file_space_count_parts);
+ /* Iterate over files array and write file headers. */
+ for (int i = 0; i < profiler_length; i++) {
+ profiler_write_timing_info_header(
+ e, profiler_file_names[i], profiler_func_names[i], &profiler->files[i]);
+ }
}
/**
@@ -169,39 +161,10 @@ void profiler_write_timing_info(const struct engine *e, ticks time,
void profiler_write_all_timing_info(const struct engine *e,
struct profiler *profiler) {
- profiler_write_timing_info(e, profiler->drift_time,
- profiler->file_engine_drift);
- profiler_write_timing_info(e, profiler->rebuild_time,
- profiler->file_engine_rebuild);
- profiler_write_timing_info(e, profiler->reweight_time,
- profiler->file_scheduler_reweight);
- profiler_write_timing_info(e, profiler->clear_waits_time,
- profiler->file_scheduler_clear_waits);
- profiler_write_timing_info(e, profiler->re_wait_time,
- profiler->file_scheduler_re_wait);
- profiler_write_timing_info(e, profiler->enqueue_time,
- profiler->file_scheduler_enqueue);
- profiler_write_timing_info(e, profiler->stats_time,
- profiler->file_engine_stats);
- profiler_write_timing_info(e, profiler->launch_time,
- profiler->file_engine_launch);
- profiler_write_timing_info(e, profiler->space_rebuild_time,
- profiler->file_space_rebuild);
- profiler_write_timing_info(e, profiler->engine_maketasks_time,
- profiler->file_engine_maketasks);
- profiler_write_timing_info(e, profiler->engine_marktasks_time,
- profiler->file_engine_marktasks);
- profiler_write_timing_info(e, profiler->space_regrid_time,
- profiler->file_space_regrid);
- profiler_write_timing_info(e, profiler->space_parts_sort_time,
- profiler->file_space_parts_sort);
- profiler_write_timing_info(e, profiler->space_split_time,
- profiler->file_space_split);
- profiler_write_timing_info(e, profiler->space_parts_get_cell_id_time,
- profiler->file_space_parts_get_cell_id);
- profiler_write_timing_info(e, profiler->space_count_parts_time,
- profiler->file_space_count_parts);
-
+ /* Iterate over times array and print timing info to files. */
+ for (int i = 0; i < profiler_length; i++) {
+ profiler_write_timing_info(e, profiler->times[i], profiler->files[i]);
+ }
/* Reset timers. */
profiler_reset_timers(profiler);
}
@@ -215,20 +178,6 @@ void profiler_write_all_timing_info(const struct engine *e,
*/
void profiler_close_files(struct profiler *profiler) {
- fclose(profiler->file_engine_drift);
- fclose(profiler->file_engine_rebuild);
- fclose(profiler->file_scheduler_reweight);
- fclose(profiler->file_scheduler_clear_waits);
- fclose(profiler->file_scheduler_re_wait);
- fclose(profiler->file_scheduler_enqueue);
- fclose(profiler->file_engine_stats);
- fclose(profiler->file_engine_launch);
- fclose(profiler->file_space_rebuild);
- fclose(profiler->file_engine_maketasks);
- fclose(profiler->file_engine_marktasks);
- fclose(profiler->file_space_regrid);
- fclose(profiler->file_space_parts_sort);
- fclose(profiler->file_space_split);
- fclose(profiler->file_space_parts_get_cell_id);
- fclose(profiler->file_space_count_parts);
+ /* Iterate over files array and close files. */
+ for (int i = 0; i < profiler_length; i++) fclose(profiler->files[i]);
}
diff --git a/src/profiler.h b/src/profiler.h
index b00bc986ec..911d474791 100644
--- a/src/profiler.h
+++ b/src/profiler.h
@@ -25,46 +25,33 @@
/* Local includes */
#include "engine.h"
+/* Enumerator to be used as an index into the timers and files array. To add an
+ * extra timer extend this list, before the profiler_length value.*/
+enum profiler_types {
+ profiler_engine_collect_timesteps = 0,
+ profiler_engine_drift,
+ profiler_engine_rebuild,
+ profiler_scheduler_reweight,
+ profiler_scheduler_clear_waits,
+ profiler_scheduler_re_wait,
+ profiler_scheduler_enqueue,
+ profiler_engine_stats,
+ profiler_engine_launch,
+ profiler_space_rebuild,
+ profiler_engine_maketasks,
+ profiler_engine_marktasks,
+ profiler_space_regrid,
+ profiler_space_parts_sort,
+ profiler_space_split,
+ profiler_space_parts_get_cell_id,
+ profiler_space_count_parts,
+ profiler_length
+};
+
/* Profiler that holds file pointers and time taken in functions. */
struct profiler {
-
- /* File pointers for timing info. */
- FILE *file_engine_collect_timesteps;
- FILE *file_engine_drift;
- FILE *file_engine_rebuild;
- FILE *file_scheduler_reweight;
- FILE *file_scheduler_clear_waits;
- FILE *file_scheduler_re_wait;
- FILE *file_scheduler_enqueue;
- FILE *file_engine_stats;
- FILE *file_engine_launch;
- FILE *file_space_rebuild;
- FILE *file_engine_maketasks;
- FILE *file_engine_marktasks;
- FILE *file_space_regrid;
- FILE *file_space_parts_sort;
- FILE *file_space_split;
- FILE *file_space_parts_get_cell_id;
- FILE *file_space_count_parts;
-
- /* Time taken in functions. */
- ticks collect_timesteps_time;
- ticks drift_time;
- ticks rebuild_time;
- ticks reweight_time;
- ticks clear_waits_time;
- ticks re_wait_time;
- ticks enqueue_time;
- ticks stats_time;
- ticks launch_time;
- ticks space_rebuild_time;
- ticks engine_maketasks_time;
- ticks engine_marktasks_time;
- ticks space_regrid_time;
- ticks space_parts_sort_time;
- ticks space_split_time;
- ticks space_parts_get_cell_id_time;
- ticks space_count_parts_time;
+ FILE *files[profiler_length];
+ ticks times[profiler_length];
};
/* Function prototypes. */
--
GitLab