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