xref: /phasta/phSolver/common/phIO.cc (revision d080569ad171896d9775dab16d79351a4ad9493d)
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