diff options
Diffstat (limited to 'perform/pio_timer.c')
-rw-r--r-- | perform/pio_timer.c | 137 |
1 files changed, 137 insertions, 0 deletions
diff --git a/perform/pio_timer.c b/perform/pio_timer.c new file mode 100644 index 0000000..1220e38 --- /dev/null +++ b/perform/pio_timer.c @@ -0,0 +1,137 @@ +/* + * Copyright (C) 2001 + * National Center for Supercomputing Applications + * All rights reserved. + */ + +/* + * Purpose: + * + * This is a module of useful timing functions for performance testing. + */ + +#include <stdio.h> +#include <stdlib.h> +#include <mpi.h> + +#if 0 + +#include "hdf5.h" + +#endif /* 0 */ + +#include "pio_timer.h" + +/* + * The number to divide the tv_usec field with to get a nice decimal to add to + * the number of seconds. + */ +#define MILLISECOND 1000000.0 + +/* + * Function: perf_time_new + * Purpose: Build us a brand, spankin', new performance time object. + * The object is a black box to the user. They just tell us + * what type of timer they want (MPI_TIMER for MPI_Wtime or + * SYS_TIMER for system time). + * Return: Pointer to perf_time object + * Programmer: Bill Wendling, 01. October 2001 + * Modifications: + */ +perf_time * +perf_time_new(unsigned int type) +{ + perf_time *pt = (perf_time *)calloc(1, sizeof(struct perf_time_)); + + pt->type = type; + return pt; +} + +/* + * Function: perf_time_destroy + * Purpose: Remove the memory allocated for the perf_time object. Only + * need to call on a pointer allocated with the ``perf_time_new'' + * function. + * Return: Nothing + * Programmer: Bill Wendling, 01. October 2001 + * Modifications: + */ +void +perf_time_destroy(perf_time *pt) +{ + free(pt); +} + +/* + * Function: set_timer_type + * Purpose: Set the type of the timer to either MPI_TIMER or SYS_TIMER. + * This really only needs to be called if you didn't construct a + * timer with the perf_timer_new function (shame!). + * Return: Nothing + * Programmer: Bill Wendling, 04. October 2001 + * Modifications: + */ +void +set_timer_type(perf_time *pt, timer_type type) +{ + pt->type = type; +} + +/* + * Function: get_timer_type + * Purpose: Get the type of the timer. + * Return: MPI_TIMER or SYS_TIMER. + * Programmer: Bill Wendling, 04. October 2001 + * Modifications: + */ +timer_type +get_timer_type(perf_time *pt) +{ + return pt->type; +} + +/* + * Function: set_time + * Purpose: Set the time in a ``perf_time'' object. + * Return: Pointer to the passed in ``perf_time'' object. + * Programmer: Bill Wendling, 01. October 2001 + * Modifications: + */ +perf_time * +set_time(perf_time *pt, timer_type t, int start_stop) +{ + if (pt) { + if (pt->type == MPI_TIMER) { + if (start_stop == START) { + pt->mpi_timer[t] = MPI_Wtime(); + } else { + pt->total_time[t] += MPI_Wtime() - pt->mpi_timer[t]; + } + } else { + if (start_stop == START) { + gettimeofday(&pt->sys_timer[t], NULL); + } else { + struct timeval sys_t; + + gettimeofday(&sys_t, NULL); + pt->total_time[t] += (double)pt->sys_timer[t].tv_sec + + ((double)pt->sys_timer[t].tv_usec) / MILLISECOND; + } + } + } + + return pt; +} + +/* + * Function: get_time + * Purpose: Get the time from a ``perf_time'' object. + * Return: The number of seconds as a DOUBLE. + * Programmer: Bill Wendling, 01. October 2001 + * Modifications: + */ +double +get_time(perf_time *pt, timer_type t) +{ + return pt->total_time[t]; +} |