This source file includes following definitions.
- oshmem_request_cancel
- oshmem_request_free
- oshmem_request_wait_any_completion
- oshmem_request_wait_completion
- oshmem_request_complete
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 #ifndef OSHMEM_REQUEST_H
20 #define OSHMEM_REQUEST_H
21
22 #include "oshmem_config.h"
23 #include "oshmem/constants.h"
24
25 #include "opal/class/opal_free_list.h"
26 #include "opal/class/opal_pointer_array.h"
27 #include "opal/threads/condition.h"
28
29 BEGIN_C_DECLS
30
31
32
33
34
35 OSHMEM_DECLSPEC OBJ_CLASS_DECLARATION(oshmem_request_t);
36
37
38
39
40
41
42
43 #include "request_dbg.h"
44
45 struct oshmem_request_t;
46
47 typedef struct oshmem_request_t *SHMEM_Request;
48 typedef struct oshmem_status_public_t SHMEM_Status;
49
50
51 #define SHMEM_SUCCESS 0
52 #define SHMEM_ERR_IN_STATUS 18
53
54
55
56
57 struct oshmem_status_public_t {
58 int SHMEM_SOURCE;
59
60 int SHMEM_ERROR;
61 int _count;
62 int _cancelled;
63 };
64 typedef struct oshmem_status_public_t oshmem_status_public_t;
65
66 typedef int (SHMEM_Grequest_query_function)(void *, SHMEM_Status *);
67 typedef int (SHMEM_Grequest_free_function)(void *);
68 typedef int (SHMEM_Grequest_cancel_function)(void *, int);
69
70 #define SHMEM_REQUEST_NULL OSHMEM_PREDEFINED_GLOBAL(SHMEM_Request, oshmem_request_null)
71
72
73
74
75 typedef int (*oshmem_request_free_fn_t)(struct oshmem_request_t** rptr);
76
77
78
79
80 typedef int (*oshmem_request_cancel_fn_t)(struct oshmem_request_t* request,
81 int flag);
82
83
84
85
86
87
88 typedef int (*oshmem_request_complete_fn_t)(struct oshmem_request_t* request);
89
90
91
92
93
94 struct oshmem_group_t;
95
96
97
98
99
100
101
102
103
104 typedef union oshmem_shmem_object_t {
105 struct oshmem_group_t *comm;
106
107 } oshmem_shmem_object_t;
108
109
110
111
112 struct oshmem_request_t {
113 opal_free_list_item_t super;
114 oshmem_request_type_t req_type;
115 oshmem_status_public_t req_status;
116 volatile bool req_complete;
117 volatile oshmem_request_state_t req_state;
118 bool req_persistent;
119
120 int req_f_to_c_index;
121
122 oshmem_request_free_fn_t req_free;
123 oshmem_request_cancel_fn_t req_cancel;
124
125 oshmem_request_complete_fn_t req_complete_cb;
126 void *req_complete_cb_data;
127 oshmem_shmem_object_t req_shmem_object;
128 };
129
130
131
132
133 typedef struct oshmem_request_t oshmem_request_t;
134
135
136
137
138
139
140 #define PREDEFINED_REQUEST_PAD 256
141
142 struct oshmem_predefined_request_t {
143 struct oshmem_request_t request;
144 char padding[PREDEFINED_REQUEST_PAD - sizeof(oshmem_request_t)];
145 };
146
147 typedef struct oshmem_predefined_request_t oshmem_predefined_request_t;
148
149
150
151
152
153
154
155 #define OSHMEM_REQUEST_INIT(request, persistent) \
156 do { \
157 (request)->req_complete = false; \
158 (request)->req_state = OSHMEM_REQUEST_INACTIVE; \
159 (request)->req_persistent = (persistent); \
160 } while (0);
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177 #define OSHMEM_REQUEST_FINI(request) \
178 do { \
179 (request)->req_state = OSHMEM_REQUEST_INVALID; \
180 if (SHMEM_UNDEFINED != (request)->req_f_to_c_index) { \
181 opal_pointer_array_set_item(&oshmem_request_f_to_c_table, \
182 (request)->req_f_to_c_index, NULL); \
183 (request)->req_f_to_c_index = SHMEM_UNDEFINED; \
184 } \
185 } while (0);
186
187
188
189
190
191
192
193
194
195
196
197
198 typedef int (*oshmem_request_test_fn_t)(oshmem_request_t ** rptr,
199 int *completed,
200 oshmem_status_public_t * status);
201
202
203
204
205
206
207
208
209
210
211
212
213
214 typedef int (*oshmem_request_test_any_fn_t)(size_t count,
215 oshmem_request_t ** requests,
216 int *index,
217 int *completed,
218 oshmem_status_public_t * status);
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233 typedef int (*oshmem_request_test_all_fn_t)(size_t count,
234 oshmem_request_t ** requests,
235 int *completed,
236 oshmem_status_public_t * statuses);
237
238
239
240
241
242
243
244
245
246
247
248 typedef int (*oshmem_request_test_some_fn_t)(size_t count,
249 oshmem_request_t ** requests,
250 int * outcount,
251 int * indices,
252 oshmem_status_public_t * statuses);
253
254
255
256
257
258
259
260
261 typedef int (*oshmem_request_wait_fn_t)(oshmem_request_t ** req_ptr,
262 oshmem_status_public_t * status);
263
264
265
266
267
268
269
270
271
272
273 typedef int (*oshmem_request_wait_any_fn_t)(size_t count,
274 oshmem_request_t ** requests,
275 int *index,
276 oshmem_status_public_t * status);
277
278
279
280
281
282
283
284
285
286 typedef int (*oshmem_request_wait_all_fn_t)(size_t count,
287 oshmem_request_t ** requests,
288 oshmem_status_public_t * statuses);
289
290
291
292
293
294
295
296
297
298
299
300 typedef int (*oshmem_request_wait_some_fn_t)(size_t count,
301 oshmem_request_t ** requests,
302 int * outcount,
303 int * indices,
304 oshmem_status_public_t * statuses);
305
306
307
308
309 typedef struct oshmem_request_fns_t {
310 oshmem_request_test_fn_t req_test;
311 oshmem_request_test_any_fn_t req_test_any;
312 oshmem_request_test_all_fn_t req_test_all;
313 oshmem_request_test_some_fn_t req_test_some;
314 oshmem_request_wait_fn_t req_wait;
315 oshmem_request_wait_any_fn_t req_wait_any;
316 oshmem_request_wait_all_fn_t req_wait_all;
317 oshmem_request_wait_some_fn_t req_wait_some;
318 } oshmem_request_fns_t;
319
320
321
322
323 OSHMEM_DECLSPEC extern opal_pointer_array_t oshmem_request_f_to_c_table;
324 OSHMEM_DECLSPEC extern size_t oshmem_request_waiting;
325 OSHMEM_DECLSPEC extern size_t oshmem_request_completed;
326 OSHMEM_DECLSPEC extern int32_t oshmem_request_poll;
327 OSHMEM_DECLSPEC extern opal_mutex_t oshmem_request_lock;
328 OSHMEM_DECLSPEC extern opal_condition_t oshmem_request_cond;
329 OSHMEM_DECLSPEC extern oshmem_predefined_request_t oshmem_request_null;
330 OSHMEM_DECLSPEC extern oshmem_request_t oshmem_request_empty;
331 OSHMEM_DECLSPEC extern oshmem_status_public_t oshmem_status_empty;
332 OSHMEM_DECLSPEC extern oshmem_request_fns_t oshmem_request_functions;
333
334
335
336
337 int oshmem_request_init(void);
338
339
340
341
342
343 OSHMEM_DECLSPEC int oshmem_request_persistent_proc_null_free(oshmem_request_t **request);
344
345
346
347
348 int oshmem_request_finalize(void);
349
350
351
352
353 static inline int oshmem_request_cancel(oshmem_request_t* request)
354 {
355 if (request->req_cancel != NULL ) {
356 return request->req_cancel(request, true);
357 }
358 return OSHMEM_SUCCESS;
359 }
360
361
362
363
364
365
366 static inline int oshmem_request_free(oshmem_request_t** request)
367 {
368 return (*request)->req_free(request);
369 }
370
371 #define oshmem_request_test (oshmem_request_functions.req_test)
372 #define oshmem_request_test_any (oshmem_request_functions.req_test_any)
373 #define oshmem_request_test_all (oshmem_request_functions.req_test_all)
374 #define oshmem_request_test_some (oshmem_request_functions.req_test_some)
375 #define oshmem_request_wait (oshmem_request_functions.req_wait)
376 #define oshmem_request_wait_any (oshmem_request_functions.req_wait_any)
377 #define oshmem_request_wait_all (oshmem_request_functions.req_wait_all)
378 #define oshmem_request_wait_some (oshmem_request_functions.req_wait_some)
379
380
381
382
383
384 static inline void oshmem_request_wait_any_completion(void)
385 {
386 OPAL_THREAD_LOCK(&oshmem_request_lock);
387 oshmem_request_waiting++;
388 opal_condition_wait(&oshmem_request_cond, &oshmem_request_lock);
389 oshmem_request_waiting--;
390 OPAL_THREAD_UNLOCK(&oshmem_request_lock);
391 }
392
393
394
395
396 static inline void oshmem_request_wait_completion(oshmem_request_t *req)
397 {
398 if (false == req->req_complete) {
399 #if OPAL_ENABLE_PROGRESS_THREADS
400 if(opal_progress_spin(&req->req_complete)) {
401 return;
402 }
403 #endif
404 OPAL_THREAD_LOCK(&oshmem_request_lock);
405 oshmem_request_waiting++;
406 while (false == req->req_complete) {
407 opal_condition_wait(&oshmem_request_cond, &oshmem_request_lock);
408 }
409 oshmem_request_waiting--;
410 OPAL_THREAD_UNLOCK(&oshmem_request_lock);
411 }
412 }
413
414
415
416
417
418
419
420
421
422
423 static inline int oshmem_request_complete(oshmem_request_t* request,
424 bool with_signal)
425 {
426 if (NULL != request->req_complete_cb) {
427 request->req_complete_cb(request);
428 }
429 oshmem_request_completed++;
430 request->req_complete = true;
431 if (with_signal && oshmem_request_waiting) {
432
433
434
435 opal_condition_broadcast(&oshmem_request_cond);
436 }
437 return OSHMEM_SUCCESS;
438 }
439
440 END_C_DECLS
441
442 #endif