-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathnixio.hpp
351 lines (320 loc) · 8.4 KB
/
nixio.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
// -*- C++ -*-
#ifndef _JSONIO_HPP_
#define _JSONIO_HPP_
#include <mpi.h>
#include <nlohmann/json.hpp>
///
/// @brief NIX-IO utility module
///
namespace nixio
{
using json = nlohmann::ordered_json;
using float32 = float;
using float64 = double;
using std::string;
///
/// @brief collective open file with MPI-IO
/// @param filename
/// @param fh
/// @param disp
/// @param mode
///
void open_file(const char* filename, MPI_File* fh, size_t* disp, const char* mode);
///
/// @brief collective close file with MPI-IO
/// @param fh
///
void close_file(MPI_File* fh);
///
/// @brief primitive collective contiguous read/write
/// @param fh
/// @param disp
/// @param data
/// @param offset
/// @param size
/// @param elembyte
/// @param packbyte
/// @param mode
///
size_t readwrite_contiguous(MPI_File* fh, size_t* disp, void* data, const size_t offset,
const size_t size, const int32_t elembyte, const int32_t packbyte,
MPI_Request* req, const int mode);
///
/// @brief primitive collective contiguous read/write with explicit offset
/// @param fh
/// @param disp
/// @param data
/// @param size
/// @param elembyte
/// @param packbyte
/// @param req
/// @param mode
///
size_t readwrite_contiguous_at(MPI_File* fh, size_t* disp, void* data, const size_t size,
const int32_t elembyte, const int32_t packbyte, MPI_Request* req,
const int mode);
///
/// @brief primitive collective read/write of subarray with MPI-IO
/// @param fh
/// @param disp
/// @param data
/// @param ndim
/// @param gshape
/// @param lshape
/// @param offset
/// @param elembyte
/// @param mode
/// @param order
///
size_t readwrite_subarray(MPI_File* fh, size_t* disp, void* data, const int32_t ndim,
const int32_t gshape[], const int32_t lshape[], const int32_t offset[],
const int32_t elembyte, MPI_Request* req, const int mode,
const int order);
///
/// @brief non-collective read
/// @param fh
/// @param disp
/// @param data
/// @param size
///
size_t read_single(MPI_File* fh, size_t* disp, void* data, const size_t size, MPI_Request* req);
///
/// @brief non-collective write
/// @param fh
/// @param disp
/// @param data
/// @param size
///
size_t write_single(MPI_File* fh, size_t* disp, void* data, const size_t size, MPI_Request* req);
///
/// @brief collective and contiguous read
/// @param fh
/// @param disp
/// @param data
/// @param size
/// @param elembyte
/// @param packbyte
///
size_t read_contiguous(MPI_File* fh, size_t* disp, void* data, const size_t size,
const int32_t elembyte, const int32_t packbyte, MPI_Request* req);
///
/// @brief collective and contiguous write
/// @param fh
/// @param disp
/// @param data
/// @param size
/// @param elembyte
/// @param packbyte
///
size_t write_contiguous(MPI_File* fh, size_t* disp, void* data, const size_t size,
const int32_t elembyte, const int32_t packbyte, MPI_Request* req);
///
/// @brief collective and contiguous read with explicit offset
/// @param fh
/// @param disp
/// @param data
/// @param size
/// @param elembyte
/// @param req
///
size_t read_contiguous_at(MPI_File* fh, size_t* disp, void* data, const size_t size,
const int32_t elembyte, MPI_Request* req);
///
/// @brief collective and contiguous write with explicit offset
/// @param fh
/// @param disp
/// @param data
/// @param size
/// @param elembyte
/// @param req
///
size_t write_contiguous_at(MPI_File* fh, size_t* disp, void* data, const size_t size,
const int32_t elembyte, MPI_Request* req);
///
/// @brief collective read of subarray
/// @tparam T1
/// @tparam T2
/// @tparam T3
/// @tparam T4
/// @tparam T5
/// @param fh
/// @param disp
/// @param data
/// @param ndim
/// @param gshape
/// @param lshape
/// @param offset
/// @param elembyte
/// @param order
///
template <typename T1, typename T2, typename T3, typename T4, typename T5>
size_t read_subarray(MPI_File* fh, size_t* disp, void* data, const T1 ndim, const T2 gshape[],
const T3 lshape[], const T4 offset[], const T5 elembyte, MPI_Request* req,
const int order = MPI_ORDER_C);
///
/// @brief collective write of subarray
/// @tparam T1
/// @tparam T2
/// @tparam T3
/// @tparam T4
/// @tparam T5
/// @param fh
/// @param disp
/// @param data
/// @param ndim
/// @param gshape
/// @param lshape
/// @param offset
/// @param elembyte
/// @param order
///
template <typename T1, typename T2, typename T3, typename T4, typename T5>
size_t write_subarray(MPI_File* fh, size_t* disp, void* data, const T1 ndim, const T2 gshape[],
const T3 lshape[], const T4 offset[], const T5 elembyte, MPI_Request* req,
const int order = MPI_ORDER_C);
///
/// @brief put metadata of array to json object
/// @param obj
/// @param name
/// @param dtype
/// @param desc
/// @param disp
/// @param size
/// @param ndim
/// @param dims
///
void put_metadata(json& obj, string name, string dtype, string desc, const size_t disp,
const size_t size, const int32_t ndim, const int32_t dims[]);
///
/// @brief put metadata of scalar to json object
/// @param obj
/// @param name
/// @param dtype
/// @param desc
/// @param disp
/// @param size
///
void put_metadata(json& obj, string name, string dtype, string desc, const size_t disp,
const size_t size);
///
/// @brief get metadata of array from json object
/// @param obj
/// @param name
/// @param dtype
/// @param desc
/// @param disp
/// @param size
/// @param ndim
/// @param dims
///
void get_metadata(json& obj, string name, string& dtype, string& desc, size_t& disp, size_t& size,
int32_t& ndim, int32_t dims[]);
///
/// @brief get metadata of scalar from json object
/// @param obj
/// @param name
/// @param dtype
/// @param desc
/// @param disp
/// @param size
///
void get_metadata(json& obj, string name, string& dtype, string& desc, size_t& disp, size_t& size);
///
/// @brief get scalar attribute from json object
/// @tparam T
/// @param obj
/// @param name
/// @param disp
/// @param data
///
template <typename T>
void get_attribute(json& obj, string name, size_t& disp, T& data);
///
/// @brief get array attribute from json object
/// @tparam T
/// @param obj
/// @param name
/// @param disp
/// @param length
/// @param data
///
template <typename T>
void get_attribute(json& obj, string name, size_t& disp, int32_t length, T* data);
///
/// @brief put 32bit integer scalar attribute
/// @param obj
/// @param name
/// @param disp
/// @param data
///
void put_attribute(json& obj, string name, const size_t disp, const int32_t data);
///
/// @brief put 64bit integer scalar attribute
/// @param obj
/// @param name
/// @param disp
/// @param data
///
void put_attribute(json& obj, string name, const size_t disp, const int64_t data);
///
/// @brief put 32bit real scalar attribute
/// @param obj
/// @param name
/// @param disp
/// @param data
///
void put_attribute(json& obj, string name, const size_t disp, const float32 data);
///
/// @brief put 64bit real scalar attribute
/// @param obj
/// @param name
/// @param disp
/// @param data
///
void put_attribute(json& obj, string name, const size_t disp, const float64 data);
///
/// @brief put 32bit integer array attribute
/// @param obj
/// @param name
/// @param disp
/// @param length
/// @param data
///
void put_attribute(json& obj, string name, const size_t disp, const int32_t length,
const int32_t* data);
///
/// @brief put 64bit integer array attribute
/// @param obj
/// @param name
/// @param disp
/// @param length
/// @param data
///
void put_attribute(json& obj, string name, const size_t disp, const int32_t length,
const int64_t* data);
///
/// @brief put 32bit real array attribute
/// @param obj
/// @param name
/// @param disp
/// @param length
/// @param data
///
void put_attribute(json& obj, string name, const size_t disp, const int32_t length,
const float32* data);
///
/// @brief put 64bit real array attribute
/// @param obj
/// @param name
/// @param disp
/// @param length
/// @param data
///
void put_attribute(json& obj, string name, const size_t disp, const int32_t length,
const float64* data);
} // namespace nixio
// Local Variables:
// c-file-style : "gnu"
// c-file-offsets : ((innamespace . 0) (inline-open . 0))
// End:
#endif