summaryrefslogtreecommitdiffstats
path: root/tools/lib
diff options
context:
space:
mode:
authorAlbert Cheng <acheng@hdfgroup.org>2015-01-01 16:24:55 (GMT)
committerAlbert Cheng <acheng@hdfgroup.org>2015-01-01 16:24:55 (GMT)
commitc803666ec2330ef548e65bb3699c0f89d2adb45d (patch)
tree1f0437e96b9872b43cc941976c84a8284c5a87fa /tools/lib
parentdcc956f5941b01e9ce50d02b37bdcea14c5fb06b (diff)
downloadhdf5-c803666ec2330ef548e65bb3699c0f89d2adb45d.zip
hdf5-c803666ec2330ef548e65bb3699c0f89d2adb45d.tar.gz
hdf5-c803666ec2330ef548e65bb3699c0f89d2adb45d.tar.bz2
[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)
Diffstat (limited to 'tools/lib')
-rw-r--r--tools/lib/CMakeLists.txt1
-rw-r--r--tools/lib/Makefile.am2
-rw-r--r--tools/lib/Makefile.in5
-rw-r--r--tools/lib/io_timer.c225
-rw-r--r--tools/lib/io_timer.h94
5 files changed, 324 insertions, 3 deletions
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 <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
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 <sys/time.h>
+# include <time.h>
+#elif defined(H5_HAVE_SYS_TIME_H)
+# include <sys/time.h>
+#else
+# include <time.h>
+#endif
+
+#ifdef H5_HAVE_WINSOCK2_H
+# include <winsock2.h>
+#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__ */