1
/* begin_generated_IBM_copyright_prolog */
3
/* ---------------------------------------------------------------- */
4
/* (C)Copyright IBM Corp. 2007, 2008 */
6
/* ---------------------------------------------------------------- */
8
/* end_generated_IBM_copyright_prolog */
10
* \file armci/src/armcix/dcmf/armcix_get.c
11
* \brief DCMF ARMCI Extension for get operations.
14
#include "armcix_impl.h"
16
DCMF_Protocol_t __get_protocol;
19
* \brief Register the DCMF ARMCI Extention get operation.
21
* \see DCMF_Get_register
23
void ARMCIX_DCMF_Get_register ()
25
DCMF_Get_Configuration_t configuration = {
26
DCMF_DEFAULT_GET_PROTOCOL
28
DCMF_Get_register (&__get_protocol, &configuration);
33
* \brief ARMCI Extension blocking get operation.
35
* \param[in] src Source buffer on the remote node
36
* \param[in] dst Destination buffer on the local node
37
* \param[in] bytes Number of bytes to transfer
38
* \param[in] proc Remote node rank
42
int ARMCIX_Get(void * src, void * dst, int bytes, int proc)
44
DCMF_CriticalSection_enter (0);
46
volatile unsigned active = 1;
47
DCMF_Callback_t cb_wait = { ARMCIX_DCMF_cb_decrement, (void *)&active };
48
DCMF_Request_t request;
50
DCMF_Memregion_t * src_memregion = &__connection[proc].remote_mem_region;
51
DCMF_Memregion_t * dst_memregion = &__connection[proc].local_mem_region;
54
DCMF_Get (&__get_protocol,
57
DCMF_SEQUENTIAL_CONSISTENCY,
62
armcix_dcmf_va_to_offset (src_memregion, src),
63
armcix_dcmf_va_to_offset (dst_memregion, dst));
65
while (active) DCMF_Messager_advance ();
67
DCMF_CriticalSection_exit (0);
69
return (result != DCMF_SUCCESS);
74
* \brief ARMCI Extension non-blocking get operation.
76
* \param[in] src Source buffer on the remote node
77
* \param[in] dst Destination buffer on the local node
78
* \param[in] bytes Number of bytes to transfer
79
* \param[in] proc Remote node rank
80
* \param[in] nb_handle ARMCI non-blocking handle
84
int ARMCIX_NbGet (void * src, void * dst, int bytes, int proc, armci_ihdl_t nb_handle)
86
DCMF_CriticalSection_enter (0);
88
armcix_dcmf_opaque_t * dcmf = (armcix_dcmf_opaque_t *) &nb_handle->cmpl_info;
90
dcmf->connection = &__connection[proc];
92
//fprintf (stderr, "ARMCIX_NbGet() dst=%p, src=%p, bytes=%d, request=%p\n", dst, src, bytes, &(dcmf->request));
94
__connection[proc].active++;
95
__global_connection.active++;
97
DCMF_Callback_t cb_free = { ARMCIX_DCMF_NbOp_cb_done, nb_handle };
98
ARMCIX_DCMF_Request_t * new_request = ARMCIX_DCMF_request_allocate (cb_free);
99
DCMF_Callback_t cb_done = { (void (*)(void *, DCMF_Error_t *))ARMCIX_DCMF_request_free, new_request };
101
DCMF_Memregion_t * src_memregion = &__connection[proc].remote_mem_region;
102
DCMF_Memregion_t * dst_memregion = &__connection[proc].local_mem_region;
105
DCMF_Get (&__get_protocol,
106
&(new_request->request),
108
DCMF_SEQUENTIAL_CONSISTENCY,
113
armcix_dcmf_va_to_offset (src_memregion, src),
114
armcix_dcmf_va_to_offset (dst_memregion, dst));
116
DCMF_CriticalSection_exit (0);
118
return (result != DCMF_SUCCESS);
124
* \brief ARMCI Extension blocking vector get operation.
126
* \param[in] darr Descriptor array
127
* \param[in] len Length of descriptor array
128
* \param[in] proc Remote process(or) ID
132
int ARMCIX_GetV (armci_giov_t * darr, int len, int proc)
134
armci_ireq_t nb_request;
135
armci_ihdl_t nb_handle = (armci_ihdl_t) &nb_request;
136
ARMCIX_NbGetV (darr, len, proc, nb_handle);
137
ARMCIX_Wait (&nb_handle->cmpl_info);
144
* \brief ARMCI Extension non-blocking vector get operation.
146
* \param[in] darr Descriptor array
147
* \param[in] len Length of descriptor array
148
* \param[in] proc Remote process(or) ID
149
* \param[in] nb_handle ARMCI non-blocking handle
153
int ARMCIX_NbGetV (armci_giov_t * darr, int len, int proc, armci_ihdl_t nb_handle)
155
DCMF_Result result = DCMF_ERROR;
157
DCMF_CriticalSection_enter (0);
159
//fprintf (stderr, "ARMCIX_NbGetV() >> len=%d, proc=%d\n", len, proc);
161
// Calculate the number of requests
164
for (i = 0; i < len; i++)
165
for (j = 0; j < darr[i].ptr_array_len; j++)
168
armcix_dcmf_opaque_t * dcmf = (armcix_dcmf_opaque_t *) &nb_handle->cmpl_info;
169
dcmf->connection = &__connection[proc];
172
__connection[proc].active += n;
173
__global_connection.active += n;
175
//fprintf (stderr, "ARMCIX_NbGetV() -- n=%d, dcmf->active=%d, __connection[%d].active=%d, __global_connection.active=%d\n", n, dcmf->active, proc, __connection[proc].active, __global_connection.active);
177
DCMF_Memregion_t * src_memregion = &__connection[proc].remote_mem_region;
178
DCMF_Memregion_t * dst_memregion = &__connection[proc].local_mem_region;
180
DCMF_Callback_t cb_free = { ARMCIX_DCMF_NbOp_cb_done, nb_handle };
181
DCMF_Callback_t cb_done = { (void (*)(void *, DCMF_Error_t *))ARMCIX_DCMF_request_free, NULL };
182
for (i = 0; i < len; i++)
184
for (j = 0; j < darr[i].ptr_array_len; j++)
186
//fprintf (stderr, "ARMCIX_NbGetV() -- src=%p, dst=%p, bytes=%d\n", darr[i].src_ptr_array[j], darr[i].dst_ptr_array[j], darr[i].bytes);
187
ARMCIX_DCMF_Request_t * new_request = ARMCIX_DCMF_request_allocate (cb_free);
188
cb_done.clientdata = new_request;
191
DCMF_Get (&__get_protocol,
192
&(new_request->request),
194
DCMF_SEQUENTIAL_CONSISTENCY,
199
armcix_dcmf_va_to_offset (src_memregion, darr[i].src_ptr_array[j]),
200
armcix_dcmf_va_to_offset (dst_memregion, darr[i].dst_ptr_array[j]));
204
//fprintf (stderr, "ARMCIX_NbGetV() << result=%d\n", result);
205
DCMF_CriticalSection_exit (0);
207
return (result != DCMF_SUCCESS);
211
unsigned ARMCIX_DCMF_GetS_recurse (void * src_ptr, int * src_stride_arr,
212
void * dst_ptr, int * dst_stride_arr,
213
int * seg_count, int stride_levels, int proc,
214
armci_ihdl_t nb_handle)
216
unsigned num_requests = 0;
218
//fprintf (stderr, "ARMCIX_DCMF_GetS_recurse() >> \n");
220
if (stride_levels == 0)
222
//fprintf (stderr, "ARMCIX_DCMF_GetS_recurse() dst=%p, src=%p, bytes=%d, request=%p\n", dst_ptr, src_ptr, seg_count[0], request);
224
DCMF_Callback_t cb_free = { ARMCIX_DCMF_NbOp_cb_done, nb_handle };
225
ARMCIX_DCMF_Request_t * new_request = ARMCIX_DCMF_request_allocate (cb_free);
226
DCMF_Callback_t cb_done = { (void (*)(void *, DCMF_Error_t *))ARMCIX_DCMF_request_free, new_request };
228
DCMF_Memregion_t * src_memregion = &__connection[proc].remote_mem_region;
229
DCMF_Memregion_t * dst_memregion = &__connection[proc].local_mem_region;
231
DCMF_Get (&__get_protocol,
232
&(new_request->request),
234
DCMF_SEQUENTIAL_CONSISTENCY,
239
armcix_dcmf_va_to_offset (src_memregion, src_ptr),
240
armcix_dcmf_va_to_offset (dst_memregion, dst_ptr));
246
char * src_tmp = (char *) src_ptr;
247
char * dst_tmp = (char *) dst_ptr;
249
for (i = 0; i < seg_count[stride_levels]; i++)
251
num_requests += ARMCIX_DCMF_GetS_recurse (src_tmp, src_stride_arr,
252
dst_tmp, dst_stride_arr,
253
seg_count, (stride_levels-1), proc,
256
src_tmp += src_stride_arr[(stride_levels-1)];
257
dst_tmp += dst_stride_arr[(stride_levels-1)];
261
//fprintf (stderr, "ARMCIX_DCMF_GetS_recurse() << num_requests = %d\n", num_requests);
268
* \brief ARMCI Extension blocking strided get operation.
270
* \param[in] src_ptr pointer to 1st segment at source
271
* \param[in] src_stride_arr array of strides at source
272
* \param[in] dst_ptr pointer to 1st segment at destination
273
* \param[in] dst_stride_arr array of strides at destination
274
* \param[in] seg_count number of segments at each stride levels: count[0]=bytes
275
* \param[in] stride_levels number of stride levels
276
* \param[in] proc remote process(or) ID
280
int ARMCIX_GetS (void * src_ptr, int * src_stride_arr,
281
void * dst_ptr, int * dst_stride_arr,
282
int * seg_count, int stride_levels, int proc)
284
armci_ireq_t nb_request;
285
armci_ihdl_t nb_handle = (armci_ihdl_t) &nb_request;
286
ARMCIX_NbGetS (src_ptr, src_stride_arr, dst_ptr, dst_stride_arr,
287
seg_count, stride_levels, proc, nb_handle);
288
ARMCIX_Wait (&nb_handle->cmpl_info);
294
* \brief ARMCI Extension non-blocking strided get operation.
296
* \param[in] src_ptr pointer to 1st segment at source
297
* \param[in] src_stride_arr array of strides at source
298
* \param[in] dst_ptr pointer to 1st segment at destination
299
* \param[in] dst_stride_arr array of strides at destination
300
* \param[in] seg_count number of segments at each stride levels: count[0]=bytes
301
* \param[in] stride_levels number of stride levels
302
* \param[in] proc remote process(or) ID
303
* \param[in] nb_handle ARMCI non-blocking handle
307
int ARMCIX_NbGetS (void * src_ptr, int * src_stride_arr,
308
void * dst_ptr, int * dst_stride_arr,
309
int * seg_count, int stride_levels, int proc,
310
armci_ihdl_t nb_handle)
312
DCMF_CriticalSection_enter (0);
314
assert (nb_handle != NULL);
315
if (stride_levels > 0)
317
assert (src_stride_arr);
318
assert (dst_stride_arr);
321
// Calculate the number of requests
324
for (i = 0; i < stride_levels; i++) n = n * seg_count[i+1];
326
armcix_dcmf_opaque_t * dcmf = (armcix_dcmf_opaque_t *) &nb_handle->cmpl_info;
327
dcmf->connection = &__connection[proc];
330
__connection[proc].active += n;
331
__global_connection.active += n;
334
count = ARMCIX_DCMF_GetS_recurse (src_ptr, src_stride_arr,
335
dst_ptr, dst_stride_arr,
336
seg_count, stride_levels, proc,
341
DCMF_CriticalSection_exit (0);