diff options
author | Albert Cheng <acheng@hdfgroup.org> | 2014-12-30 05:56:05 (GMT) |
---|---|---|
committer | Albert Cheng <acheng@hdfgroup.org> | 2014-12-30 05:56:05 (GMT) |
commit | aebc4ae149b95814810c34a5036333ac732e21ea (patch) | |
tree | b68415a4048a0e218acc0a77aef6ef6345e0cfc2 /tools/perform/io_timer.c | |
parent | b65eae7aeeabcb15b2ef002692e1d0435902d44a (diff) | |
download | hdf5-aebc4ae149b95814810c34a5036333ac732e21ea.zip hdf5-aebc4ae149b95814810c34a5036333ac732e21ea.tar.gz hdf5-aebc4ae149b95814810c34a5036333ac732e21ea.tar.bz2 |
[svn-r25932] HDFFV-8902: merge the source code of h5perf and h5perf_serial, stage 1.
tools/perform/sio_timer.h:
tools/perform/pio_timer.c:
tools/perform/io_timer.h:
tools/perform/io_timer.c:
Renamed pio_timer.[ch] as io_timer.[ch];
merged content of sio_timer.[ch] into io_timer.[ch] so that both h5perf and h5perf_serial
call the combined io_timer.[ch].
Moved the debug printing code segment in set_time() in [sp]io_timer.c to as debug_start_stop_time() in [sp]io_perf.c where it belongs.
Screened out set_timer_type() and get_timer_type() which were not used by any code.
tools/perform/Makefile.am:
tools/perform/Makefile.in:
tools/perform/CMakeLists.txt
Adjusted to use io_timer.c for both h5perf and h5perf_serial.
tools/perform/pio_perf.c:
tools/perform/sio_perf.c:
tools/perform/pio_perf.h:
tools/perform/sio_perf.h:
Renamed [sp]io_time_destory() to same io_time_destroy();
Moved the debug printing code segment in set_time() in [sp]io_timer.c to as debug_start_stop_time() in [sp]io_perf.c where it belongs.
tools/perform/pio_engine.c:
tools/perform/sio_engine.c:
Removed #include io_timer.h since it was already #include by [sp]io_perf.h.
MANIFEST:
Updated the merge of [sp]io_timer.[ch] into io_timer.[ch].
Tested: h5committest and jam in extra.
Diffstat (limited to 'tools/perform/io_timer.c')
-rw-r--r-- | tools/perform/io_timer.c | 225 |
1 files changed, 225 insertions, 0 deletions
diff --git a/tools/perform/io_timer.c b/tools/perform/io_timer.c new file mode 100644 index 0000000..efe909d --- /dev/null +++ b/tools/perform/io_timer.c @@ -0,0 +1,225 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Copyright by The HDF Group. * + * All rights reserved. * + * * + * This file is part of HDF5. The full HDF5 copyright notice, including * + * terms governing use, modification, and redistribution, is contained in * + * the files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ +/* changes: + * rename pio_timer.c as io_timer.c; + * Removed pio_perf.h so that it is not dependant on it; + * Removed set_timer_type() and get_timer_type() since no one calls them; + * Merged sio_timer.c into io_timer.c; + */ + +/* + * Purpose: + * + * This is a module of useful timing functions for performance testing. + */ + +#include <stdio.h> +#include <stdlib.h> + +#include "hdf5.h" + +#ifdef H5_HAVE_PARALLEL +#include <mpi.h> +#endif + +#include "io_timer.h" + +/* + * The number to divide the tv_usec field with to get a nice decimal to add to + * the number of seconds. + */ +#define MICROSECOND 1000000.0 + +/* global variables */ +io_time_t *timer_g; /* timer: global for stub functions */ + +/* + * Function: sub_time + * Purpose: Struct two time values, and return the difference, in microseconds + * + * Note that the function assumes that a > b + * Programmer: Leon Arber, 1/27/06 + */ +static double sub_time(struct timeval* a, struct timeval* b) +{ + return (((double)a->tv_sec + + ((double)a->tv_usec) / MICROSECOND) - + ((double)b->tv_sec + + ((double)b->tv_usec) / MICROSECOND)); +} + + +/* + * Function: io_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_CLOCK for MPI_Wtime or + * SYS_CLOCK for system time). + * Return: Pointer to io_time object + * Programmer: Bill Wendling, 01. October 2001 + * Modifications: + */ +io_time_t * +io_time_new(clock_type type) +{ + io_time_t *pt = (io_time_t *)calloc(1, sizeof(struct io_time_t)); + + /* set global timer variable */ + timer_g = pt; + + pt->type = type; + return pt; +} + +/* + * Function: io_time_destroy + * Purpose: Remove the memory allocated for the io_time object. Only + * need to call on a pointer allocated with the ``io_time_new'' + * function. + * Return: Nothing + * Programmer: Bill Wendling, 01. October 2001 + * Modifications: + */ +void +io_time_destroy(io_time_t *pt) +{ + HDfree(pt); + /* reset the global timer pointer too. */ + timer_g = NULL; +} + +#if 0 +/* no one is calling set_timer_type or get_timer_type ???*/ +/* + * Function: set_timer_type + * Purpose: Set the type of the timer to either MPI_CLOCK or SYS_CLOCK. + * This really only needs to be called if you didn't construct a + * timer with the pio_timer_new function (shame!). + * Return: Nothing + * Programmer: Bill Wendling, 04. October 2001 + * Modifications: + */ +void +set_timer_type(io_time_t *pt, clock_type type) +{ + pt->type = type; +} + +/* + * Function: get_timer_type + * Purpose: Get the type of the timer. + * Return: MPI_CLOCK or SYS_CLOCK. + * Programmer: Bill Wendling, 04. October 2001 + * Modifications: + */ +clock_type +get_timer_type(io_time_t *pt) +{ + return pt->type; +} +#endif + +/* + * Function: set_time + * Purpose: Set the time in a ``io_time_t'' object. + * Return: Pointer to the passed in ``io_time_t'' object if SUCCEED; Null otherwise. + * Programmer: Bill Wendling, 01. October 2001 + * Modifications: + */ +io_time_t * +set_time(io_time_t *pt, timer_type t, int start_stop) +{ + /* sanity check */ + assert(pt); + + switch(pt->type){ +#ifdef H5_HAVE_PARALLEL + case MPI_CLOCK: + if (start_stop == TSTART) { + pt->mpi_timer[t] = MPI_Wtime(); + + /* When we start the timer for HDF5_FINE_WRITE_FIXED_DIMS or HDF5_FINE_READ_FIXED_DIMS + * we compute the time it took to only open the file */ + if(t == HDF5_FINE_WRITE_FIXED_DIMS) + pt->total_time[HDF5_FILE_WRITE_OPEN] += pt->mpi_timer[t] - pt->mpi_timer[HDF5_GROSS_WRITE_FIXED_DIMS]; + else if(t == HDF5_FINE_READ_FIXED_DIMS) + pt->total_time[HDF5_FILE_READ_OPEN] += pt->mpi_timer[t] - pt->mpi_timer[HDF5_GROSS_READ_FIXED_DIMS]; + + } else { + pt->total_time[t] += MPI_Wtime() - pt->mpi_timer[t]; + pt->mpi_timer[t] = MPI_Wtime(); + + /* When we stop the timer for HDF5_GROSS_WRITE_FIXED_DIMS or HDF5_GROSS_READ_FIXED_DIMS + * we compute the time it took to close the file after the last read/write finished */ + if(t == HDF5_GROSS_WRITE_FIXED_DIMS) + pt->total_time[HDF5_FILE_WRITE_CLOSE] += pt->mpi_timer[t] - pt->mpi_timer[HDF5_FINE_WRITE_FIXED_DIMS]; + else if(t == HDF5_GROSS_READ_FIXED_DIMS) + pt->total_time[HDF5_FILE_READ_CLOSE] += pt->mpi_timer[t] - pt->mpi_timer[HDF5_FINE_READ_FIXED_DIMS]; + } + break; +#endif /* H5_HAVE_PARALLEL */ + case SYS_CLOCK: + if (start_stop == TSTART) { + HDgettimeofday(&pt->sys_timer[t], NULL); + + /* When we start the timer for HDF5_FINE_WRITE_FIXED_DIMS or HDF5_FINE_READ_FIXED_DIMS + * we compute the time it took to only open the file */ + if(t == HDF5_FINE_WRITE_FIXED_DIMS) + pt->total_time[HDF5_FILE_WRITE_OPEN] += sub_time(&(pt->sys_timer[t]), &(pt->sys_timer[HDF5_GROSS_WRITE_FIXED_DIMS])); + else if(t == HDF5_FINE_READ_FIXED_DIMS) + pt->total_time[HDF5_FILE_READ_OPEN] += sub_time(&(pt->sys_timer[t]), &(pt->sys_timer[HDF5_GROSS_READ_FIXED_DIMS])); + + + } else { + struct timeval sys_t; + + HDgettimeofday(&sys_t, NULL); + pt->total_time[t] += sub_time(&sys_t, &(pt->sys_timer[t])); + + /* When we stop the timer for HDF5_GROSS_WRITE_FIXED_DIMS or HDF5_GROSS_READ_FIXED_DIMS + * we compute the time it took to close the file after the last read/write finished */ + if(t == HDF5_GROSS_WRITE_FIXED_DIMS) + pt->total_time[HDF5_FILE_WRITE_CLOSE] += sub_time(&(pt->sys_timer[t]), &(pt->sys_timer[HDF5_FINE_WRITE_FIXED_DIMS])); + else if(t == HDF5_GROSS_READ_FIXED_DIMS) + pt->total_time[HDF5_FILE_READ_CLOSE] += sub_time(&(pt->sys_timer[t]), &(pt->sys_timer[HDF5_FINE_READ_FIXED_DIMS])); + + } + break; + default: + fprintf(stderr, "Unknown time clock type (%d)\n", pt->type); + return (NULL); + break; + } + + debug_start_stop_time(pt, t, start_stop); + + return pt; +} + +/* + * Function: get_time + * Purpose: Get the time from a ``io_time_t'' object. + * Return: The number of seconds as a DOUBLE. + * Programmer: Bill Wendling, 01. October 2001 + * Modifications: + */ +double +get_time(io_time_t *pt, timer_type t) +{ + return pt->total_time[t]; +} + +#ifdef STANDALONE +#include "pio_standalone.c" +#endif |