1d080569aSCameron Smith #include <mpi.h> 2064bab1dSCameron Smith #include <stdio.h> 3064bab1dSCameron Smith #include <stdlib.h> 4d080569aSCameron Smith #include <cassert> 536adee64SCameron Smith #include <cstring> 6064bab1dSCameron Smith #include <string> 736adee64SCameron Smith #include <sstream> 8d1293ce9SCameron Smith #include "phIO.h" 9d1293ce9SCameron Smith #include "phComm.h" 10064bab1dSCameron Smith #include "phio_base.h" 11d080569aSCameron Smith #include "ph_mpi_help.h" 12322ea7e2SCameron Smith 137e5167baSCameron Smith 14322ea7e2SCameron Smith #ifndef PHASTAIO_TIMERS_ON 15322ea7e2SCameron Smith #define PHASTAIO_TIMERS_ON 0 16322ea7e2SCameron Smith #endif 17d080569aSCameron Smith struct phastaio_stats { 18d080569aSCameron Smith double readTime; 19d080569aSCameron Smith double writeTime; 20d080569aSCameron Smith double openTime; 21d080569aSCameron Smith double closeTime; 22d080569aSCameron Smith size_t readBytes; 23d080569aSCameron Smith size_t writeBytes; 24d080569aSCameron Smith }; 25d080569aSCameron Smith phastaio_stats phio_global_stats; 26322ea7e2SCameron Smith 27322ea7e2SCameron Smith namespace { 28322ea7e2SCameron Smith inline double getTime() { 29322ea7e2SCameron Smith return MPI_Wtime(); 30322ea7e2SCameron Smith } 31d080569aSCameron Smith inline size_t getSize(const char* t) { 32d080569aSCameron Smith std::string type(t); 33d080569aSCameron Smith if(type == "integer") 34d080569aSCameron Smith return sizeof(int); 35d080569aSCameron Smith else if(type == "double") 36d080569aSCameron Smith return sizeof(double); 37d080569aSCameron Smith else { 38d080569aSCameron Smith assert(0); 39d080569aSCameron Smith exit(EXIT_FAILURE); 40322ea7e2SCameron Smith } 41322ea7e2SCameron Smith } 42322ea7e2SCameron Smith } 43f262839cSCameron Smith 444c223e05SCameron Smith #define PHIO_TRACING 0 454c223e05SCameron Smith namespace { 464c223e05SCameron Smith void trace(const char* key, const char* aux="", void* obj=NULL) { 474c223e05SCameron Smith if(PHIO_TRACING) 484c223e05SCameron Smith fprintf(stderr, "PHIO_TRACE entering %s %s %p\n", key, aux, obj); 494c223e05SCameron Smith } 50d080569aSCameron Smith void printMinMaxAvg(const char* key, size_t v) { 51d080569aSCameron Smith int val = static_cast<int>(v); 52d080569aSCameron Smith int min = ph_min_int(val); 53d080569aSCameron Smith int max = ph_max_int(val); 54d080569aSCameron Smith long tot = ph_add_long(static_cast<long>(val)); 55d080569aSCameron Smith double avg = tot/static_cast<double>(ph_peers()); 56d080569aSCameron Smith if(!ph_self()) 57d080569aSCameron Smith fprintf(stderr, "phio_%s min max avg %d %d %f\n", 58d080569aSCameron Smith key, min, max, avg); 59d080569aSCameron Smith } 60d080569aSCameron Smith 61d080569aSCameron Smith void printMinMaxAvg(const char* key, double v) { 62d080569aSCameron Smith double min = ph_min_double(v); 63d080569aSCameron Smith double max = ph_max_double(v); 64d080569aSCameron Smith double tot = ph_add_double(v); 65d080569aSCameron Smith double avg = tot/ph_peers(); 66d080569aSCameron Smith if(!ph_self()) 67d080569aSCameron Smith fprintf(stderr, "phio_%s min max avg %f %f %f\n", 68d080569aSCameron Smith key, min, max, avg); 69d080569aSCameron Smith } 704c223e05SCameron Smith } 714c223e05SCameron Smith 72d7abaf6cSCameron Smith #ifdef __cplusplus 73d7abaf6cSCameron Smith extern "C" { 74d7abaf6cSCameron Smith #endif 75d7abaf6cSCameron Smith 76d080569aSCameron Smith void phio_printStats() { 777e5167baSCameron Smith const int mebi=1024*1024; 787e5167baSCameron Smith printMinMaxAvg("readTime (s)",phio_getReadTime()); 797e5167baSCameron Smith printMinMaxAvg("writeTime (s)", phio_getWriteTime()); 807e5167baSCameron Smith printMinMaxAvg("openTime (s)", phio_getOpenTime()); 817e5167baSCameron Smith printMinMaxAvg("closeTime (s)", phio_getCloseTime()); 827e5167baSCameron Smith printMinMaxAvg("readBytes (B)", phio_getReadBytes()); 837e5167baSCameron Smith printMinMaxAvg("writeBytes (B)", phio_getWriteBytes()); 847e5167baSCameron Smith printMinMaxAvg("readBandwidth (MiB/s)", 857e5167baSCameron Smith (phio_getReadBytes()/phio_getReadTime())/mebi); 867e5167baSCameron Smith printMinMaxAvg("writeBandwidth (MiB/s)", 877e5167baSCameron Smith (phio_getWriteBytes()/phio_getWriteTime())/mebi); 88d080569aSCameron Smith } 89d080569aSCameron Smith 90d080569aSCameron Smith void phio_initStats() { 91d080569aSCameron Smith phio_global_stats.readTime = 0; 92d080569aSCameron Smith phio_global_stats.writeTime = 0; 93d080569aSCameron Smith phio_global_stats.openTime = 0; 94d080569aSCameron Smith phio_global_stats.closeTime = 0; 95d080569aSCameron Smith phio_global_stats.readBytes = 0; 96d080569aSCameron Smith phio_global_stats.writeBytes = 0; 97d080569aSCameron Smith } 98d080569aSCameron Smith 99d080569aSCameron Smith double phio_getReadTime() { 100d080569aSCameron Smith return phio_global_stats.readTime; 101d080569aSCameron Smith } 102d080569aSCameron Smith 103d080569aSCameron Smith double phio_getWriteTime() { 104d080569aSCameron Smith return phio_global_stats.writeTime; 105d080569aSCameron Smith } 106d080569aSCameron Smith 107d080569aSCameron Smith double phio_getOpenTime() { 108d080569aSCameron Smith return phio_global_stats.openTime; 109d080569aSCameron Smith } 110d080569aSCameron Smith 111d080569aSCameron Smith double phio_getCloseTime() { 112d080569aSCameron Smith return phio_global_stats.closeTime; 113d080569aSCameron Smith } 114d080569aSCameron Smith 115d080569aSCameron Smith size_t phio_getReadBytes() { 116d080569aSCameron Smith return phio_global_stats.readBytes; 117d080569aSCameron Smith } 118d080569aSCameron Smith 119d080569aSCameron Smith size_t phio_getWriteBytes() { 120d080569aSCameron Smith return phio_global_stats.writeBytes; 121d080569aSCameron Smith } 122d080569aSCameron Smith 12382f286aaSCameron Smith void phio_readheader( 124064bab1dSCameron Smith phio_fp f, 125d1293ce9SCameron Smith const char keyphrase[], 126d1293ce9SCameron Smith void* valueArray, 127d1293ce9SCameron Smith int* nItems, 128d1293ce9SCameron Smith const char datatype[], 129d1293ce9SCameron Smith const char iotype[] ) { 130*6e8aac1eSCameron Smith const double t0 = getTime(); 131064bab1dSCameron Smith f->ops->readheader(f->file, keyphrase, valueArray, 132064bab1dSCameron Smith nItems, datatype, iotype); 133*6e8aac1eSCameron Smith phio_global_stats.readBytes += (*nItems)*getSize("integer"); 134*6e8aac1eSCameron Smith phio_global_stats.readTime += getTime()-t0; 135d1293ce9SCameron Smith } 136fa18c524SCameron Smith void phio_writeheader( 13757517afcSCameron Smith phio_fp f, 138fa18c524SCameron Smith const char keyphrase[], 139fa18c524SCameron Smith const void* valueArray, 140fa18c524SCameron Smith const int* nItems, 141fa18c524SCameron Smith const int* ndataItems, 142fa18c524SCameron Smith const char datatype[], 143fa18c524SCameron Smith const char iotype[] ) { 144*6e8aac1eSCameron Smith const double t0 = getTime(); 1459ec3dd51SCameron Smith f->ops->writeheader(f->file, keyphrase, valueArray, 1469ec3dd51SCameron Smith nItems, ndataItems, datatype, iotype); 147*6e8aac1eSCameron Smith phio_global_stats.writeBytes += (*nItems)*getSize("integer"); 148*6e8aac1eSCameron Smith phio_global_stats.writeTime += getTime()-t0; 149fa18c524SCameron Smith } 150f262839cSCameron Smith void phio_readdatablock( 151064bab1dSCameron Smith phio_fp f, 152f262839cSCameron Smith const char keyphrase[], 153f262839cSCameron Smith void* valueArray, 154f262839cSCameron Smith int* nItems, 155f262839cSCameron Smith const char datatype[], 156f262839cSCameron Smith const char iotype[] ) { 157322ea7e2SCameron Smith const double t0 = getTime(); 158064bab1dSCameron Smith f->ops->readdatablock(f->file, keyphrase, valueArray, 159064bab1dSCameron Smith nItems, datatype, iotype); 160d080569aSCameron Smith phio_global_stats.readBytes += (*nItems)*getSize(datatype); 161d080569aSCameron Smith phio_global_stats.readTime += getTime()-t0; 162f262839cSCameron Smith } 16366a3fa2cSCameron Smith void phio_writedatablock( 1649ec3dd51SCameron Smith phio_fp f, 16566a3fa2cSCameron Smith const char keyphrase[], 16666a3fa2cSCameron Smith const void* valueArray, 16766a3fa2cSCameron Smith const int* nItems, 16866a3fa2cSCameron Smith const char datatype[], 16966a3fa2cSCameron Smith const char iotype[]) { 170322ea7e2SCameron Smith const double t0 = getTime(); 1719ec3dd51SCameron Smith f->ops->writedatablock(f->file, keyphrase, valueArray, 1729ec3dd51SCameron Smith nItems, datatype, iotype); 173d080569aSCameron Smith phio_global_stats.writeBytes += (*nItems)*getSize(datatype); 174d080569aSCameron Smith phio_global_stats.writeTime += getTime()-t0; 17566a3fa2cSCameron Smith } 176ab645d52SCameron Smith 177ab645d52SCameron Smith void phio_constructName( 178a93de25bSCameron Smith phio_fp f, 179ab645d52SCameron Smith const char inName[], 180ab645d52SCameron Smith char* outName) { 181a93de25bSCameron Smith f->ops->constructname(inName, outName); 182ab645d52SCameron Smith } 183ab645d52SCameron Smith 184ab645d52SCameron Smith void phio_openfile( 18582f286aaSCameron Smith const char filename[], 186ab645d52SCameron Smith phio_fp f) { 187322ea7e2SCameron Smith const double t0 = getTime(); 1884c223e05SCameron Smith trace("openfile",filename,f); 189ab645d52SCameron Smith f->ops->openfile(filename, f); 190d080569aSCameron Smith phio_global_stats.openTime += getTime()-t0; 19192bfab9aSCameron Smith } 192ab645d52SCameron Smith 193ab645d52SCameron Smith void phio_closefile(phio_fp f) { 194322ea7e2SCameron Smith const double t0 = getTime(); 1954c223e05SCameron Smith trace("closefile","unknown",f); 196ab645d52SCameron Smith f->ops->closefile(f); 197d080569aSCameron Smith phio_global_stats.closeTime += getTime()-t0; 198064bab1dSCameron Smith } 199ab645d52SCameron Smith 200e81a6dc1SCameron Smith void phio_appendInt(char* dest, int v) { 20136adee64SCameron Smith std::stringstream ss; 20236adee64SCameron Smith ss << dest << v << '.'; 20336adee64SCameron Smith std::string s = ss.str(); 20436adee64SCameron Smith strcpy(dest, s.c_str()); 20536adee64SCameron Smith } 206d7abaf6cSCameron Smith 207d7abaf6cSCameron Smith #ifdef __cplusplus 208d7abaf6cSCameron Smith } 209d7abaf6cSCameron Smith #endif 210