5
/* begin_generated_IBM_copyright_prolog */
7
/* ---------------------------------------------------------------- */
8
/* (C)Copyright IBM Corp. 2007, 2008 */
10
/* ---------------------------------------------------------------- */
12
/* end_generated_IBM_copyright_prolog */
14
* \file armci/src/x/dcmf/armcix_get.c
15
* \brief DCMF ARMCI Extension for get operations.
18
#include "armcix_impl.h"
20
DCMF_Protocol_t __get_protocol;
23
* \brief Register the DCMF ARMCI Extention get operation.
25
* \see DCMF_Get_register
27
void ARMCIX_DCMF_Get_register ()
29
DCMF_Get_Configuration_t configuration = {
30
DCMF_DEFAULT_GET_PROTOCOL
32
DCMF_Get_register (&__get_protocol, &configuration);
37
* \brief ARMCI Extension blocking get operation.
39
* \param[in] src Source buffer on the remote node
40
* \param[in] dst Destination buffer on the local node
41
* \param[in] bytes Number of bytes to transfer
42
* \param[in] proc Remote node rank
46
int ARMCIX_Get(void * src, void * dst, int bytes, int proc)
48
DCMF_CriticalSection_enter (0);
50
volatile unsigned active = 1;
51
DCMF_Callback_t cb_wait = { ARMCIX_DCMF_cb_decrement, (void *)&active };
52
DCMF_Request_t request;
54
DCMF_Memregion_t * src_memregion = &__connection[proc].remote_mem_region;
55
DCMF_Memregion_t * dst_memregion = &__connection[proc].local_mem_region;
58
DCMF_Get (&__get_protocol,
61
DCMF_SEQUENTIAL_CONSISTENCY,
66
armcix_dcmf_va_to_offset (src_memregion, src),
67
armcix_dcmf_va_to_offset (dst_memregion, dst));
69
while (active) DCMF_Messager_advance ();
71
DCMF_CriticalSection_exit (0);
73
return (result != DCMF_SUCCESS);
78
* \brief ARMCI Extension non-blocking get operation.
80
* \param[in] src Source buffer on the remote node
81
* \param[in] dst Destination buffer on the local node
82
* \param[in] bytes Number of bytes to transfer
83
* \param[in] proc Remote node rank
84
* \param[in] nb_handle ARMCI non-blocking handle
88
int ARMCIX_NbGet (void * src, void * dst, int bytes, int proc, armci_ihdl_t nb_handle)
90
DCMF_CriticalSection_enter (0);
92
armcix_dcmf_opaque_t * dcmf = (armcix_dcmf_opaque_t *) &nb_handle->cmpl_info;
94
dcmf->connection = &__connection[proc];
96
//fprintf (stderr, "ARMCIX_NbGet() dst=%p, src=%p, bytes=%d, request=%p\n", dst, src, bytes, &(dcmf->request));
98
__connection[proc].active++;
99
__global_connection.active++;
101
DCMF_Callback_t cb_free = { ARMCIX_DCMF_NbOp_cb_done, nb_handle };
102
ARMCIX_DCMF_Request_t * new_request = ARMCIX_DCMF_request_allocate (cb_free);
103
DCMF_Callback_t cb_done = { (void(*)(void *)) ARMCIX_DCMF_request_free, new_request };
105
DCMF_Memregion_t * src_memregion = &__connection[proc].remote_mem_region;
106
DCMF_Memregion_t * dst_memregion = &__connection[proc].local_mem_region;
109
DCMF_Get (&__get_protocol,
110
&(new_request->request),
112
DCMF_SEQUENTIAL_CONSISTENCY,
117
armcix_dcmf_va_to_offset (src_memregion, src),
118
armcix_dcmf_va_to_offset (dst_memregion, dst));
120
DCMF_CriticalSection_exit (0);
122
return (result != DCMF_SUCCESS);
128
* \brief ARMCI Extension blocking vector get operation.
130
* \param[in] darr Descriptor array
131
* \param[in] len Length of descriptor array
132
* \param[in] proc Remote process(or) ID
136
int ARMCIX_GetV (armci_giov_t * darr, int len, int proc)
138
armci_ireq_t nb_request;
139
armci_ihdl_t nb_handle = (armci_ihdl_t) &nb_request;
140
ARMCIX_NbGetV (darr, len, proc, nb_handle);
141
ARMCIX_Wait (&nb_handle->cmpl_info);
148
* \brief ARMCI Extension non-blocking vector get operation.
150
* \param[in] darr Descriptor array
151
* \param[in] len Length of descriptor array
152
* \param[in] proc Remote process(or) ID
153
* \param[in] nb_handle ARMCI non-blocking handle
157
int ARMCIX_NbGetV (armci_giov_t * darr, int len, int proc, armci_ihdl_t nb_handle)
159
DCMF_Result result = DCMF_ERROR;
161
DCMF_CriticalSection_enter (0);
163
//fprintf (stderr, "ARMCIX_NbGetV() >> len=%d, proc=%d\n", len, proc);
165
// Calculate the number of requests
168
for (i = 0; i < len; i++)
169
for (j = 0; j < darr[i].ptr_array_len; j++)
172
armcix_dcmf_opaque_t * dcmf = (armcix_dcmf_opaque_t *) &nb_handle->cmpl_info;
173
dcmf->connection = &__connection[proc];
176
__connection[proc].active += n;
177
__global_connection.active += n;
179
//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);
181
DCMF_Memregion_t * src_memregion = &__connection[proc].remote_mem_region;
182
DCMF_Memregion_t * dst_memregion = &__connection[proc].local_mem_region;
184
DCMF_Callback_t cb_free = { ARMCIX_DCMF_NbOp_cb_done, nb_handle };
185
DCMF_Callback_t cb_done = { (void(*)(void *)) ARMCIX_DCMF_request_free, NULL };
186
for (i = 0; i < len; i++)
188
for (j = 0; j < darr[i].ptr_array_len; j++)
190
//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);
191
ARMCIX_DCMF_Request_t * new_request = ARMCIX_DCMF_request_allocate (cb_free);
192
cb_done.clientdata = new_request;
195
DCMF_Get (&__get_protocol,
196
&(new_request->request),
198
DCMF_SEQUENTIAL_CONSISTENCY,
203
armcix_dcmf_va_to_offset (src_memregion, darr[i].src_ptr_array[j]),
204
armcix_dcmf_va_to_offset (dst_memregion, darr[i].dst_ptr_array[j]));
208
//fprintf (stderr, "ARMCIX_NbGetV() << result=%d\n", result);
209
DCMF_CriticalSection_exit (0);
211
return (result != DCMF_SUCCESS);
215
unsigned ARMCIX_DCMF_GetS_recurse (void * src_ptr, int * src_stride_arr,
216
void * dst_ptr, int * dst_stride_arr,
217
int * seg_count, int stride_levels, int proc,
218
armci_ihdl_t nb_handle)
220
unsigned num_requests = 0;
222
//fprintf (stderr, "ARMCIX_DCMF_GetS_recurse() >> \n");
224
if (stride_levels == 0)
226
//fprintf (stderr, "ARMCIX_DCMF_GetS_recurse() dst=%p, src=%p, bytes=%d, request=%p\n", dst_ptr, src_ptr, seg_count[0], request);
228
DCMF_Callback_t cb_free = { ARMCIX_DCMF_NbOp_cb_done, nb_handle };
229
ARMCIX_DCMF_Request_t * new_request = ARMCIX_DCMF_request_allocate (cb_free);
230
DCMF_Callback_t cb_done = { (void(*)(void *)) ARMCIX_DCMF_request_free, new_request };
232
DCMF_Memregion_t * src_memregion = &__connection[proc].remote_mem_region;
233
DCMF_Memregion_t * dst_memregion = &__connection[proc].local_mem_region;
235
DCMF_Get (&__get_protocol,
236
&(new_request->request),
238
DCMF_SEQUENTIAL_CONSISTENCY,
243
armcix_dcmf_va_to_offset (src_memregion, src_ptr),
244
armcix_dcmf_va_to_offset (dst_memregion, dst_ptr));
250
char * src_tmp = (char *) src_ptr;
251
char * dst_tmp = (char *) dst_ptr;
253
for (i = 0; i < seg_count[stride_levels]; i++)
255
num_requests += ARMCIX_DCMF_GetS_recurse (src_tmp, src_stride_arr,
256
dst_tmp, dst_stride_arr,
257
seg_count, (stride_levels-1), proc,
260
src_tmp += src_stride_arr[(stride_levels-1)];
261
dst_tmp += dst_stride_arr[(stride_levels-1)];
265
//fprintf (stderr, "ARMCIX_DCMF_GetS_recurse() << num_requests = %d\n", num_requests);
272
* \brief ARMCI Extension blocking strided get operation.
274
* \param[in] src_ptr pointer to 1st segment at source
275
* \param[in] src_stride_arr array of strides at source
276
* \param[in] dst_ptr pointer to 1st segment at destination
277
* \param[in] dst_stride_arr array of strides at destination
278
* \param[in] seg_count number of segments at each stride levels: count[0]=bytes
279
* \param[in] stride_levels number of stride levels
280
* \param[in] proc remote process(or) ID
284
int ARMCIX_GetS (void * src_ptr, int * src_stride_arr,
285
void * dst_ptr, int * dst_stride_arr,
286
int * seg_count, int stride_levels, int proc)
288
armci_ireq_t nb_request;
289
armci_ihdl_t nb_handle = (armci_ihdl_t) &nb_request;
290
ARMCIX_NbGetS (src_ptr, src_stride_arr, dst_ptr, dst_stride_arr,
291
seg_count, stride_levels, proc, nb_handle);
292
ARMCIX_Wait (&nb_handle->cmpl_info);
298
* \brief ARMCI Extension non-blocking strided get operation.
300
* \param[in] src_ptr pointer to 1st segment at source
301
* \param[in] src_stride_arr array of strides at source
302
* \param[in] dst_ptr pointer to 1st segment at destination
303
* \param[in] dst_stride_arr array of strides at destination
304
* \param[in] seg_count number of segments at each stride levels: count[0]=bytes
305
* \param[in] stride_levels number of stride levels
306
* \param[in] proc remote process(or) ID
307
* \param[in] nb_handle ARMCI non-blocking handle
311
int ARMCIX_NbGetS (void * src_ptr, int * src_stride_arr,
312
void * dst_ptr, int * dst_stride_arr,
313
int * seg_count, int stride_levels, int proc,
314
armci_ihdl_t nb_handle)
316
DCMF_CriticalSection_enter (0);
318
assert (nb_handle != NULL);
319
if (stride_levels > 0)
321
assert (src_stride_arr);
322
assert (dst_stride_arr);
325
// Calculate the number of requests
328
for (i = 0; i < stride_levels; i++) n = n * seg_count[i+1];
330
armcix_dcmf_opaque_t * dcmf = (armcix_dcmf_opaque_t *) &nb_handle->cmpl_info;
331
dcmf->connection = &__connection[proc];
334
__connection[proc].active += n;
335
__global_connection.active += n;
338
count = ARMCIX_DCMF_GetS_recurse (src_ptr, src_stride_arr,
339
dst_ptr, dst_stride_arr,
340
seg_count, stride_levels, proc,
345
DCMF_CriticalSection_exit (0);