/* * Copyright (C) 1998 NCSA * All rights reserved. * * Programmer: Robb Matzke * Thursday, March 12, 1998 */ /* See H5private.h for how to include headers */ #undef NDEBUG #include #ifdef STDC_HEADERS # include # include # include # include # include #endif #ifdef HAVE_UNISTD_H # include # include #endif #if defined(TIME_WITH_SYS_TIME) # include # include #elif defined(HAVE_SYS_TIME_H) # include #else # include #endif #ifdef HAVE_SYS_RESOURCE_H # include #endif #ifdef HAVE_WINSOCK_H #include #endif #include #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: * *------------------------------------------------------------------------- */ 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) { double e_time, bw; #ifdef 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 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); bw = (double)nbytes / e_time; #ifdef 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 HAVE_SYSTEM system ("sync"); system ("df >/dev/null"); #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 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]; /* * The extra cast in the following statement is a bug workaround for the * Win32 version 0.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 = open (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 HAVE_GETRUSAGE getrusage (RUSAGE_SELF, &r_start); #endif #ifdef HAVE_GETTIMEOFDAY gettimeofday (&t_start, NULL); #endif fprintf (stderr, HEADING, "fill raw"); for (i=0; i=0); } #ifdef HAVE_GETRUSAGE getrusage (RUSAGE_SELF, &r_stop); #endif #ifdef HAVE_GETTIMEOFDAY gettimeofday (&t_stop, NULL); #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 HAVE_GETRUSAGE getrusage (RUSAGE_SELF, &r_start); #endif #ifdef HAVE_GETTIMEOFDAY gettimeofday (&t_start, NULL); #endif fprintf (stderr, HEADING, "out raw"); for (i=0; i=0 && (size_t)n==size[0]*size[1]); } #ifdef HAVE_GETRUSAGE getrusage (RUSAGE_SELF, &r_stop); #endif #ifdef HAVE_GETTIMEOFDAY gettimeofday (&t_stop, NULL); #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 HAVE_GETRUSAGE getrusage (RUSAGE_SELF, &r_start); #endif #ifdef HAVE_GETTIMEOFDAY gettimeofday (&t_start, NULL); #endif fprintf (stderr, HEADING, "out hdf5"); for (i=0; i=0); } #ifdef HAVE_GETRUSAGE getrusage (RUSAGE_SELF, &r_stop); #endif #ifdef HAVE_GETTIMEOFDAY gettimeofday (&t_stop, NULL); #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 HAVE_GETRUSAGE getrusage (RUSAGE_SELF, &r_start); #endif #ifdef HAVE_GETTIMEOFDAY gettimeofday (&t_start, NULL); #endif fprintf (stderr, HEADING, "in raw"); for (i=0; i=0 && (size_t)n==size[0]*size[1]); } #ifdef HAVE_GETRUSAGE getrusage (RUSAGE_SELF, &r_stop); #endif #ifdef HAVE_GETTIMEOFDAY gettimeofday (&t_stop, NULL); #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 HAVE_GETRUSAGE getrusage (RUSAGE_SELF, &r_start); #endif #ifdef HAVE_GETTIMEOFDAY gettimeofday (&t_start, NULL); #endif fprintf (stderr, HEADING, "in hdf5"); for (i=0; i=0); } #ifdef HAVE_GETRUSAGE getrusage (RUSAGE_SELF, &r_stop); #endif #ifdef HAVE_GETTIMEOFDAY gettimeofday (&t_stop, NULL); #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 HAVE_GETRUSAGE getrusage (RUSAGE_SELF, &r_start); #endif #ifdef HAVE_GETTIMEOFDAY gettimeofday (&t_start, NULL); #endif fprintf (stderr, HEADING, "in hdf5 partial"); for (i=0; i=0); } #ifdef HAVE_GETRUSAGE getrusage (RUSAGE_SELF, &r_stop); #endif #ifdef HAVE_GETTIMEOFDAY gettimeofday (&t_stop, NULL); #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 */ close (fd); H5Dclose (dset); H5Sclose (file_space); H5Fclose (file); return 0; }