#include #include #include #include #include #include #include "Arch.h" #include "IO.hh" #include "IEEEIO.hh" #include "HDFIO.hh" #include "FlexArrayTmpl.H" #define f_openf77 F77NAME(openf77_,openf77,OPENF77) #define f_writef77 F77NAME(writef77_,writef77,WRITEF77) #define f_closef77 F77NAME(closef77_,closef77,CLOSEF77) extern "C" { void f_openf77(); void f_writef77(double *data); void f_closef77(); } //typedef FlexArray FloatVector; // //class fVectorStatistics : public FloatVector { // fVectorStatistics(int sz=0):FloatVector(sz){} //}; struct ResultRecord { float usertime,systemtime,realtime,combined,nbytes,megs_per_second; // ResultRecord():usertime(0),systemtime(0),realtime(0), // combined(0),nbytes(0),megs_per_second(0){} }; #define ClearLine fprintf(stderr,"\r \r") struct ResultRecordList { FlexArray results; ResultRecord average_results; ResultRecordList(){} void append(ResultRecord &rec); ResultRecord &operator[](int index){ return results[index]; } }; void ResultRecordList::append(ResultRecord &rec){ int idx=results.getSize(); float nrecs=(float)idx; results.append(rec); average_results.usertime=(average_results.usertime*nrecs+rec.usertime)/(nrecs+1); average_results.systemtime=(average_results.systemtime*nrecs+rec.systemtime)/(nrecs+1); average_results.realtime=(average_results.realtime*nrecs+rec.realtime)/(nrecs+1); average_results.combined=(average_results.combined*nrecs+rec.combined)/(nrecs+1); average_results.nbytes=(average_results.nbytes*nrecs+rec.nbytes)/(nrecs+1); rec.megs_per_second = (double)(rec.nbytes)/(1024.0L*1024.0L*(double)rec.realtime); average_results.megs_per_second = (average_results.megs_per_second*nrecs+rec.megs_per_second)/(nrecs+1); } void main(int argc,char *argv[]){ double data[64*64*64]; int dims[3]={64,64,64}; int i,nds; int ntests; struct tms stms,etms; struct timeval stmv,etmv; double srt,ert; ResultRecordList ieeeio_results,f77_results,hdf_results; if(argc>1){ ntests=atoi(argv[1]); printf("Ntests=%u\n",ntests); } else { ntests=1; } for(int tst=0;tst "); times(&stms); gettimeofday(&stmv); IObase *file = new IEEEIO("speed.raw",IObase::Write); fprintf(stderr,"Write %2u datasets:",nds); for(int n=0;nwrite(IObase::Float64,3,dims,data); } delete file; gettimeofday(&etmv); times(&etms); // times after close to account for buffer flushing puts(""); ert=(double)etmv.tv_sec + (double)etmv.tv_usec/1000000.0L; srt=(double)stmv.tv_sec + (double)stmv.tv_usec/1000000.0L; results.realtime = ert-srt; results.usertime = (float)(etms.tms_utime-stms.tms_utime)/CLK_TCK; results.systemtime = (float)(etms.tms_stime-stms.tms_stime)/CLK_TCK; results.combined = (float)(etms.tms_utime-stms.tms_utime+ etms.tms_stime-stms.tms_stime)/CLK_TCK; results.nbytes = (float)(nds*IObase::nBytes(IObase::Float64,3,dims)); ieeeio_results.append(results); } puts("--------------HDF---------------"); for(i=0,nds=5;i<8;i++,nds+=5){ fprintf(stderr,"HDF "); times(&stms); gettimeofday(&stmv); IObase *file = new HDFIO("speed.hdf",IObase::Write); fprintf(stderr,"Write %2u datasets:",nds); for(int n=0;nwrite(IObase::Float64,3,dims,data); } delete file; gettimeofday(&etmv); times(&etms); // times after close to account for buffer flushing puts(""); ert=(double)etmv.tv_sec + (double)etmv.tv_usec/1000000.0L; srt=(double)stmv.tv_sec + (double)stmv.tv_usec/1000000.0L; results.realtime = ert-srt; results.usertime = (float)(etms.tms_utime-stms.tms_utime)/CLK_TCK; results.systemtime = (float)(etms.tms_stime-stms.tms_stime)/CLK_TCK; results.combined = (float)(etms.tms_utime-stms.tms_utime+ etms.tms_stime-stms.tms_stime)/CLK_TCK; results.nbytes = (float)(nds*IObase::nBytes(IObase::Float64,3,dims)); hdf_results.append(results); } puts("-------------F77 Unformatted---------------"); for(i=0,nds=5;i<8;i++,nds+=5){ fprintf(stderr,"F77 Unf "); times(&stms); gettimeofday(&stmv); f_openf77(); fprintf(stderr,"Write %2u datasets:",nds); for(int n=0;n