summaryrefslogtreecommitdiffstats
path: root/perform/iopipe.c
diff options
context:
space:
mode:
authorAlbert Cheng <acheng@hdfgroup.org>2001-08-14 18:46:27 (GMT)
committerAlbert Cheng <acheng@hdfgroup.org>2001-08-14 18:46:27 (GMT)
commit22270493b018177ef8686778a6e471ccf39e0a66 (patch)
tree9124e364508d9d61ce23580fdb6ea22674976bab /perform/iopipe.c
parentc47f724187d516f9b7cd8c9e313f3e6dc7577530 (diff)
downloadhdf5-22270493b018177ef8686778a6e471ccf39e0a66.zip
hdf5-22270493b018177ef8686778a6e471ccf39e0a66.tar.gz
hdf5-22270493b018177ef8686778a6e471ccf39e0a66.tar.bz2
[svn-r4346] Purpose:
New feature Description: Started this directory for performance measurement programs. The programs here got compiled but not automatically run (just like the examples direcotry.) The programs have existed but now gathered to this one directory. iopipe.c, chunk.c and overhead.c were from test. perf.c and mpi-perf.c were from testpar. Platforms tested: eirene (serial and parallel). overhead failed during run due to some property error. This is probably due to the recent change of properties code. perf and mpi-perf do not compile correctly for Parallel mode. Checking them to make them available to others.
Diffstat (limited to 'perform/iopipe.c')
-rw-r--r--perform/iopipe.c546
1 files changed, 546 insertions, 0 deletions
diff --git a/perform/iopipe.c b/perform/iopipe.c
new file mode 100644
index 0000000..aa76369
--- /dev/null
+++ b/perform/iopipe.c
@@ -0,0 +1,546 @@
+/*
+ * Copyright (C) 1998 NCSA
+ * All rights reserved.
+ *
+ * Programmer: Robb Matzke <matzke@llnl.gov>
+ * Thursday, March 12, 1998
+ */
+
+/* See H5private.h for how to include headers */
+#undef NDEBUG
+#include "hdf5.h"
+
+#ifdef H5_HAVE_WINSOCK_H
+#include <Winsock.h>
+#endif
+
+/*Winsock.h includes windows.h, due to the different value of
+WINVER, windows.h should be put before H5private.h. Kent yang 6/21/2001*/
+
+#include "H5private.h"
+
+#ifdef H5_STDC_HEADERS
+# include <assert.h>
+# include <fcntl.h>
+# include <stdio.h>
+# include <string.h>
+# include <stdlib.h>
+#endif
+
+#ifdef H5_HAVE_UNISTD_H
+# include <sys/types.h>
+# include <unistd.h>
+#endif
+
+#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_SYS_RESOURCE_H
+# include <sys/resource.h>
+#endif
+
+
+
+#if defined (__MWERKS__)
+#ifdef H5_HAVE_SYS_TIMEB
+#undef H5_HAVE_SYS_TIMEB
+#endif
+#ifdef H5_HAVE_SYSTEM
+#undef H5_HAVE_SYSTEM
+#endif
+#endif /* __MWERKS__*/
+
+
+#ifdef H5_HAVE_SYS_TIMEB
+#include <sys/timeb.h>
+#endif
+
+
+#define RAW_FILE_NAME "iopipe.raw"
+#define HDF5_FILE_NAME "iopipe.h5"
+#define HEADING "%-16s"
+#define PROGRESS '='
+
+#if 0
+/* Normal testing */
+#define REQUEST_SIZE_X 4579
+#define REQUEST_SIZE_Y 4579
+#define NREAD_REQUESTS 45
+#define NWRITE_REQUESTS 45
+#else
+/* Speedy testing */
+#define REQUEST_SIZE_X 1000
+#define REQUEST_SIZE_Y 1000
+#define NREAD_REQUESTS 45
+#define NWRITE_REQUESTS 45
+#endif
+
+
+/*-------------------------------------------------------------------------
+ * Function: print_stats
+ *
+ * Purpose: Prints statistics
+ *
+ * Return: void
+ *
+ * Programmer: Robb Matzke
+ * Thursday, March 12, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifdef H5_HAVE_GETRUSAGE
+static void
+print_stats (const char *prefix,
+ struct rusage *r_start, struct rusage *r_stop,
+ struct timeval *t_start, struct timeval *t_stop,
+ size_t nbytes)
+#else /* H5_HAVE_GETRUSAGE */
+static void
+print_stats (const char *prefix,
+ struct timeval *r_start, struct timeval *r_stop,
+ struct timeval *t_start, struct timeval *t_stop,
+ size_t nbytes)
+#endif /* H5_HAVE_GETRUSAGE */
+{
+ double e_time, bw;
+#ifdef H5_HAVE_GETRUSAGE
+ double u_time, s_time;
+
+ u_time = ((double)(r_stop->ru_utime.tv_sec)+
+ (double)(r_stop->ru_utime.tv_usec)/1000000.0) -
+ ((double)(r_start->ru_utime.tv_sec)+
+ (double)(r_start->ru_utime.tv_usec)/1000000.0);
+
+ s_time = ((double)(r_stop->ru_stime.tv_sec)+
+ (double)(r_stop->ru_stime.tv_usec)/1000000.0) -
+ ((double)(r_start->ru_stime.tv_sec)+
+ (double)(r_start->ru_stime.tv_usec)/1000000.0);
+#endif
+#ifndef H5_HAVE_SYS_TIMEB
+ e_time = ((double)(t_stop->tv_sec)+
+ (double)(t_stop->tv_usec)/1000000.0) -
+ ((double)(t_start->tv_sec)+
+ (double)(t_start->tv_usec)/1000000.0);
+#else
+ e_time = ((double)(t_stop->tv_sec)+
+ (double)(t_stop->tv_usec)/1000.0) -
+ ((double)(t_start->tv_sec)+
+ (double)(t_start->tv_usec)/1000.0);
+#endif
+ bw = (double)nbytes / e_time;
+
+#ifdef H5_HAVE_GETRUSAGE
+ printf (HEADING "%1.2fuser %1.2fsystem %1.2felapsed %1.2fMB/s\n",
+ prefix, u_time, s_time, e_time, bw/(1024*1024));
+#else
+ printf (HEADING "%1.2felapsed %1.2fMB/s\n",
+ prefix, e_time, bw/(1024*1024));
+#endif
+
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: synchronize
+ *
+ * Purpose:
+ *
+ * Return: void
+ *
+ * Programmer: Robb Matzke
+ * Thursday, March 12, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+synchronize (void)
+{
+#ifdef H5_HAVE_SYSTEM
+#ifdef WIN32
+#ifdef __WATCOMC__
+ flushall();
+#else /* __WATCOMC__ */
+ _flushall();
+#endif /* __WATCOMC__ */
+#else
+ system ("sync");
+ system ("df >/dev/null");
+#endif
+#if 0
+ /*
+ * This works well on Linux to get rid of all cached disk buffers. The
+ * number should be approximately the amount of RAM in MB. Do not
+ * include swap space in that amount or the command will fail.
+ */
+ system ("/sbin/swapout 128");
+#endif
+#endif
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: main
+ *
+ * Purpose:
+ *
+ * Return: Success:
+ *
+ * Failure:
+ *
+ * Programmer: Robb Matzke
+ * Thursday, March 12, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+main (void)
+{
+ static hsize_t size[2] = {REQUEST_SIZE_X, REQUEST_SIZE_Y};
+ static int nread=NREAD_REQUESTS, nwrite=NWRITE_REQUESTS;
+
+ unsigned char *the_data = NULL;
+ hid_t file, dset, file_space=-1;
+ herr_t status;
+#ifdef H5_HAVE_GETRUSAGE
+ struct rusage r_start, r_stop;
+#else
+ struct timeval r_start, r_stop;
+#endif
+ struct timeval t_start, t_stop;
+ int i, fd;
+ hssize_t n;
+ off_t offset;
+ hssize_t start[2];
+ hsize_t count[2];
+
+
+#ifdef H5_HAVE_SYS_TIMEB
+ struct _timeb *tbstart = malloc(sizeof(struct _timeb));
+ struct _timeb *tbstop = malloc(sizeof(struct _timeb));
+#endif
+ /*
+ * The extra cast in the following statement is a bug workaround for the
+ * Win32 version 5.0 compiler.
+ * 1998-11-06 ptl
+ */
+ printf ("I/O request size is %1.1fMB\n",
+ (double)(hssize_t)(size[0]*size[1])/1024.0*1024);
+
+ /* Open the files */
+ file = H5Fcreate (HDF5_FILE_NAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+ assert (file>=0);
+ fd = HDopen (RAW_FILE_NAME, O_RDWR|O_CREAT|O_TRUNC, 0666);
+ assert (fd>=0);
+
+ /* Create the dataset */
+ file_space = H5Screate_simple (2, size, size);
+ assert (file_space>=0);
+ dset = H5Dcreate (file, "dset", H5T_NATIVE_UCHAR, file_space, H5P_DEFAULT);
+ assert (dset>=0);
+ the_data = malloc ((size_t)(size[0]*size[1]));
+ /*initial fill for lazy malloc*/
+ memset (the_data, 0xAA, (size_t)(size[0]*size[1]));
+
+ /* Fill raw */
+ synchronize ();
+#ifdef H5_HAVE_GETRUSAGE
+printf("Before getrusage() call\n");
+ getrusage (RUSAGE_SELF, &r_start);
+#endif
+#ifdef H5_HAVE_GETTIMEOFDAY
+ gettimeofday (&t_start, NULL);
+#else
+#ifdef H5_HAVE_SYS_TIMEB
+ _ftime(tbstart);
+#endif
+#endif
+ fprintf (stderr, HEADING, "fill raw");
+ for (i=0; i<nwrite; i++) {
+ putc (PROGRESS, stderr);
+ fflush (stderr);
+ memset (the_data, 0xAA, (size_t)(size[0]*size[1]));
+ }
+#ifdef H5_HAVE_GETRUSAGE
+ getrusage (RUSAGE_SELF, &r_stop);
+#endif
+#ifdef H5_HAVE_GETTIMEOFDAY
+ gettimeofday (&t_stop, NULL);
+#else
+#ifdef H5_HAVE_SYS_TIMEB
+ _ftime(tbstop);
+ t_start.tv_sec = tbstart->time;
+ t_start.tv_usec = tbstart->millitm;
+ t_stop.tv_sec = tbstop->time;
+ t_stop.tv_usec = tbstop->millitm;
+#endif
+#endif
+ putc ('\n', stderr);
+ print_stats ("fill raw",
+ &r_start, &r_stop, &t_start, &t_stop,
+ (size_t)(nread*size[0]*size[1]));
+
+
+ /* Fill hdf5 */
+ synchronize ();
+#ifdef H5_HAVE_GETRUSAGE
+ getrusage (RUSAGE_SELF, &r_start);
+#endif
+#ifdef H5_HAVE_GETTIMEOFDAY
+ gettimeofday (&t_start, NULL);
+#else
+#ifdef H5_HAVE_SYS_TIMEB
+ _ftime(tbstart);
+#endif
+#endif
+ fprintf (stderr, HEADING, "fill hdf5");
+ for (i=0; i<nread; i++) {
+ putc (PROGRESS, stderr);
+ fflush (stderr);
+ status = H5Dread (dset, H5T_NATIVE_UCHAR, file_space, file_space,
+ H5P_DEFAULT, the_data);
+ assert (status>=0);
+ }
+#ifdef H5_HAVE_GETRUSAGE
+ getrusage (RUSAGE_SELF, &r_stop);
+#endif
+#ifdef H5_HAVE_GETTIMEOFDAY
+ gettimeofday (&t_stop, NULL);
+#else
+#ifdef H5_HAVE_SYS_TIMEB
+ _ftime(tbstop);
+ t_start.tv_sec = tbstart->time;
+ t_start.tv_usec = tbstart->millitm;
+ t_stop.tv_sec = tbstop->time;
+ t_stop.tv_usec = tbstop->millitm;
+#endif
+#endif
+ putc ('\n', stderr);
+ print_stats ("fill hdf5",
+ &r_start, &r_stop, &t_start, &t_stop,
+ (size_t)(nread*size[0]*size[1]));
+
+ /* Write the raw dataset */
+ synchronize ();
+#ifdef H5_HAVE_GETRUSAGE
+ getrusage (RUSAGE_SELF, &r_start);
+#endif
+#ifdef H5_HAVE_GETTIMEOFDAY
+ gettimeofday (&t_start, NULL);
+#else
+#ifdef H5_HAVE_SYS_TIMEB
+ _ftime(tbstart);
+#endif
+#endif
+ fprintf (stderr, HEADING, "out raw");
+ for (i=0; i<nwrite; i++) {
+ putc (PROGRESS, stderr);
+ fflush (stderr);
+ offset = lseek (fd, 0, SEEK_SET);
+ assert (0==offset);
+ n = write (fd, the_data, (size_t)(size[0]*size[1]));
+ assert (n>=0 && (size_t)n==size[0]*size[1]);
+ }
+#ifdef H5_HAVE_GETRUSAGE
+ getrusage (RUSAGE_SELF, &r_stop);
+#endif
+#ifdef H5_HAVE_GETTIMEOFDAY
+ gettimeofday (&t_stop, NULL);
+#else
+#ifdef H5_HAVE_SYS_TIMEB
+ _ftime(tbstop);
+ t_start.tv_sec = tbstart->time;
+ t_start.tv_usec = tbstart->millitm;
+ t_stop.tv_sec = tbstop->time;
+ t_stop.tv_usec = tbstop->millitm;
+#endif
+#endif
+ putc ('\n', stderr);
+ print_stats ("out raw",
+ &r_start, &r_stop, &t_start, &t_stop,
+ (size_t)(nread*size[0]*size[1]));
+
+ /* Write the hdf5 dataset */
+ synchronize ();
+#ifdef H5_HAVE_GETRUSAGE
+ getrusage (RUSAGE_SELF, &r_start);
+#endif
+#ifdef H5_HAVE_GETTIMEOFDAY
+ gettimeofday (&t_start, NULL);
+#else
+#ifdef H5_HAVE_SYS_TIMEB
+ _ftime(tbstart);
+#endif
+#endif
+ fprintf (stderr, HEADING, "out hdf5");
+ for (i=0; i<nwrite; i++) {
+ putc (PROGRESS, stderr);
+ fflush (stderr);
+ status = H5Dwrite (dset, H5T_NATIVE_UCHAR, H5S_ALL, H5S_ALL,
+ H5P_DEFAULT, the_data);
+ assert (status>=0);
+ }
+#ifdef H5_HAVE_GETRUSAGE
+ getrusage (RUSAGE_SELF, &r_stop);
+#endif
+#ifdef H5_HAVE_GETTIMEOFDAY
+ gettimeofday (&t_stop, NULL);
+#else
+#ifdef H5_HAVE_SYS_TIMEB
+ _ftime(tbstop);
+ t_start.tv_sec = tbstart->time;
+ t_start.tv_usec = tbstart->millitm;
+ t_stop.tv_sec = tbstop->time;
+ t_stop.tv_usec = tbstop->millitm;
+#endif
+#endif
+ putc ('\n', stderr);
+ print_stats ("out hdf5",
+ &r_start, &r_stop, &t_start, &t_stop,
+ (size_t)(nread*size[0]*size[1]));
+
+ /* Read the raw dataset */
+ synchronize ();
+#ifdef H5_HAVE_GETRUSAGE
+ getrusage (RUSAGE_SELF, &r_start);
+#endif
+#ifdef H5_HAVE_GETTIMEOFDAY
+ gettimeofday (&t_start, NULL);
+#else
+#ifdef H5_HAVE_SYS_TIMEB
+ _ftime(tbstart);
+#endif
+#endif
+ fprintf (stderr, HEADING, "in raw");
+ for (i=0; i<nread; i++) {
+ putc (PROGRESS, stderr);
+ fflush (stderr);
+ offset = lseek (fd, 0, SEEK_SET);
+ assert (0==offset);
+ n = read (fd, the_data, (size_t)(size[0]*size[1]));
+ assert (n>=0 && (size_t)n==size[0]*size[1]);
+ }
+#ifdef H5_HAVE_GETRUSAGE
+ getrusage (RUSAGE_SELF, &r_stop);
+#endif
+#ifdef H5_HAVE_GETTIMEOFDAY
+ gettimeofday (&t_stop, NULL);
+#else
+#ifdef H5_HAVE_SYS_TIMEB
+ _ftime(tbstop);
+ t_start.tv_sec = tbstart->time;
+ t_start.tv_usec = tbstart->millitm;
+ t_stop.tv_sec = tbstop->time;
+ t_stop.tv_usec = tbstop->millitm;
+#endif
+#endif
+ putc ('\n', stderr);
+ print_stats ("in raw",
+ &r_start, &r_stop, &t_start, &t_stop,
+ (size_t)(nread*size[0]*size[1]));
+
+
+ /* Read the hdf5 dataset */
+ synchronize ();
+#ifdef H5_HAVE_GETRUSAGE
+ getrusage (RUSAGE_SELF, &r_start);
+#endif
+#ifdef H5_HAVE_GETTIMEOFDAY
+ gettimeofday (&t_start, NULL);
+#else
+#ifdef H5_HAVE_SYS_TIMEB
+ _ftime(tbstart);
+#endif
+#endif
+ fprintf (stderr, HEADING, "in hdf5");
+ for (i=0; i<nread; i++) {
+ putc (PROGRESS, stderr);
+ fflush (stderr);
+ status = H5Dread (dset, H5T_NATIVE_UCHAR, file_space, file_space,
+ H5P_DEFAULT, the_data);
+ assert (status>=0);
+ }
+#ifdef H5_HAVE_GETRUSAGE
+ getrusage (RUSAGE_SELF, &r_stop);
+#endif
+#ifdef H5_HAVE_GETTIMEOFDAY
+ gettimeofday (&t_stop, NULL);
+#else
+#ifdef H5_HAVE_SYS_TIMEB
+ _ftime(tbstop);
+ t_start.tv_sec = tbstart->time;
+ t_start.tv_usec = tbstart->millitm;
+ t_stop.tv_sec = tbstop->time;
+ t_stop.tv_usec = tbstop->millitm;
+#endif
+#endif
+ putc ('\n', stderr);
+ print_stats ("in hdf5",
+ &r_start, &r_stop, &t_start, &t_stop,
+ (size_t)(nread*size[0]*size[1]));
+
+ /* Read hyperslab */
+ assert (size[0]>20 && size[1]>20);
+ start[0] = start[1] = 10;
+ count[0] = count[1] = size[0]-20;
+ status = H5Sselect_hyperslab (file_space, H5S_SELECT_SET, start, NULL, count, NULL);
+ assert (status>=0);
+ synchronize ();
+#ifdef H5_HAVE_GETRUSAGE
+ getrusage (RUSAGE_SELF, &r_start);
+#endif
+#ifdef H5_HAVE_GETTIMEOFDAY
+ gettimeofday (&t_start, NULL);
+#else
+#ifdef H5_HAVE_SYS_TIMEB
+ _ftime(tbstart);
+#endif
+#endif
+ fprintf (stderr, HEADING, "in hdf5 partial");
+ for (i=0; i<nread; i++) {
+ putc (PROGRESS, stderr);
+ fflush (stderr);
+ status = H5Dread (dset, H5T_NATIVE_UCHAR, file_space, file_space,
+ H5P_DEFAULT, the_data);
+ assert (status>=0);
+ }
+#ifdef H5_HAVE_GETRUSAGE
+ getrusage (RUSAGE_SELF, &r_stop);
+#endif
+#ifdef H5_HAVE_GETTIMEOFDAY
+ gettimeofday (&t_stop, NULL);
+#else
+#ifdef H5_HAVE_SYS_TIMEB
+ _ftime(tbstop);
+ t_start.tv_sec = tbstart->time;
+ t_start.tv_usec = tbstart->millitm;
+ t_stop.tv_sec = tbstop->time;
+ t_stop.tv_usec = tbstop->millitm;
+#endif
+#endif
+ putc ('\n', stderr);
+ print_stats ("in hdf5 partial",
+ &r_start, &r_stop, &t_start, &t_stop,
+ (size_t)(nread*count[0]*count[1]));
+
+
+
+ /* Close everything */
+ HDclose (fd);
+ H5Dclose (dset);
+ H5Sclose (file_space);
+ H5Fclose (file);
+
+ return 0;
+}