From 4654968d3a7da18d6ed97e9c836b1dadb01e78a9 Mon Sep 17 00:00:00 2001 From: "Peter W. Draper" <p.w.draper@durham.ac.uk> Date: Wed, 2 Mar 2016 15:11:29 +0000 Subject: [PATCH] Use clock_gettime() to time steps Simplest possible version. Still reports tick value for comparison. --- src/engine.c | 37 ++++++++++++++++++++++++++++++++++--- src/engine.h | 1 + 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/src/engine.c b/src/engine.c index 272d5c0c9f..d842f4835c 100644 --- a/src/engine.c +++ b/src/engine.c @@ -28,6 +28,7 @@ #include <stdio.h> #include <stdlib.h> #include <string.h> +#include <time.h> #include <unistd.h> #include <stdbool.h> @@ -1464,6 +1465,29 @@ void engine_init_particles(struct engine *e) { e->step = -1; } + +/** + * brief Get difference in milli-seconds between two timespecs. + * + * @param start the start time. + * @param end the end time. + * + * @return the difference in milli-secinds. + */ +static double time_diff(struct timespec start, struct timespec end) +{ + struct timespec temp; + if ((end.tv_nsec-start.tv_nsec)<0) { + temp.tv_sec = end.tv_sec-start.tv_sec-1; + temp.tv_nsec = 1000000000+end.tv_nsec-start.tv_nsec; + } else { + temp.tv_sec = end.tv_sec-start.tv_sec; + temp.tv_nsec = end.tv_nsec-start.tv_nsec; + } + return (double)temp.tv_sec*1000.0 + (double)temp.tv_nsec*1.0E-6; +} + + /** * @brief Let the #engine loose to compute the forces. * @@ -1482,6 +1506,9 @@ void engine_step(struct engine *e) { TIMER_TIC2; + struct timespec time1, time2; + clock_gettime(CLOCK_REALTIME, &time1); + /* Collect the cell data. */ for (k = 0; k < s->nr_cells; k++) if (s->cells[k].nodeID == e->nodeID) { @@ -1553,8 +1580,8 @@ void engine_step(struct engine *e) { if (e->nodeID == 0) { /* Print some information to the screen */ - printf("%d %e %e %d %.3f\n", e->step, e->time, e->timeStep, updates, - e->wallclock_time); + printf("%d %e %e %d %.3f %.3f\n", e->step, e->time, e->timeStep, updates, + e->wallclock_time, e->wallclock_time_ticks); fflush(stdout); /* Write some energy statistics */ @@ -1620,7 +1647,11 @@ void engine_step(struct engine *e) { TIMER_TOC2(timer_step); - e->wallclock_time = ((double)timers[timer_count - 1]) / CPU_TPS * 1000; + clock_gettime(CLOCK_REALTIME, &time2); + + e->wallclock_time_ticks = ((double)timers[timer_count - 1]) / CPU_TPS * 1000; + + e->wallclock_time = (float) time_diff(time1, time2); // printParticle(e->s->parts, e->s->xparts,1000, e->s->nr_parts); // printParticle(e->s->parts, e->s->xparts,515050, e->s->nr_parts); } diff --git a/src/engine.h b/src/engine.h index 13c7ec4061..bba53092e2 100644 --- a/src/engine.h +++ b/src/engine.h @@ -147,6 +147,7 @@ struct engine { /* Wallclock time of the last time-step */ float wallclock_time; + float wallclock_time_ticks; /* Force the engine to rebuild? */ int forcerebuild; -- GitLab