SIONlib  1.7.4
Scalable I/O library for parallel access to task-local files
sion_cxx_mpi.hpp
1 
2 #ifndef SION_CXX_MPI_HPP_
3 #define SION_CXX_MPI_HPP_
4 
5 #ifdef MPI_VERSION
6 
7 #include <mpi.h>
8 #include "sion.h"
9 #include <iostream>
10 #include <string>
11 #include <string.h>
12 #include <stdlib.h>
13 #include <fstream>
14 #include "sion_cxx_base.hpp"
15 
16 namespace sionlib {
17  namespace mpi {
18 
19  class SIONFile : public SION_Base {
20  public:
21 
22  SIONFile();
23  SIONFile(std::string sion_file_name, std::string mode = "bw",
24  int num_files = 1, int global_rank = 0, MPI_Comm gComm=MPI_COMM_WORLD, MPI_Comm lComm=MPI_COMM_WORLD);
25  virtual ~SIONFile();
26 
27  // Don't copy SIONFile
28  SIONFile(const SIONFile& rhs) {
29  }
30 
31  char * getNewSionFileName() const;
32 
33  // std::ostream* getSionStream() const;
34 
35  // template<class T>
36  // SIONFile& SIONFile::operator<<(T rhs);
37 
38  // int open();
39 
40  void setLocalCommunicator(MPI_Comm lComm);
41  MPI_Comm getLocalCommunicator() const;
42 
43  void setGlobalCommunicator(MPI_Comm gComm);
44  MPI_Comm getGlobalCommunicator() const;
45 
46  void setGlobalRank(int global_rank);
47  int getGlobalRank() const;
48 
49 
50 
51  // Wrapper for SION functions
52  void open();
53  void close();
54 
55  template<class T>
56  void write(T data);
57 
58  template<typename dataT>
59  void read(dataT * data);
60 
61  // Nur zu Versuchszwecken
62  template<typename dataT>
63  void read(dataT * data, int unit, int length);
64 
65  // Nur zu Versuchszwecken
66  template<class T>
67  void write(T & data, int unit, int length);
68 
69  template<typename outT>
70  friend SIONFile& operator<<(SIONFile & sf, const outT& rhs);
71 
72  template<typename inT>
73  friend SIONFile& operator>>(SIONFile & sf, inT& rhs);
74 
75  void ensureFreeSpace(long numbytes);
76  void endOfFile();
77 
78  private:
79  char * _new_sion_file_name;
80  MPI_Comm _g_comm;
81  MPI_Comm _l_comm;
82  int _global_rank;
83  };
84 
85  template<class T>
86  void SIONFile::write(T data) {
87  // sion_fwrite(reinterpret_cast<char*>(data), 1, _chunk_size, _sid);
88  // sion_fwrite(reinterpret_cast<char*>(&data), 1, sizeof(data), _sid);
89  sion_fwrite(reinterpret_cast<char*>(&data), sizeof(data), 1, _sid);
90  //sion_coll_fwrite_mpi(reinterpret_cast<char*>(&data), 1, sizeof(data), _sid);
91  // sion_coll_fwrite_mpi(reinterpret_cast<char*>(&data), 1, sizeof(data), _sid);
92  }
93 
94  template<class T>
95  void SIONFile::write(T & data, int unit, int length) {
96  // fwrite(reinterpret_cast<char*>(&data), 1, sizeof(data), _file_ptr);
97  // sion_fwrite(reinterpret_cast<char*>(&data), unit, length, _sid);
98  // std::cout << "write() from mpi namespace" << std::endl;
99  sion_coll_fwrite_mpi((void *) data.data(), unit, length, _sid);
100  }
101 
102  template<typename outT>
103  SIONFile& operator<<(SIONFile & sf, const outT& rhs) {
104  sf.write(rhs);
105  return sf;
106  }
107 
108  template<typename dataT>
109  void SIONFile::read(dataT * data) {
110  dataT tmp = *data;
111  // std::cout << "size of T:\t" << sizeof(tmp) << std::endl;
112  // _return_code = sion_fread(data, 1, sizeof(tmp), _sid);
113  _return_code = sion_fread(data, sizeof(tmp), 1, _sid);
114  // sion_coll_fread_mpi(data, 1, sizeof(tmp), _sid);
115  }
116 
117  template<typename dataT>
118  void SIONFile::read(dataT * data, int unit, int length) {
119  sion_coll_fread_mpi(data, unit, length, _sid);
120  }
121 
122  template<typename inT>
123  SIONFile& operator>>(SIONFile & sf, inT & rhs) {
124  sf.read(&rhs);
125  return sf;
126  }
127  } /* namespace mpi */
128 
129 } /* namespace sionlib */
130 
131 #endif /* MPI_VERSION */
132 
133 #endif /* SION_CXX_MPI_HPP_ */
size_t sion_fwrite(const void *data, size_t size, size_t nitems, int sid)
Write data to sion file.
Definition: sion_common.c:470
size_t sion_fread(void *data, size_t size, size_t nitems, int sid)
Read data from sion file.
Definition: sion_common.c:609