4
/* begin_generated_IBM_copyright_prolog */
6
/* ---------------------------------------------------------------- */
7
/* (C)Copyright IBM Corp. 2007, 2008 */
9
/* ---------------------------------------------------------------- */
11
/* end_generated_IBM_copyright_prolog */
13
* \file armci/src/armcix/dcmf/armcix_get.c
14
* \brief DCMF ARMCI Extension for get operations.
17
#include "armcix_impl.h"
19
DCMF_Protocol_t __get_protocol;
22
* \brief Register the DCMF ARMCI Extention get operation.
24
* \see DCMF_Get_register
26
void ARMCIX_DCMF_Get_register ()
28
DCMF_Get_Configuration_t configuration = {
29
DCMF_DEFAULT_GET_PROTOCOL
31
DCMF_Get_register (&__get_protocol, &configuration);
36
* \brief ARMCI Extension blocking get operation.
38
* \param[in] src Source buffer on the remote node
39
* \param[in] dst Destination buffer on the local node
40
* \param[in] bytes Number of bytes to transfer
41
* \param[in] proc Remote node rank
45
int ARMCIX_Get(void * src, void * dst, int bytes, int proc)
47
DCMF_CriticalSection_enter (0);
49
volatile unsigned active = 1;
50
DCMF_Callback_t cb_wait = { ARMCIX_DCMF_cb_decrement, (void *)&active };
51
DCMF_Request_t request;
53
DCMF_Memregion_t * src_memregion = &__connection[proc].remote_mem_region;
54
DCMF_Memregion_t * dst_memregion = &__connection[proc].local_mem_region;
57
DCMF_Get (&__get_protocol,
60
DCMF_SEQUENTIAL_CONSISTENCY,
65
armcix_dcmf_va_to_offset (src_memregion, src),
66
armcix_dcmf_va_to_offset (dst_memregion, dst));
68
while (active) DCMF_Messager_advance ();
70
DCMF_CriticalSection_exit (0);
72
return (result != DCMF_SUCCESS);
77
* \brief ARMCI Extension non-blocking get operation.
79
* \param[in] src Source buffer on the remote node
80
* \param[in] dst Destination buffer on the local node
81
* \param[in] bytes Number of bytes to transfer
82
* \param[in] proc Remote node rank
83
* \param[in] nb_handle ARMCI non-blocking handle
87
int ARMCIX_NbGet (void * src, void * dst, int bytes, int proc, armci_ihdl_t nb_handle)
89
DCMF_CriticalSection_enter (0);
91
armcix_dcmf_opaque_t * dcmf = (armcix_dcmf_opaque_t *) &nb_handle->cmpl_info;
93
dcmf->connection = &__connection[proc];
95
//fprintf (stderr, "ARMCIX_NbGet() dst=%p, src=%p, bytes=%d, request=%p\n", dst, src, bytes, &(dcmf->request));
97
__connection[proc].active++;
98
__global_connection.active++;
100
DCMF_Callback_t cb_free = { ARMCIX_DCMF_NbOp_cb_done, nb_handle };
101
ARMCIX_DCMF_Request_t * new_request = ARMCIX_DCMF_request_allocate (cb_free);
102
DCMF_Callback_t cb_done = { (void (*)(void *, DCMF_Error_t *))ARMCIX_DCMF_request_free, new_request };
104
DCMF_Memregion_t * src_memregion = &__connection[proc].remote_mem_region;
105
DCMF_Memregion_t * dst_memregion = &__connection[proc].local_mem_region;
108
DCMF_Get (&__get_protocol,
109
&(new_request->request),
111
DCMF_SEQUENTIAL_CONSISTENCY,
116
armcix_dcmf_va_to_offset (src_memregion, src),
117
armcix_dcmf_va_to_offset (dst_memregion, dst));
119
DCMF_CriticalSection_exit (0);
121
return (result != DCMF_SUCCESS);
127
* \brief ARMCI Extension blocking vector get operation.
129
* \param[in] darr Descriptor array
130
* \param[in] len Length of descriptor array
131
* \param[in] proc Remote process(or) ID
135
int ARMCIX_GetV (armci_giov_t * darr, int len, int proc)
137
armci_ireq_t nb_request;
138
armci_ihdl_t nb_handle = (armci_ihdl_t) &nb_request;
139
ARMCIX_NbGetV (darr, len, proc, nb_handle);
140
ARMCIX_Wait (&nb_handle->cmpl_info);
147
* \brief ARMCI Extension non-blocking vector get operation.
149
* \param[in] darr Descriptor array
150
* \param[in] len Length of descriptor array
151
* \param[in] proc Remote process(or) ID
152
* \param[in] nb_handle ARMCI non-blocking handle
156
int ARMCIX_NbGetV (armci_giov_t * darr, int len, int proc, armci_ihdl_t nb_handle)
158
DCMF_Result result = DCMF_ERROR;
160
DCMF_CriticalSection_enter (0);
162
//fprintf (stderr, "ARMCIX_NbGetV() >> len=%d, proc=%d\n", len, proc);
164
// Calculate the number of requests
167
for (i = 0; i < len; i++)
168
for (j = 0; j < darr[i].ptr_array_len; j++)
171
armcix_dcmf_opaque_t * dcmf = (armcix_dcmf_opaque_t *) &nb_handle->cmpl_info;
172
dcmf->connection = &__connection[proc];
175
__connection[proc].active += n;
176
__global_connection.active += n;
178
//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);
180
DCMF_Memregion_t * src_memregion = &__connection[proc].remote_mem_region;
181
DCMF_Memregion_t * dst_memregion = &__connection[proc].local_mem_region;
183
DCMF_Callback_t cb_free = { ARMCIX_DCMF_NbOp_cb_done, nb_handle };
184
DCMF_Callback_t cb_done = { (void (*)(void *, DCMF_Error_t *))ARMCIX_DCMF_request_free, NULL };
185
for (i = 0; i < len; i++)
187
for (j = 0; j < darr[i].ptr_array_len; j++)
189
//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);
190
ARMCIX_DCMF_Request_t * new_request = ARMCIX_DCMF_request_allocate (cb_free);
191
cb_done.clientdata = new_request;
194
DCMF_Get (&__get_protocol,
195
&(new_request->request),
197
DCMF_SEQUENTIAL_CONSISTENCY,
202
armcix_dcmf_va_to_offset (src_memregion, darr[i].src_ptr_array[j]),
203
armcix_dcmf_va_to_offset (dst_memregion, darr[i].dst_ptr_array[j]));
207
//fprintf (stderr, "ARMCIX_NbGetV() << result=%d\n", result);
208
DCMF_CriticalSection_exit (0);
210
return (result != DCMF_SUCCESS);
214
unsigned ARMCIX_DCMF_GetS_recurse (void * src_ptr, int * src_stride_arr,
215
void * dst_ptr, int * dst_stride_arr,
216
int * seg_count, int stride_levels, int proc,
217
armci_ihdl_t nb_handle)
219
unsigned num_requests = 0;
221
//fprintf (stderr, "ARMCIX_DCMF_GetS_recurse() >> \n");
223
if (stride_levels == 0)
225
//fprintf (stderr, "ARMCIX_DCMF_GetS_recurse() dst=%p, src=%p, bytes=%d, request=%p\n", dst_ptr, src_ptr, seg_count[0], request);
227
DCMF_Callback_t cb_free = { ARMCIX_DCMF_NbOp_cb_done, nb_handle };
228
ARMCIX_DCMF_Request_t * new_request = ARMCIX_DCMF_request_allocate (cb_free);
229
DCMF_Callback_t cb_done = { (void (*)(void *, DCMF_Error_t *))ARMCIX_DCMF_request_free, new_request };
231
DCMF_Memregion_t * src_memregion = &__connection[proc].remote_mem_region;
232
DCMF_Memregion_t * dst_memregion = &__connection[proc].local_mem_region;
234
DCMF_Get (&__get_protocol,
235
&(new_request->request),
237
DCMF_SEQUENTIAL_CONSISTENCY,
242
armcix_dcmf_va_to_offset (src_memregion, src_ptr),
243
armcix_dcmf_va_to_offset (dst_memregion, dst_ptr));
249
char * src_tmp = (char *) src_ptr;
250
char * dst_tmp = (char *) dst_ptr;
252
for (i = 0; i < seg_count[stride_levels]; i++)
254
num_requests += ARMCIX_DCMF_GetS_recurse (src_tmp, src_stride_arr,
255
dst_tmp, dst_stride_arr,
256
seg_count, (stride_levels-1), proc,
259
src_tmp += src_stride_arr[(stride_levels-1)];
260
dst_tmp += dst_stride_arr[(stride_levels-1)];
264
//fprintf (stderr, "ARMCIX_DCMF_GetS_recurse() << num_requests = %d\n", num_requests);
271
* \brief ARMCI Extension blocking strided get operation.
273
* \param[in] src_ptr pointer to 1st segment at source
274
* \param[in] src_stride_arr array of strides at source
275
* \param[in] dst_ptr pointer to 1st segment at destination
276
* \param[in] dst_stride_arr array of strides at destination
277
* \param[in] seg_count number of segments at each stride levels: count[0]=bytes
278
* \param[in] stride_levels number of stride levels
279
* \param[in] proc remote process(or) ID
283
int ARMCIX_GetS (void * src_ptr, int * src_stride_arr,
284
void * dst_ptr, int * dst_stride_arr,
285
int * seg_count, int stride_levels, int proc)
287
armci_ireq_t nb_request;
288
armci_ihdl_t nb_handle = (armci_ihdl_t) &nb_request;
289
ARMCIX_NbGetS (src_ptr, src_stride_arr, dst_ptr, dst_stride_arr,
290
seg_count, stride_levels, proc, nb_handle);
291
ARMCIX_Wait (&nb_handle->cmpl_info);
297
* \brief ARMCI Extension non-blocking strided get operation.
299
* \param[in] src_ptr pointer to 1st segment at source
300
* \param[in] src_stride_arr array of strides at source
301
* \param[in] dst_ptr pointer to 1st segment at destination
302
* \param[in] dst_stride_arr array of strides at destination
303
* \param[in] seg_count number of segments at each stride levels: count[0]=bytes
304
* \param[in] stride_levels number of stride levels
305
* \param[in] proc remote process(or) ID
306
* \param[in] nb_handle ARMCI non-blocking handle
310
int ARMCIX_NbGetS (void * src_ptr, int * src_stride_arr,
311
void * dst_ptr, int * dst_stride_arr,
312
int * seg_count, int stride_levels, int proc,
313
armci_ihdl_t nb_handle)
315
DCMF_CriticalSection_enter (0);
317
assert (nb_handle != NULL);
318
if (stride_levels > 0)
320
assert (src_stride_arr);
321
assert (dst_stride_arr);
324
// Calculate the number of requests
327
for (i = 0; i < stride_levels; i++) n = n * seg_count[i+1];
329
armcix_dcmf_opaque_t * dcmf = (armcix_dcmf_opaque_t *) &nb_handle->cmpl_info;
330
dcmf->connection = &__connection[proc];
333
__connection[proc].active += n;
334
__global_connection.active += n;
337
count = ARMCIX_DCMF_GetS_recurse (src_ptr, src_stride_arr,
338
dst_ptr, dst_stride_arr,
339
seg_count, stride_levels, proc,
344
DCMF_CriticalSection_exit (0);