SIONlib  2.0.0-rc.2
Scalable I/O library for parallel access to task-local files
sion_omp_gen.c
1 /****************************************************************************
2 ** SIONLIB http://www.fz-juelich.de/jsc/sionlib **
3 *****************************************************************************
4 ** Copyright (c) 2008-2019 **
5 ** Forschungszentrum Juelich, Juelich Supercomputing Centre **
6 ** **
7 ** See the file COPYRIGHT in the package base directory for details **
8 ****************************************************************************/
9 
10 #define _XOPEN_SOURCE 700
11 
12 #include <omp.h>
13 #include <stdint.h>
14 #include <stdlib.h>
15 
16 #include "sion_common.h"
17 #include "sion_const.h"
18 #include "sion_debug.h"
19 #include "sion_enums.h"
20 #include "sion_error_handler.h"
21 #include "sion_fd.h"
22 #include "sion_filedesc.h"
23 #include "sion_generic.h"
24 #include "sion_omp.h"
25 #include "sion_omp_cb_gen.h"
26 #include "sion_omp_internal_gen.h"
27 
28 #ifdef SION_OMP
29 
30 int32_t _sion_omp_api_aid = -1;
31 static omp_lock_t _sion_omp_lock_data;
32 
33 int _sion_omp_user_lock(void *data)
34 {
35  int rc = SION_SUCCESS;
36  omp_set_lock(&_sion_omp_lock_data);
37  return rc;
38 }
39 int _sion_omp_user_unlock(void *data)
40 {
41  int rc = SION_SUCCESS;
42  omp_unset_lock(&_sion_omp_lock_data);
43  return rc;
44 }
45 
46 int sion_parclose_omp(int sid)
47 {
48  int rc = SION_SUCCESS;
49  ONLY_DEBUG(int thread_num;)
50  _sion_filedesc *sion_filedesc;
51 
52  if ((sid < 0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
53  return _sion_errorprint_omp(SION_NOT_SUCCESS, _SION_ERROR_RETURN, "sion_parclose_omp: invalid sion_filedesc %d", sid);
54  }
55 
56  ONLY_DEBUG(thread_num = omp_get_thread_num();)
57 
58  if (omp_get_num_threads() != sion_filedesc->ntasks) {
59  return _sion_errorprint_omp(SION_NOT_SUCCESS, _SION_ERROR_RETURN,
60  "sion_parclose_omp: invalid number of OpenMP threads, %d <> %d", omp_get_num_threads(), sion_filedesc->ntasks);
61  }
62 
63  DPRINTFP((1, "sion_parclose_omp", thread_num, "enter parallel close of sid %d\n", sid));
64  DPRINTFP((1, "sion_parclose_omp", thread_num, "closing %d file(s)\n", sion_filedesc->nfiles));
65 
66  rc = sion_generic_parclose(sid);
67 
68  DPRINTFP((1, "sion_parclose_omp", thread_num, "leave parallel close of sid %d rc=%d\n", sid, rc));
69  return rc;
70 }
71 
73 {
74  sion_omp_options *options = malloc(sizeof(sion_omp_options));
75  if (options) {
76  *options = SION_OMP_OPTIONS_INIT;
77  }
78  return options;
79 }
80 
82 {
83  free(options);
84 }
85 
86 void sion_omp_options_set_chunksize(sion_omp_options *options, int64_t chunksize)
87 {
88  sion_generic_options_set_chunksize(&options->generic_options, chunksize);
89 }
90 
91 void sion_omp_options_set_fsblksize(sion_omp_options *options, int32_t fsblksize)
92 {
93  sion_generic_options_set_fsblksize(&options->generic_options, fsblksize);
94 }
95 
97 {
98  sion_generic_options_set_keyval_mode(&options->generic_options, keyval_mode);
99 }
100 
102 {
104 }
105 
107 {
108  sion_generic_options_set_collective_size(&options->generic_options, size);
109 }
110 
112 {
113  sion_generic_options_set_collective_merge(&options->generic_options);
114 }
115 
117 {
118  sion_generic_options_set_lowlevel_api(&options->generic_options, lowlevel_api);
119 }
120 
122 {
123  sion_generic_options_set_endianness(&options->generic_options, endianness);
124 }
125 
126 int sion_paropen_omp(const char *fname, sion_open_mode mode, const sion_omp_options *options_)
127 {
128  sion_omp_options options = (options_) ? *options_ : SION_OMP_OPTIONS_INIT;
129 
130  int thread_num = omp_get_thread_num();
131  int num_threads = omp_get_num_threads();
132 
133 #pragma omp master
134  {
135  _sion_debug_set_query_thread_num_function(omp_get_thread_num);
136  _sion_error_set_query_thread_num_function(omp_get_thread_num);
137  omp_init_lock(&_sion_omp_lock_data);
138  sion_lock_register_lock_callbacks(_sion_omp_user_lock, _sion_omp_user_unlock, &_sion_omp_lock_data);
139  }
140 #pragma omp barrier
141 
142  DPRINTFP((1, __func__, thread_num, "enter parallel open of file %s\n", fname));
143 
144  // register callbacks for generic interface
145 #pragma omp master
146  if (_sion_omp_api_aid < 0) {
147  _sion_omp_api_aid = _sion_register_callbacks_omp();
148  }
149 
150  /* create generic communicator container */
151  _omp_api_commdata *gen_gcomm = malloc(sizeof(_omp_api_commdata));
152  if (!gen_gcomm) {
153  return _sion_errorprint(SION_ID_NOT_VALID, _SION_ERROR_RETURN,
154  "cannot allocate omp internal data structure of size %lu (_omp_api_commdata), aborting ...\n",
155  (unsigned long)sizeof(_omp_api_commdata));
156  }
157  gen_gcomm->commset = 1;
158  gen_gcomm->thread_num = thread_num;
159  gen_gcomm->num_threads = num_threads;
160 
161  /* sync to ensure that aid is accessible */
162  _sion_omp_barrier_cb(gen_gcomm);
163 
164  // FIXME
165  // DPRINTFP((1, "sion_paropen_omp", thread_num, "enter parallel open of 1 file (current name %s) in %s mode\n", fname, file_mode));
166  DPRINTFP((1, "sion_paropen_omp", thread_num, "enter parallel open of 1 file (current name %s)\n", fname));
167  int sid = sion_generic_paropen(
168  _sion_omp_api_aid, fname, mode, gen_gcomm, thread_num, num_threads, 0, 1, thread_num, num_threads, &options.generic_options);
169  // DPRINTFP((1, "sion_paropen_omp", thread_num, "leave parallel open of 1 file in %s mode #tasks=%d sid=%d\n", file_mode,
170  // num_threads, sid));
171  DPRINTFP((1, "sion_paropen_omp", thread_num, "leave parallel open of 1 file #tasks=%d sid=%d\n", num_threads, sid));
172 
173  /* test return code from internal open */
174  if (sid == SION_ID_NOT_VALID) {
175  return _sion_errorprint_omp(
176  SION_ID_NOT_VALID, _SION_ERROR_RETURN, "sion_paropen_omp: invalid return code from internal open %d", sid);
177  }
178 
179  DPRINTFP((1, "sion_paropen_omp", thread_num, "leave parallel open of file %s sid=%d\n", fname, sid));
180 
181  return sid;
182 }
183 
184 /* end of ifdef OMP */
185 #endif
sion_lowlevel_api
specifies a low-level API to use for file system access
Definition: sion_enums.h:19
sion_omp_options * sion_omp_options_new()
Allocates and initializes an instance of sion_omp_options
Definition: sion_omp_gen.c:72
void sion_omp_options_set_chunksize(sion_omp_options *options, int64_t chunksize)
Set the chunk size of a logical file in the container.
Definition: sion_omp_gen.c:86
void sion_omp_options_set_collective_size(sion_omp_options *options, int32_t size)
Enable collective I/O.
Definition: sion_omp_gen.c:106
int sion_generic_paropen(int aid, const char *fname, sion_open_mode mode, void *gcommgroup, int grank, int gsize, int filenumber, int numfiles, int lrank, int lsize, const sion_generic_options *options_)
Open a SIONlib file through a generic interface.
Definition: sion_generic.c:727
void sion_generic_options_set_collective_size(sion_generic_options *options, int32_t size)
Enable collective I/O.
Definition: sion_generic.c:704
int sion_paropen_omp(const char *fname, sion_open_mode mode, const sion_omp_options *options_)
Open a SIONlib file from multiple OpenMP threads.
Definition: sion_omp_gen.c:126
int sion_parclose_omp(int sid)
closes a SIONlib file previously opened in OpenMP mode
Definition: sion_omp_gen.c:46
int sion_lock_register_lock_callbacks(int lock(void *), int unlock(void *), void *lock_data)
Function which registers callback funtions for lock and unlock internal access to shared data structu...
Definition: sion_common.c:743
void sion_omp_options_set_collective(sion_omp_options *options)
Enable collective I/O.
Definition: sion_omp_gen.c:101
void sion_generic_options_set_collective_merge(sion_generic_options *options)
Use collective merging.
Definition: sion_generic.c:709
void sion_generic_options_set_endianness(sion_generic_options *options, sion_endianness endianness)
Set the endianness for the contents of a container.
Definition: sion_generic.c:722
void sion_omp_options_set_keyval_mode(sion_omp_options *options, sion_keyval_mode keyval_mode)
Set the key-value mode to use for a container.
Definition: sion_omp_gen.c:96
void sion_omp_options_delete(sion_omp_options *options)
Delete an instance of sion_omp_options
Definition: sion_omp_gen.c:81
void sion_generic_options_set_keyval_mode(sion_generic_options *options, sion_keyval_mode keyval_mode)
Set the key-value mode to use for a container.
Definition: sion_generic.c:684
void sion_generic_options_set_fsblksize(sion_generic_options *options, int32_t fsblksize)
Set the file system block size to assume.
Definition: sion_generic.c:679
void sion_omp_options_set_collective_merge(sion_omp_options *options)
Use collective merging.
Definition: sion_omp_gen.c:111
void sion_generic_options_set_chunksize(sion_generic_options *options, int64_t chunksize)
Set the chunk size of a logical file in the container.
Definition: sion_generic.c:674
struct sion_omp_options sion_omp_options
Holds non-essential arguments for sion_paropen_omp().
Definition: sion_omp.h:37
void sion_omp_options_set_endianness(sion_omp_options *options, sion_endianness endianness)
Set the endianness for the contents of a container.
Definition: sion_omp_gen.c:121
sion_keyval_mode
specifies whether to use SIONlib's key-value mechanism for accessing file content and if so in what m...
Definition: sion_enums.h:35
int sion_generic_parclose(int sid)
Close a SIONlib file.
Definition: sion_generic.c:362
sion_endianness
declares the endianness of user data written to a file
Definition: sion_enums.h:63
sion_open_mode
specifies for what type of access to open a file
Definition: sion_enums.h:27
void sion_omp_options_set_fsblksize(sion_omp_options *options, int32_t fsblksize)
Set the file system block size to assume.
Definition: sion_omp_gen.c:91
void sion_generic_options_set_lowlevel_api(sion_generic_options *options, sion_lowlevel_api lowlevel_api)
Set the low-level API to use for opening a container.
Definition: sion_generic.c:717
void sion_omp_options_set_lowlevel_api(sion_omp_options *options, sion_lowlevel_api lowlevel_api)
Set the low-level API to use for opening a container.
Definition: sion_omp_gen.c:116