1*d080569aSCameron Smith #include <mpi.h> 2064bab1dSCameron Smith #include <stdio.h> 3064bab1dSCameron Smith #include <stdlib.h> 4*d080569aSCameron 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" 11*d080569aSCameron Smith #include "ph_mpi_help.h" 12322ea7e2SCameron Smith 13322ea7e2SCameron Smith #ifndef PHASTAIO_TIMERS_ON 14322ea7e2SCameron Smith #define PHASTAIO_TIMERS_ON 0 15322ea7e2SCameron Smith #endif 16*d080569aSCameron Smith struct phastaio_stats { 17*d080569aSCameron Smith double readTime; 18*d080569aSCameron Smith double writeTime; 19*d080569aSCameron Smith double openTime; 20*d080569aSCameron Smith double closeTime; 21*d080569aSCameron Smith size_t readBytes; 22*d080569aSCameron Smith size_t writeBytes; 23*d080569aSCameron Smith }; 24*d080569aSCameron Smith phastaio_stats phio_global_stats; 25322ea7e2SCameron Smith 26322ea7e2SCameron Smith namespace { 27322ea7e2SCameron Smith inline double getTime() { 28322ea7e2SCameron Smith return MPI_Wtime(); 29322ea7e2SCameron Smith } 30*d080569aSCameron Smith inline size_t getSize(const char* t) { 31*d080569aSCameron Smith std::string type(t); 32*d080569aSCameron Smith if(type == "integer") 33*d080569aSCameron Smith return sizeof(int); 34*d080569aSCameron Smith else if(type == "double") 35*d080569aSCameron Smith return sizeof(double); 36*d080569aSCameron Smith else { 37*d080569aSCameron Smith assert(0); 38*d080569aSCameron Smith exit(EXIT_FAILURE); 39322ea7e2SCameron Smith } 40322ea7e2SCameron Smith } 41322ea7e2SCameron Smith } 42f262839cSCameron Smith 434c223e05SCameron Smith #define PHIO_TRACING 0 444c223e05SCameron Smith namespace { 454c223e05SCameron Smith void trace(const char* key, const char* aux="", void* obj=NULL) { 464c223e05SCameron Smith if(PHIO_TRACING) 474c223e05SCameron Smith fprintf(stderr, "PHIO_TRACE entering %s %s %p\n", key, aux, obj); 484c223e05SCameron Smith } 49*d080569aSCameron Smith void printMinMaxAvg(const char* key, size_t v) { 50*d080569aSCameron Smith int val = static_cast<int>(v); 51*d080569aSCameron Smith int min = ph_min_int(val); 52*d080569aSCameron Smith int max = ph_max_int(val); 53*d080569aSCameron Smith long tot = ph_add_long(static_cast<long>(val)); 54*d080569aSCameron Smith double avg = tot/static_cast<double>(ph_peers()); 55*d080569aSCameron Smith if(!ph_self()) 56*d080569aSCameron Smith fprintf(stderr, "phio_%s min max avg %d %d %f\n", 57*d080569aSCameron Smith key, min, max, avg); 58*d080569aSCameron Smith } 59*d080569aSCameron Smith 60*d080569aSCameron Smith void printMinMaxAvg(const char* key, double v) { 61*d080569aSCameron Smith double min = ph_min_double(v); 62*d080569aSCameron Smith double max = ph_max_double(v); 63*d080569aSCameron Smith double tot = ph_add_double(v); 64*d080569aSCameron Smith double avg = tot/ph_peers(); 65*d080569aSCameron Smith if(!ph_self()) 66*d080569aSCameron Smith fprintf(stderr, "phio_%s min max avg %f %f %f\n", 67*d080569aSCameron Smith key, min, max, avg); 68*d080569aSCameron Smith } 694c223e05SCameron Smith } 704c223e05SCameron Smith 71d7abaf6cSCameron Smith #ifdef __cplusplus 72d7abaf6cSCameron Smith extern "C" { 73d7abaf6cSCameron Smith #endif 74d7abaf6cSCameron Smith 75*d080569aSCameron Smith void phio_printStats() { 76*d080569aSCameron Smith printMinMaxAvg("readTime",phio_getReadTime()); 77*d080569aSCameron Smith printMinMaxAvg("writeTime", phio_getWriteTime()); 78*d080569aSCameron Smith printMinMaxAvg("openTime", phio_getOpenTime()); 79*d080569aSCameron Smith printMinMaxAvg("closeTime", phio_getCloseTime()); 80*d080569aSCameron Smith printMinMaxAvg("readBytes", phio_getReadBytes()); 81*d080569aSCameron Smith printMinMaxAvg("writeBytes", phio_getWriteBytes()); 82*d080569aSCameron Smith } 83*d080569aSCameron Smith 84*d080569aSCameron Smith void phio_initStats() { 85*d080569aSCameron Smith phio_global_stats.readTime = 0; 86*d080569aSCameron Smith phio_global_stats.writeTime = 0; 87*d080569aSCameron Smith phio_global_stats.openTime = 0; 88*d080569aSCameron Smith phio_global_stats.closeTime = 0; 89*d080569aSCameron Smith phio_global_stats.readBytes = 0; 90*d080569aSCameron Smith phio_global_stats.writeBytes = 0; 91*d080569aSCameron Smith } 92*d080569aSCameron Smith 93*d080569aSCameron Smith double phio_getReadTime() { 94*d080569aSCameron Smith return phio_global_stats.readTime; 95*d080569aSCameron Smith } 96*d080569aSCameron Smith 97*d080569aSCameron Smith double phio_getWriteTime() { 98*d080569aSCameron Smith return phio_global_stats.writeTime; 99*d080569aSCameron Smith } 100*d080569aSCameron Smith 101*d080569aSCameron Smith double phio_getOpenTime() { 102*d080569aSCameron Smith return phio_global_stats.openTime; 103*d080569aSCameron Smith } 104*d080569aSCameron Smith 105*d080569aSCameron Smith double phio_getCloseTime() { 106*d080569aSCameron Smith return phio_global_stats.closeTime; 107*d080569aSCameron Smith } 108*d080569aSCameron Smith 109*d080569aSCameron Smith size_t phio_getReadBytes() { 110*d080569aSCameron Smith return phio_global_stats.readBytes; 111*d080569aSCameron Smith } 112*d080569aSCameron Smith 113*d080569aSCameron Smith size_t phio_getWriteBytes() { 114*d080569aSCameron Smith return phio_global_stats.writeBytes; 115*d080569aSCameron Smith } 116*d080569aSCameron Smith 11782f286aaSCameron Smith void phio_readheader( 118064bab1dSCameron Smith phio_fp f, 119d1293ce9SCameron Smith const char keyphrase[], 120d1293ce9SCameron Smith void* valueArray, 121d1293ce9SCameron Smith int* nItems, 122d1293ce9SCameron Smith const char datatype[], 123d1293ce9SCameron Smith const char iotype[] ) { 124322ea7e2SCameron Smith const double t0 = getTime(); 125064bab1dSCameron Smith f->ops->readheader(f->file, keyphrase, valueArray, 126064bab1dSCameron Smith nItems, datatype, iotype); 127*d080569aSCameron Smith phio_global_stats.readBytes += (*nItems)*getSize(datatype); 128*d080569aSCameron Smith phio_global_stats.readTime += getTime()-t0; 129d1293ce9SCameron Smith } 130fa18c524SCameron Smith void phio_writeheader( 13157517afcSCameron Smith phio_fp f, 132fa18c524SCameron Smith const char keyphrase[], 133fa18c524SCameron Smith const void* valueArray, 134fa18c524SCameron Smith const int* nItems, 135fa18c524SCameron Smith const int* ndataItems, 136fa18c524SCameron Smith const char datatype[], 137fa18c524SCameron Smith const char iotype[] ) { 138322ea7e2SCameron Smith const double t0 = getTime(); 1399ec3dd51SCameron Smith f->ops->writeheader(f->file, keyphrase, valueArray, 1409ec3dd51SCameron Smith nItems, ndataItems, datatype, iotype); 141*d080569aSCameron Smith phio_global_stats.writeBytes += (*nItems)*getSize(datatype); 142*d080569aSCameron Smith phio_global_stats.writeTime += getTime()-t0; 143fa18c524SCameron Smith } 144f262839cSCameron Smith void phio_readdatablock( 145064bab1dSCameron Smith phio_fp f, 146f262839cSCameron Smith const char keyphrase[], 147f262839cSCameron Smith void* valueArray, 148f262839cSCameron Smith int* nItems, 149f262839cSCameron Smith const char datatype[], 150f262839cSCameron Smith const char iotype[] ) { 151322ea7e2SCameron Smith const double t0 = getTime(); 152064bab1dSCameron Smith f->ops->readdatablock(f->file, keyphrase, valueArray, 153064bab1dSCameron Smith nItems, datatype, iotype); 154*d080569aSCameron Smith phio_global_stats.readBytes += (*nItems)*getSize(datatype); 155*d080569aSCameron Smith phio_global_stats.readTime += getTime()-t0; 156f262839cSCameron Smith } 15766a3fa2cSCameron Smith void phio_writedatablock( 1589ec3dd51SCameron Smith phio_fp f, 15966a3fa2cSCameron Smith const char keyphrase[], 16066a3fa2cSCameron Smith const void* valueArray, 16166a3fa2cSCameron Smith const int* nItems, 16266a3fa2cSCameron Smith const char datatype[], 16366a3fa2cSCameron Smith const char iotype[]) { 164322ea7e2SCameron Smith const double t0 = getTime(); 1659ec3dd51SCameron Smith f->ops->writedatablock(f->file, keyphrase, valueArray, 1669ec3dd51SCameron Smith nItems, datatype, iotype); 167*d080569aSCameron Smith phio_global_stats.writeBytes += (*nItems)*getSize(datatype); 168*d080569aSCameron Smith phio_global_stats.writeTime += getTime()-t0; 16966a3fa2cSCameron Smith } 170ab645d52SCameron Smith 171ab645d52SCameron Smith void phio_constructName( 172a93de25bSCameron Smith phio_fp f, 173ab645d52SCameron Smith const char inName[], 174ab645d52SCameron Smith char* outName) { 175a93de25bSCameron Smith f->ops->constructname(inName, outName); 176ab645d52SCameron Smith } 177ab645d52SCameron Smith 178ab645d52SCameron Smith void phio_openfile( 17982f286aaSCameron Smith const char filename[], 180ab645d52SCameron Smith phio_fp f) { 181322ea7e2SCameron Smith const double t0 = getTime(); 1824c223e05SCameron Smith trace("openfile",filename,f); 183ab645d52SCameron Smith f->ops->openfile(filename, f); 184*d080569aSCameron Smith phio_global_stats.openTime += getTime()-t0; 18592bfab9aSCameron Smith } 186ab645d52SCameron Smith 187ab645d52SCameron Smith void phio_closefile(phio_fp f) { 188322ea7e2SCameron Smith const double t0 = getTime(); 1894c223e05SCameron Smith trace("closefile","unknown",f); 190ab645d52SCameron Smith f->ops->closefile(f); 191*d080569aSCameron Smith phio_global_stats.closeTime += getTime()-t0; 192064bab1dSCameron Smith } 193ab645d52SCameron Smith 194e81a6dc1SCameron Smith void phio_appendInt(char* dest, int v) { 19536adee64SCameron Smith std::stringstream ss; 19636adee64SCameron Smith ss << dest << v << '.'; 19736adee64SCameron Smith std::string s = ss.str(); 19836adee64SCameron Smith strcpy(dest, s.c_str()); 19936adee64SCameron Smith } 200d7abaf6cSCameron Smith 201d7abaf6cSCameron Smith #ifdef __cplusplus 202d7abaf6cSCameron Smith } 203d7abaf6cSCameron Smith #endif 204