diff --git a/src/profiler.c b/src/profiler.c index 2408e9d357d4f124f7efc4b5b17d8be3d7dbdd1a..5ddd12eee9aa29420c7afc1e0b2f323dbffd0c3d 100644 --- a/src/profiler.c +++ b/src/profiler.c @@ -26,49 +26,16 @@ #include "../config.h" /* Some standard headers. */ -#include <float.h> -#include <limits.h> -#include <sched.h> -#include <stdbool.h> -#include <stdio.h> -#include <stdlib.h> #include <string.h> -#include <unistd.h> - -/* MPI headers. */ -#ifdef WITH_MPI -#include <mpi.h> -#endif - -#ifdef HAVE_LIBNUMA -#include <numa.h> -#endif /* This object's header. */ #include "profiler.h" -/* Local headers. */ -#include "atomic.h" -#include "cell.h" -#include "clocks.h" -#include "cycle.h" -#include "debug.h" -#include "error.h" -#include "hydro.h" -#include "minmax.h" -#include "parallel_io.h" -#include "part.h" -#include "partition.h" -#include "proxy.h" -#include "runner.h" -#include "serial_io.h" -#include "single_io.h" -#include "statistics.h" -#include "timers.h" -#include "tools.h" -#include "units.h" -#include "version.h" - +/** + * @brief Resets all timers. + * + * @param (return) profiler #profiler object that holds file pointers and function timers. + */ void profiler_reset_timers(struct profiler *profiler) { profiler->collect_timesteps_time = 0; @@ -90,11 +57,21 @@ void profiler_reset_timers(struct profiler *profiler) { profiler->space_count_parts_time = 0; } +/** + * @brief Opens an output file and populates the header. + * + * @param e #engine object to get various properties. + * @param fileName name of file to be written to. + * @param functionName name of function that is being timed. + * @param (return) file pointer used to open output file. + */ void profiler_write_timing_info_header(struct engine *e, char *fileName, char *functionName, FILE **file) { + /* Create the file name in the format: "fileName_(no. of threads)" */ char fullFileName[200] = ""; sprintf(fullFileName + strlen(fullFileName), "%s_%d.txt", fileName, e->nr_nodes * e->nr_threads); + /* Open the file and write the header. */ *file = fopen(fullFileName, "w"); fprintf(*file, "# Host: %s\n# Branch: %s\n# Revision: %s\n# Compiler: %s, " @@ -114,6 +91,12 @@ void profiler_write_timing_info_header(struct engine *e, char *fileName, char *f fflush(*file); } +/** + * @brief Writes the headers for all output files. Should be called once at the start of the simulation, it could be called in engine_init() for example. + * + * @param e #engine object to get various properties. + * @param (return) profiler #profiler object that holds file pointers and function timers. + */ void profiler_write_all_timing_info_headers(struct engine *e, struct profiler *profiler) { profiler_write_timing_info_header(e,"enginecollecttimesteps","engine_collect_timesteps",&profiler->file_engine_collect_timesteps); @@ -135,6 +118,13 @@ void profiler_write_all_timing_info_headers(struct engine *e, struct profiler *p profiler_write_timing_info_header(e,"spacecountparts","space_count_parts",&profiler->file_space_count_parts); } +/** + * @brief Writes timing info to the output file. + * + * @param e #engine object to get various properties. + * @param time #ticks time in ticks to be written to the output file. + * @param (return) file pointer used to open output file. + */ void profiler_write_timing_info(struct engine *e, ticks time, FILE **file) { fprintf(*file, " %6d %14e %14e %10zu %10zu %21.3f\n", e->step, @@ -142,6 +132,12 @@ void profiler_write_timing_info(struct engine *e, ticks time, FILE **file) { fflush(*file); } +/** + * @brief Writes timing info to all output files. Should be called at the end of every time step, in engine_step() for example. + * + * @param e #engine object to get various properties. + * @param (return) profiler #profiler object that holds file pointers and function timers. + */ void profiler_write_all_timing_info(struct engine *e, struct profiler *profiler) { profiler_write_timing_info(e,profiler->drift_time,&profiler->file_engine_drift); @@ -160,6 +156,32 @@ void profiler_write_all_timing_info(struct engine *e, struct profiler *profiler) 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); - + + /* Reset timers. */ profiler_reset_timers(profiler); } + +/** + * @brief Closes all output files, should be called at the end of the simulation. + * + * @param (return) profiler #profiler object that holds file pointers and function timers. + */ +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); +} diff --git a/src/profiler.h b/src/profiler.h index bd976baa025cb3828da4bb7ebd650673acb708b7..30088ef21a01b2fa752139e33830f55e53d73818 100644 --- a/src/profiler.h +++ b/src/profiler.h @@ -21,34 +21,19 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. * ******************************************************************************/ -#ifndef SWIFT_TIMER_H -#define SWIFT_TIMER_H +#ifndef SWIFT_PROFILER_H +#define SWIFT_PROFILER_H /* Config parameters. */ #include "../config.h" -/* MPI headers. */ -#ifdef WITH_MPI -#include <mpi.h> -#endif - -/* Some standard headers. */ -#include <pthread.h> -#include <stdio.h> - /* Includes. */ #include "clocks.h" -#include "cooling_struct.h" -#include "parser.h" -#include "partition.h" -#include "potential.h" -#include "runner.h" -#include "scheduler.h" -#include "sourceterms_struct.h" -#include "space.h" -#include "task.h" -#include "units.h" +#include "engine.h" +#include "version.h" +#include "hydro.h" +/* Profiler that holds file pointers and time taken in functions. */ struct profiler { /* File pointers for timing info. */ @@ -70,6 +55,7 @@ struct profiler { 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; @@ -89,10 +75,12 @@ struct profiler { ticks space_count_parts_time; }; -void timer_reset_timers(struct profiler *profiler); -void timer_write_timing_info_header(struct engine *e, char *fileName, char *functionName, FILE **file); -void timer_write_all_timing_info_headers(struct engine *e, struct profiler *profiler); -void timer_write_timing_info(struct engine *e, ticks time, FILE **file); -void timer_write_all_timing_info(struct engine *e, struct profiler *profiler); +/* Function prototypes. */ +void profiler_reset_timers(struct profiler *profiler); +void profiler_write_timing_info_header(struct engine *e, char *fileName, char *functionName, FILE **file); +void profiler_write_all_timing_info_headers(struct engine *e, struct profiler *profiler); +void profiler_write_timing_info(struct engine *e, ticks time, FILE **file); +void profiler_write_all_timing_info(struct engine *e, struct profiler *profiler); +void profiler_close_files(struct profiler *profiler); -#endif /* SWIFT_TIMER_H */ +#endif /* SWIFT_PROFILER_H */