diff --git a/src/profiler.c b/src/profiler.c index ad8338eebfd130d4088f9fd9d4fcc9856c8cc731..133dff3f88261d6618be1f45ffe263524c744b14 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 b00bc986ece8b78282b11ce317a6746ecba5a50f..911d4747912d64dd46d2cf59369670ff26a92012 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. */