~ubuntu-branches/ubuntu/saucy/nwchem/saucy

« back to all changes in this revision

Viewing changes to src/tools/ga-4-3/armci/src/armcix/dcmf-0.3.0/armcix_get.c

  • Committer: Package Import Robot
  • Author(s): Michael Banck, Michael Banck, Daniel Leidert
  • Date: 2012-02-09 20:02:41 UTC
  • mfrom: (1.1.1)
  • Revision ID: package-import@ubuntu.com-20120209200241-jgk03qfsphal4ug2
Tags: 6.1-1
* New upstream release.

[ Michael Banck ]
* debian/patches/02_makefile_flags.patch: Updated.
* debian/patches/02_makefile_flags.patch: Use internal blas and lapack code.
* debian/patches/02_makefile_flags.patch: Define GCC4 for LINUX and LINUX64
  (Closes: #632611 and LP: #791308).
* debian/control (Build-Depends): Added openssh-client.
* debian/rules (USE_SCALAPACK, SCALAPACK): Removed variables (Closes:
  #654658).
* debian/rules (LIBDIR, USE_MPIF4, ARMCI_NETWORK): New variables.
* debian/TODO: New file.
* debian/control (Build-Depends): Removed libblas-dev, liblapack-dev and
  libscalapack-mpi-dev.
* debian/patches/04_show_testsuite_diff_output.patch: New patch, shows the
  diff output for failed tests.
* debian/patches/series: Adjusted.
* debian/testsuite: Optionally run all tests if "all" is passed as option.
* debian/rules: Run debian/testsuite with "all" if DEB_BUILD_OPTIONS
  contains "checkall".

[ Daniel Leidert ]
* debian/control: Used wrap-and-sort. Added Vcs-Svn and Vcs-Browser fields.
  (Priority): Moved to extra according to policy section 2.5.
  (Standards-Version): Bumped to 3.9.2.
  (Description): Fixed a typo.
* debian/watch: Added.
* debian/patches/03_hurd-i386_define_path_max.patch: Added.
  - Define MAX_PATH if not defines to fix FTBFS on hurd.
* debian/patches/series: Adjusted.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* begin_generated_IBM_copyright_prolog                             */
 
2
/*                                                                  */
 
3
/* ---------------------------------------------------------------- */
 
4
/* (C)Copyright IBM Corp.  2007, 2008                               */
 
5
/* IBM BSD License                                                  */
 
6
/* ---------------------------------------------------------------- */
 
7
/*                                                                  */
 
8
/* end_generated_IBM_copyright_prolog                               */
 
9
/**
 
10
 * \file armci/src/armcix/dcmf/armcix_get.c
 
11
 * \brief DCMF ARMCI Extension for get operations.
 
12
 */
 
13
 
 
14
#include "armcix_impl.h"
 
15
 
 
16
DCMF_Protocol_t __get_protocol;
 
17
 
 
18
/**
 
19
 * \brief Register the DCMF ARMCI Extention get operation.
 
20
 *
 
21
 * \see DCMF_Get_register
 
22
 */
 
23
void ARMCIX_DCMF_Get_register ()
 
24
{
 
25
  DCMF_Get_Configuration_t configuration = {
 
26
    DCMF_DEFAULT_GET_PROTOCOL
 
27
  };
 
28
  DCMF_Get_register (&__get_protocol, &configuration);
 
29
}
 
30
 
 
31
 
 
32
/**
 
33
 * \brief ARMCI Extension blocking get operation.
 
34
 *
 
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
 
39
 *
 
40
 * \retval 0 Success
 
41
 */
 
42
int ARMCIX_Get(void * src, void * dst, int bytes, int proc)
 
43
{
 
44
  DCMF_CriticalSection_enter (0);
 
45
 
 
46
  volatile unsigned active = 1;
 
47
  DCMF_Callback_t cb_wait = { ARMCIX_DCMF_cb_decrement, (void *)&active };
 
48
  DCMF_Request_t request;
 
49
 
 
50
  DCMF_Memregion_t * src_memregion = &__connection[proc].remote_mem_region;
 
51
  DCMF_Memregion_t * dst_memregion = &__connection[proc].local_mem_region;
 
52
 
 
53
  DCMF_Result result =
 
54
    DCMF_Get (&__get_protocol,
 
55
              &request,
 
56
              cb_wait,
 
57
              DCMF_SEQUENTIAL_CONSISTENCY,
 
58
              proc,
 
59
              bytes,
 
60
              src_memregion,
 
61
              dst_memregion,
 
62
              armcix_dcmf_va_to_offset (src_memregion, src),
 
63
              armcix_dcmf_va_to_offset (dst_memregion, dst));
 
64
 
 
65
  while (active) DCMF_Messager_advance ();
 
66
 
 
67
  DCMF_CriticalSection_exit  (0);
 
68
 
 
69
  return (result != DCMF_SUCCESS);
 
70
}
 
71
 
 
72
 
 
73
/**
 
74
 * \brief ARMCI Extension non-blocking get operation.
 
75
 *
 
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
 
81
 *
 
82
 * \return ???
 
83
 */
 
84
int ARMCIX_NbGet (void * src, void * dst, int bytes, int proc, armci_ihdl_t nb_handle)
 
85
{
 
86
  DCMF_CriticalSection_enter (0);
 
87
 
 
88
  armcix_dcmf_opaque_t * dcmf = (armcix_dcmf_opaque_t *) &nb_handle->cmpl_info;
 
89
  dcmf->active = 1;
 
90
  dcmf->connection = &__connection[proc];
 
91
 
 
92
  //fprintf (stderr, "ARMCIX_NbGet() dst=%p, src=%p, bytes=%d, request=%p\n", dst, src, bytes, &(dcmf->request));
 
93
 
 
94
  __connection[proc].active++;
 
95
  __global_connection.active++;
 
96
 
 
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 };
 
100
 
 
101
  DCMF_Memregion_t * src_memregion = &__connection[proc].remote_mem_region;
 
102
  DCMF_Memregion_t * dst_memregion = &__connection[proc].local_mem_region;
 
103
 
 
104
  DCMF_Result result =
 
105
    DCMF_Get (&__get_protocol,
 
106
              &(new_request->request),
 
107
              cb_done,
 
108
              DCMF_SEQUENTIAL_CONSISTENCY,
 
109
              proc,
 
110
              bytes,
 
111
              src_memregion,
 
112
              dst_memregion,
 
113
              armcix_dcmf_va_to_offset (src_memregion, src),
 
114
              armcix_dcmf_va_to_offset (dst_memregion, dst));
 
115
 
 
116
  DCMF_CriticalSection_exit (0);
 
117
 
 
118
  return (result != DCMF_SUCCESS);
 
119
}
 
120
 
 
121
 
 
122
 
 
123
/**
 
124
 * \brief ARMCI Extension blocking vector get operation.
 
125
 *
 
126
 * \param[in] darr      Descriptor array
 
127
 * \param[in] len       Length of descriptor array
 
128
 * \param[in] proc      Remote process(or) ID
 
129
 *
 
130
 * \return ???
 
131
 */
 
132
int ARMCIX_GetV (armci_giov_t * darr, int len, int proc)
 
133
{
 
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);
 
138
 
 
139
  return 0;
 
140
}
 
141
 
 
142
 
 
143
/**
 
144
 * \brief ARMCI Extension non-blocking vector get operation.
 
145
 *
 
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
 
150
 *
 
151
 * \return ???
 
152
 */
 
153
int ARMCIX_NbGetV (armci_giov_t * darr, int len, int proc, armci_ihdl_t nb_handle)
 
154
{
 
155
  DCMF_Result result = DCMF_ERROR;
 
156
 
 
157
  DCMF_CriticalSection_enter (0);
 
158
 
 
159
  //fprintf (stderr, "ARMCIX_NbGetV() >> len=%d, proc=%d\n", len, proc);
 
160
 
 
161
  // Calculate the number of requests
 
162
  unsigned n = 0;
 
163
  unsigned i, j;
 
164
  for (i = 0; i < len; i++)
 
165
    for (j = 0; j < darr[i].ptr_array_len; j++)
 
166
      n++;
 
167
 
 
168
  armcix_dcmf_opaque_t * dcmf = (armcix_dcmf_opaque_t *) &nb_handle->cmpl_info;
 
169
  dcmf->connection = &__connection[proc];
 
170
  dcmf->active = n;
 
171
 
 
172
  __connection[proc].active += n;
 
173
  __global_connection.active += n;
 
174
 
 
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);
 
176
 
 
177
  DCMF_Memregion_t * src_memregion = &__connection[proc].remote_mem_region;
 
178
  DCMF_Memregion_t * dst_memregion = &__connection[proc].local_mem_region;
 
179
 
 
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++)
 
183
  {
 
184
    for (j = 0; j < darr[i].ptr_array_len; j++)
 
185
    {
 
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;
 
189
 
 
190
      result =
 
191
        DCMF_Get (&__get_protocol,
 
192
                  &(new_request->request),
 
193
                  cb_done,
 
194
                  DCMF_SEQUENTIAL_CONSISTENCY,
 
195
                  proc,
 
196
                  darr[i].bytes,
 
197
                  src_memregion,
 
198
                  dst_memregion,
 
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]));
 
201
    }
 
202
  }
 
203
 
 
204
  //fprintf (stderr, "ARMCIX_NbGetV() << result=%d\n", result);
 
205
  DCMF_CriticalSection_exit  (0);
 
206
 
 
207
  return (result != DCMF_SUCCESS);
 
208
}
 
209
 
 
210
 
 
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)
 
215
{
 
216
  unsigned num_requests = 0;
 
217
 
 
218
  //fprintf (stderr, "ARMCIX_DCMF_GetS_recurse() >> \n");
 
219
 
 
220
  if (stride_levels == 0)
 
221
  {
 
222
    //fprintf (stderr, "ARMCIX_DCMF_GetS_recurse() dst=%p, src=%p, bytes=%d, request=%p\n", dst_ptr, src_ptr, seg_count[0], request);
 
223
 
 
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 };
 
227
 
 
228
    DCMF_Memregion_t * src_memregion = &__connection[proc].remote_mem_region;
 
229
    DCMF_Memregion_t * dst_memregion = &__connection[proc].local_mem_region;
 
230
 
 
231
    DCMF_Get (&__get_protocol,
 
232
              &(new_request->request),
 
233
              cb_done,
 
234
              DCMF_SEQUENTIAL_CONSISTENCY,
 
235
              proc,
 
236
              seg_count[0],
 
237
              src_memregion,
 
238
              dst_memregion,
 
239
              armcix_dcmf_va_to_offset (src_memregion, src_ptr),
 
240
              armcix_dcmf_va_to_offset (dst_memregion, dst_ptr));
 
241
 
 
242
    num_requests++;
 
243
  }
 
244
  else
 
245
  {
 
246
    char * src_tmp = (char *) src_ptr;
 
247
    char * dst_tmp = (char *) dst_ptr;
 
248
    unsigned i;
 
249
    for (i = 0; i < seg_count[stride_levels]; i++)
 
250
    {
 
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,
 
254
                                                nb_handle);
 
255
 
 
256
      src_tmp += src_stride_arr[(stride_levels-1)];
 
257
      dst_tmp += dst_stride_arr[(stride_levels-1)];
 
258
    }
 
259
  }
 
260
 
 
261
  //fprintf (stderr, "ARMCIX_DCMF_GetS_recurse() << num_requests = %d\n", num_requests);
 
262
 
 
263
  return num_requests;
 
264
}
 
265
 
 
266
 
 
267
/**
 
268
 * \brief ARMCI Extension blocking strided get operation.
 
269
 *
 
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
 
277
 *
 
278
 * \return ???
 
279
 */
 
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)
 
283
{
 
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);
 
289
 
 
290
  return 0;
 
291
}
 
292
 
 
293
/**
 
294
 * \brief ARMCI Extension non-blocking strided get operation.
 
295
 *
 
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
 
304
 *
 
305
 * \return ???
 
306
 */
 
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)
 
311
{
 
312
  DCMF_CriticalSection_enter (0);
 
313
 
 
314
  assert (nb_handle != NULL);
 
315
  if (stride_levels > 0)
 
316
  {
 
317
    assert (src_stride_arr);
 
318
    assert (dst_stride_arr);
 
319
  }
 
320
 
 
321
  // Calculate the number of requests
 
322
  unsigned i;
 
323
  unsigned n = 1;
 
324
  for (i = 0; i < stride_levels; i++) n = n * seg_count[i+1];
 
325
 
 
326
  armcix_dcmf_opaque_t * dcmf = (armcix_dcmf_opaque_t *) &nb_handle->cmpl_info;
 
327
  dcmf->connection = &__connection[proc];
 
328
  dcmf->active = n;
 
329
 
 
330
  __connection[proc].active += n;
 
331
  __global_connection.active += n;
 
332
 
 
333
  unsigned count;
 
334
  count = ARMCIX_DCMF_GetS_recurse (src_ptr, src_stride_arr, 
 
335
                                    dst_ptr, dst_stride_arr, 
 
336
                                    seg_count, stride_levels, proc,
 
337
                                    nb_handle);
 
338
 
 
339
  assert (n == count);
 
340
 
 
341
  DCMF_CriticalSection_exit  (0);
 
342
 
 
343
  return 0;
 
344
}