From c803666ec2330ef548e65bb3699c0f89d2adb45d Mon Sep 17 00:00:00 2001 From: Albert Cheng Date: Thu, 1 Jan 2015 11:24:55 -0500 Subject: [svn-r25940] HDFFV-9046: reorganize hdf5/perform, step 2 Move timing measurement routines used by h5perf and h5perf_serial to tools/lib so that they can be used by other tools too. tools/lib/io_timer.c tools/lib/io_timer.h tools/perform/io_timer.c tools/perform/io_timer.h renamed perform/io_timer.[ch] to lib/io_timer.[ch] tools/lib/Makefile.am tools/lib/Makefile.in tools/lib/CMakeLists.txt tools/perform/Makefile.in tools/perform/Makefile.am tools/perform/CMakeLists.txt MANIFEST updated due to the move. Tested; h5committest and jam (serial) --- MANIFEST | 4 +- tools/lib/CMakeLists.txt | 1 + tools/lib/Makefile.am | 2 +- tools/lib/Makefile.in | 5 +- tools/lib/io_timer.c | 225 +++++++++++++++++++++++++++++++++++++++++++ tools/lib/io_timer.h | 94 ++++++++++++++++++ tools/perform/CMakeLists.txt | 4 - tools/perform/Makefile.am | 4 +- tools/perform/Makefile.in | 11 +-- tools/perform/io_timer.c | 225 ------------------------------------------- tools/perform/io_timer.h | 94 ------------------ 11 files changed, 332 insertions(+), 337 deletions(-) create mode 100644 tools/lib/io_timer.c create mode 100644 tools/lib/io_timer.h delete mode 100644 tools/perform/io_timer.c delete mode 100644 tools/perform/io_timer.h diff --git a/MANIFEST b/MANIFEST index 0dcb308..fbc4a1e 100644 --- a/MANIFEST +++ b/MANIFEST @@ -1295,6 +1295,8 @@ ./tools/lib/h5tools_type.c ./tools/lib/ph5diff.h ./tools/lib/h5tools_error.h +./tools/lib/io_timer.c +./tools/lib/io_timer.h ./tools/misc/Makefile.am ./tools/misc/Makefile.in @@ -2219,8 +2221,6 @@ ./tools/perform/pio_perf.h ./tools/perform/pio_standalone.c ./tools/perform/pio_standalone.h -./tools/perform/io_timer.c -./tools/perform/io_timer.h ./tools/perform/sio_engine.c ./tools/perform/sio_perf.c ./tools/perform/sio_perf.h diff --git a/tools/lib/CMakeLists.txt b/tools/lib/CMakeLists.txt index e65673a..3dba919 100644 --- a/tools/lib/CMakeLists.txt +++ b/tools/lib/CMakeLists.txt @@ -24,6 +24,7 @@ set (H5_TOOLS_LIB_SRCS ${HDF5_TOOLS_LIB_SOURCE_DIR}/h5tools_type.c ${HDF5_TOOLS_LIB_SOURCE_DIR}/h5tools_utils.c ${HDF5_TOOLS_LIB_SOURCE_DIR}/h5trav.c + ${HDF5_TOOLS_LIB_SOURCE_DIR}/io_timer.c ) set (H5_TOOLS_LIB_HDRS diff --git a/tools/lib/Makefile.am b/tools/lib/Makefile.am index 9050aac..e8fc6a1 100644 --- a/tools/lib/Makefile.am +++ b/tools/lib/Makefile.am @@ -28,7 +28,7 @@ noinst_LTLIBRARIES=libh5tools.la libh5tools_la_SOURCES=h5tools.c h5tools_dump.c h5tools_str.c h5tools_utils.c h5diff.c \ h5diff_array.c h5diff_attr.c h5diff_dset.c h5diff_util.c h5trav.c \ - h5tools_filters.c h5tools_ref.c h5tools_type.c + h5tools_filters.c h5tools_ref.c h5tools_type.c io_timer.c # Test program. Link using libhdf5 and libh5tools TEST_PROG= diff --git a/tools/lib/Makefile.in b/tools/lib/Makefile.in index 210b6b3..b2afb07 100644 --- a/tools/lib/Makefile.in +++ b/tools/lib/Makefile.in @@ -115,7 +115,7 @@ libh5tools_la_LIBADD = am_libh5tools_la_OBJECTS = h5tools.lo h5tools_dump.lo h5tools_str.lo \ h5tools_utils.lo h5diff.lo h5diff_array.lo h5diff_attr.lo \ h5diff_dset.lo h5diff_util.lo h5trav.lo h5tools_filters.lo \ - h5tools_ref.lo h5tools_type.lo + h5tools_ref.lo h5tools_type.lo io_timer.lo libh5tools_la_OBJECTS = $(am_libh5tools_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) @@ -666,7 +666,7 @@ CHECK_CLEANFILES = *.chkexe *.chklog *.clog noinst_LTLIBRARIES = libh5tools.la libh5tools_la_SOURCES = h5tools.c h5tools_dump.c h5tools_str.c h5tools_utils.c h5diff.c \ h5diff_array.c h5diff_attr.c h5diff_dset.c h5diff_util.c h5trav.c \ - h5tools_filters.c h5tools_ref.c h5tools_type.c + h5tools_filters.c h5tools_ref.c h5tools_type.c io_timer.c # Test program. Link using libhdf5 and libh5tools @@ -773,6 +773,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/h5tools_type.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/h5tools_utils.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/h5trav.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/io_timer.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< diff --git a/tools/lib/io_timer.c b/tools/lib/io_timer.c new file mode 100644 index 0000000..efe909d --- /dev/null +++ b/tools/lib/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 +#include + +#include "hdf5.h" + +#ifdef H5_HAVE_PARALLEL +#include +#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 diff --git a/tools/lib/io_timer.h b/tools/lib/io_timer.h new file mode 100644 index 0000000..5480ed5 --- /dev/null +++ b/tools/lib/io_timer.h @@ -0,0 +1,94 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Copyright by The HDF Group. * + * Copyright by the Board of Trustees of the University of Illinois. * + * 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. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +#ifndef IO_TIMER__ +#define IO_TIMER__ + +#include "hdf5.h" +#include "H5private.h" + +#if defined(H5_TIME_WITH_SYS_TIME) +# include +# include +#elif defined(H5_HAVE_SYS_TIME_H) +# include +#else +# include +#endif + +#ifdef H5_HAVE_WINSOCK2_H +# include +#endif /* H5_HAVE_WINSOCK2_H */ +/* The different types of timers we can have */ +typedef enum timer_type_ { + HDF5_FILE_OPENCLOSE, + HDF5_DATASET_CREATE, + HDF5_MPI_WRITE, + HDF5_MPI_READ, + HDF5_FILE_READ_OPEN, + HDF5_FILE_READ_CLOSE, + HDF5_FILE_WRITE_OPEN, + HDF5_FILE_WRITE_CLOSE, + HDF5_FINE_WRITE_FIXED_DIMS, + HDF5_FINE_READ_FIXED_DIMS, + HDF5_GROSS_WRITE_FIXED_DIMS, + HDF5_GROSS_READ_FIXED_DIMS, + HDF5_RAW_WRITE_FIXED_DIMS, + HDF5_RAW_READ_FIXED_DIMS, + NUM_TIMERS +} timer_type; + +typedef enum clock_type_ { + SYS_CLOCK = 0, /* Use system clock to measure time */ + MPI_CLOCK = 1 /* Use MPI clock to measure time */ +} clock_type; + +/* Miscellaneous identifiers */ +enum { + TSTART, /* Start a specified timer */ + TSTOP /* Stop a specified timer */ +}; + +/* The performance time structure */ +typedef struct io_time_t { + clock_type type; + double total_time[NUM_TIMERS]; + double mpi_timer[NUM_TIMERS]; + struct timeval sys_timer[NUM_TIMERS]; +} io_time_t; + +/* External function declarations */ +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ +#if 1 +/* from sio_time.h */ +//extern io_time_t *sio_time_new(void); +//extern void sio_time_destroy(io_time_t *pt); +//extern void set_timer_type(io_time_t *pt); +//extern io_time_t *set_time(io_time_t *pt, timer_type t, int start_stop); +//extern double get_time(io_time_t *pt, timer_type t); +#endif +extern io_time_t *io_time_new(clock_type t); +extern void io_time_destroy(io_time_t *pt); +//extern void set_timer_type(io_time_t *pt, clock_type type); +//extern clock_type get_timer_type(io_time_t *pt); +extern io_time_t *set_time(io_time_t *pt, timer_type t, int start_stop); +extern double get_time(io_time_t *pt, timer_type t); +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* IO_TIMER__ */ diff --git a/tools/perform/CMakeLists.txt b/tools/perform/CMakeLists.txt index a54664a..0713661 100644 --- a/tools/perform/CMakeLists.txt +++ b/tools/perform/CMakeLists.txt @@ -17,7 +17,6 @@ INCLUDE_DIRECTORIES (${HDF5_TOOLS_SRC_DIR}/lib ) # -------------------------------------------------------------------- #-- Adding test for h5perf_serial set (h5perf_serial_SRCS - ${HDF5_PERFORM_SOURCE_DIR}/io_timer.c ${HDF5_PERFORM_SOURCE_DIR}/sio_perf.c ${HDF5_PERFORM_SOURCE_DIR}/sio_engine.c ) @@ -30,7 +29,6 @@ set_target_properties (h5perf_serial PROPERTIES FOLDER perform) if (HDF5_BUILD_PERFORM_STANDALONE) #-- Adding test for h5perf_serial_alone set (h5perf_serial_alone_SRCS - ${HDF5_PERFORM_SOURCE_DIR}/io_timer.c ${HDF5_PERFORM_SOURCE_DIR}/sio_perf.c ${HDF5_PERFORM_SOURCE_DIR}/sio_engine.c ) @@ -99,7 +97,6 @@ set_target_properties (zip_perf PROPERTIES FOLDER perform) if (H5_HAVE_PARALLEL AND BUILD_TESTING) #-- Adding test for h5perf set (h5perf_SRCS - ${HDF5_PERFORM_SOURCE_DIR}/io_timer.c ${HDF5_PERFORM_SOURCE_DIR}/pio_perf.c ${HDF5_PERFORM_SOURCE_DIR}/pio_engine.c ) @@ -112,7 +109,6 @@ if (H5_HAVE_PARALLEL AND BUILD_TESTING) if (HDF5_BUILD_PERFORM_STANDALONE) #-- Adding test for h5perf set (h5perf_alone_SRCS - ${HDF5_PERFORM_SOURCE_DIR}/io_timer.c ${HDF5_PERFORM_SOURCE_DIR}/pio_perf.c ${HDF5_PERFORM_SOURCE_DIR}/pio_engine.c ) diff --git a/tools/perform/Makefile.am b/tools/perform/Makefile.am index 265c5cf..1af0e7f 100644 --- a/tools/perform/Makefile.am +++ b/tools/perform/Makefile.am @@ -59,8 +59,8 @@ TEST_PROG = iopipe chunk overhead zip_perf perf_meta h5perf_serial $(BUILD_ALL_P # "make clean" and some systems, e.g., AIX, do not like it. check_PROGRAMS= iopipe chunk overhead zip_perf perf_meta $(BUILD_ALL_PROGS) perf -h5perf_SOURCES=pio_perf.c pio_engine.c io_timer.c -h5perf_serial_SOURCES=sio_perf.c sio_engine.c io_timer.c +h5perf_SOURCES=pio_perf.c pio_engine.c +h5perf_serial_SOURCES=sio_perf.c sio_engine.c # These are the files that `make clean' (and derivatives) will remove from # this directory. diff --git a/tools/perform/Makefile.in b/tools/perform/Makefile.in index 7ea71a7..24aa8be 100644 --- a/tools/perform/Makefile.in +++ b/tools/perform/Makefile.in @@ -130,15 +130,13 @@ AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = -am_h5perf_OBJECTS = pio_perf.$(OBJEXT) pio_engine.$(OBJEXT) \ - io_timer.$(OBJEXT) +am_h5perf_OBJECTS = pio_perf.$(OBJEXT) pio_engine.$(OBJEXT) h5perf_OBJECTS = $(am_h5perf_OBJECTS) h5perf_DEPENDENCIES = $(LIBH5TOOLS) $(LIBH5TEST) $(LIBHDF5) h5perf_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(h5perf_LDFLAGS) $(LDFLAGS) -o $@ -am_h5perf_serial_OBJECTS = sio_perf.$(OBJEXT) sio_engine.$(OBJEXT) \ - io_timer.$(OBJEXT) +am_h5perf_serial_OBJECTS = sio_perf.$(OBJEXT) sio_engine.$(OBJEXT) h5perf_serial_OBJECTS = $(am_h5perf_serial_OBJECTS) h5perf_serial_DEPENDENCIES = $(LIBH5TOOLS) $(LIBH5TEST) $(LIBHDF5) h5perf_serial_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ @@ -723,8 +721,8 @@ h5perf_serial_LDFLAGS = $(LT_STATIC_EXEC) $(AM_LDFLAGS) @BUILD_PARALLEL_CONDITIONAL_TRUE@TEST_PROG_PARA = h5perf perf # Serial test programs. TEST_PROG = iopipe chunk overhead zip_perf perf_meta h5perf_serial $(BUILD_ALL_PROGS) -h5perf_SOURCES = pio_perf.c pio_engine.c io_timer.c -h5perf_serial_SOURCES = sio_perf.c sio_engine.c io_timer.c +h5perf_SOURCES = pio_perf.c pio_engine.c +h5perf_serial_SOURCES = sio_perf.c sio_engine.c # These are the files that `make clean' (and derivatives) will remove from # this directory. @@ -892,7 +890,6 @@ distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/chunk.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/io_timer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iopipe.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/overhead.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/perf.Po@am__quote@ diff --git a/tools/perform/io_timer.c b/tools/perform/io_timer.c deleted file mode 100644 index efe909d..0000000 --- a/tools/perform/io_timer.c +++ /dev/null @@ -1,225 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * 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 -#include - -#include "hdf5.h" - -#ifdef H5_HAVE_PARALLEL -#include -#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 diff --git a/tools/perform/io_timer.h b/tools/perform/io_timer.h deleted file mode 100644 index 5480ed5..0000000 --- a/tools/perform/io_timer.h +++ /dev/null @@ -1,94 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright by The HDF Group. * - * Copyright by the Board of Trustees of the University of Illinois. * - * 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. * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -#ifndef IO_TIMER__ -#define IO_TIMER__ - -#include "hdf5.h" -#include "H5private.h" - -#if defined(H5_TIME_WITH_SYS_TIME) -# include -# include -#elif defined(H5_HAVE_SYS_TIME_H) -# include -#else -# include -#endif - -#ifdef H5_HAVE_WINSOCK2_H -# include -#endif /* H5_HAVE_WINSOCK2_H */ -/* The different types of timers we can have */ -typedef enum timer_type_ { - HDF5_FILE_OPENCLOSE, - HDF5_DATASET_CREATE, - HDF5_MPI_WRITE, - HDF5_MPI_READ, - HDF5_FILE_READ_OPEN, - HDF5_FILE_READ_CLOSE, - HDF5_FILE_WRITE_OPEN, - HDF5_FILE_WRITE_CLOSE, - HDF5_FINE_WRITE_FIXED_DIMS, - HDF5_FINE_READ_FIXED_DIMS, - HDF5_GROSS_WRITE_FIXED_DIMS, - HDF5_GROSS_READ_FIXED_DIMS, - HDF5_RAW_WRITE_FIXED_DIMS, - HDF5_RAW_READ_FIXED_DIMS, - NUM_TIMERS -} timer_type; - -typedef enum clock_type_ { - SYS_CLOCK = 0, /* Use system clock to measure time */ - MPI_CLOCK = 1 /* Use MPI clock to measure time */ -} clock_type; - -/* Miscellaneous identifiers */ -enum { - TSTART, /* Start a specified timer */ - TSTOP /* Stop a specified timer */ -}; - -/* The performance time structure */ -typedef struct io_time_t { - clock_type type; - double total_time[NUM_TIMERS]; - double mpi_timer[NUM_TIMERS]; - struct timeval sys_timer[NUM_TIMERS]; -} io_time_t; - -/* External function declarations */ -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ -#if 1 -/* from sio_time.h */ -//extern io_time_t *sio_time_new(void); -//extern void sio_time_destroy(io_time_t *pt); -//extern void set_timer_type(io_time_t *pt); -//extern io_time_t *set_time(io_time_t *pt, timer_type t, int start_stop); -//extern double get_time(io_time_t *pt, timer_type t); -#endif -extern io_time_t *io_time_new(clock_type t); -extern void io_time_destroy(io_time_t *pt); -//extern void set_timer_type(io_time_t *pt, clock_type type); -//extern clock_type get_timer_type(io_time_t *pt); -extern io_time_t *set_time(io_time_t *pt, timer_type t, int start_stop); -extern double get_time(io_time_t *pt, timer_type t); -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* IO_TIMER__ */ -- cgit v0.12