libxmp/libxmpf in Omni Compiler  1.3.4
xmp_reduce.c File Reference
#include <string.h>
#include <stdlib.h>
#include <stdarg.h>
#include <limits.h>
#include <float.h>
#include "mpi.h"
#include "xmp_internal.h"
Include dependency graph for xmp_reduce.c:

Macros

#define MPI_PORTABLE_PLATFORM_H
 
#define _XMP_M_COMPARE_REDUCE_RESULTS_MAIN(type)
 
#define _XMP_M_INIT_LOCATION_VARIABLES_MAIN(type, init_min, init_max)
 
#define _XMP_M_DEFINE_WITH_CAST(type, addr, value)   *(type *)addr = (type)value;
 

Functions

void _XMP_setup_reduce_type (MPI_Datatype *mpi_datatype, size_t *datatype_size, int datatype)
 
void _XMP_reduce_NODES_ENTIRE (_XMP_nodes_t *nodes, void *addr, int count, int datatype, int op)
 
void _XMP_reduce_FLMM_NODES_ENTIRE (_XMP_nodes_t *nodes, void *addr, int count, int datatype, int op, int num_locs,...)
 
void _XMPF_reduce_FLMM_NODES_ENTIRE (_XMP_nodes_t *nodes, void *addr, int count, int datatype, int op, int num_locs, void **loc_vars, int *loc_types)
 
void _XMP_reduce_CLAUSE (void *data_addr, int count, int datatype, int op)
 
void _XMP_reduce_FLMM_CLAUSE (void *data_addr, int count, int datatype, int op, int num_locs,...)
 
int _XMP_init_reduce_comm_NODES (_XMP_nodes_t *nodes,...)
 
int _XMP_init_reduce_comm_TEMPLATE (_XMP_template_t *template,...)
 
void xmp_reduce_initialize ()
 
void xmp_reduce_loc_init (const int nlocs, const long double value, void *value_addr, const int datatype)
 
void xmp_reduce_loc_set (void *buf, const int length, const size_t s)
 
void xmp_reduce_loc_execute (const int op)
 

Macro Definition Documentation

◆ _XMP_M_COMPARE_REDUCE_RESULTS_MAIN

#define _XMP_M_COMPARE_REDUCE_RESULTS_MAIN (   type)
Value:
{ \
type *buf1 = (type *)temp_buffer; \
type *buf2 = (type *)addr; \
for (int i = 0; i < count; i++) { \
if (buf1[i] == buf2[i]) cmp_buffer[i] = _XMP_N_INT_TRUE; \
else cmp_buffer[i] = _XMP_N_INT_FALSE; \
} \
break; \
}

◆ _XMP_M_DEFINE_WITH_CAST

#define _XMP_M_DEFINE_WITH_CAST (   type,
  addr,
  value 
)    *(type *)addr = (type)value;

◆ _XMP_M_INIT_LOCATION_VARIABLES_MAIN

#define _XMP_M_INIT_LOCATION_VARIABLES_MAIN (   type,
  init_min,
  init_max 
)
Value:
{ \
type *buf = (type *)loc; \
for (int i = 0; i < count; i++) { \
if (!cmp_buffer[i]) { \
switch (op) { \
buf[i] = init_max; \
break; \
buf[i] = init_min; \
break; \
default: \
_XMP_fatal("unknown reduce operation"); \
} \
} \
} \
break; \
}

◆ MPI_PORTABLE_PLATFORM_H

#define MPI_PORTABLE_PLATFORM_H

Function Documentation

◆ _XMP_init_reduce_comm_NODES()

int _XMP_init_reduce_comm_NODES ( _XMP_nodes_t nodes,
  ... 
)
414  {
415  int color = 1;
416  if (nodes->is_member) {
417  int acc_nodes_size = 1;
418  int nodes_dim = nodes->dim;
419 
420  va_list args;
421  va_start(args, nodes);
422  for (int i = 0; i < nodes_dim; i++) {
423  int size = nodes->info[i].size;
424  int rank = nodes->info[i].rank;
425 
426  if (va_arg(args, int) == 1) {
427  color += (acc_nodes_size * rank);
428  }
429 
430  acc_nodes_size *= size;
431  }
432  va_end(args);
433  } else {
434  color = 0;
435  }
436 
437  MPI_Comm *comm = _XMP_alloc(sizeof(MPI_Comm));
438  MPI_Comm_split(*((MPI_Comm *)(_XMP_get_execution_nodes())->comm), color, _XMP_world_rank, comm);
439 
440  if (color == 0) {
441  _XMP_finalize_comm(comm);
442  return _XMP_N_INT_FALSE;
443  } else {
444  _XMP_push_comm(comm);
445  return _XMP_N_INT_TRUE;
446  }
447 }

◆ _XMP_init_reduce_comm_TEMPLATE()

int _XMP_init_reduce_comm_TEMPLATE ( _XMP_template_t template,
  ... 
)
449  {
450  _XMP_ASSERT(template->is_distributed);
451 
452  _XMP_nodes_t *onto_nodes = template->onto_nodes;
453 
454  int color = 1;
455  if (onto_nodes->is_member) {
456  int acc_nodes_size = 1;
457  int template_dim = template->dim;
458 
459  va_list args;
460  va_start(args, template);
461  for (int i = 0; i < template_dim; i++) {
462  _XMP_template_chunk_t *chunk = &(template->chunk[i]);
463 
464  int size, rank;
465  if (chunk->dist_manner == _XMP_N_DIST_DUPLICATION) {
466  size = 1;
467  rank = 0;
468  }
469  else {
470  _XMP_nodes_info_t *onto_nodes_info = chunk->onto_nodes_info;
471  size = onto_nodes_info->size;
472  rank = onto_nodes_info->rank;
473  }
474 
475  if (va_arg(args, int) == 1) {
476  color += (acc_nodes_size * rank);
477  }
478 
479  acc_nodes_size *= size;
480  }
481  va_end(args);
482  } else {
483  color = 0;
484  }
485 
486  MPI_Comm *comm = _XMP_alloc(sizeof(MPI_Comm));
487  MPI_Comm_split(*((MPI_Comm *)(_XMP_get_execution_nodes())->comm), color, _XMP_world_rank, comm);
488 
489  if (color == 0) {
490  _XMP_finalize_comm(comm);
491  return _XMP_N_INT_FALSE;
492  } else {
493  _XMP_push_comm(comm);
494  return _XMP_N_INT_TRUE;
495  }
496 }

◆ _XMP_reduce_CLAUSE()

void _XMP_reduce_CLAUSE ( void *  data_addr,
int  count,
int  datatype,
int  op 
)
351  {
353 
354  // setup information
355  MPI_Datatype mpi_datatype = MPI_INT; // dummy
356  size_t datatype_size; // not used in this function
357  MPI_Op mpi_op = MPI_SUM; // dummy
358  _XMP_setup_reduce_type(&mpi_datatype, &datatype_size, datatype);
359  _XMP_setup_reduce_op(&mpi_op, op);
360 
361  // reduce
362  MPI_Allreduce(MPI_IN_PLACE, data_addr, count, mpi_datatype, mpi_op, *((MPI_Comm *)(_XMP_get_execution_nodes())->comm));
363 }
Here is the call graph for this function:

◆ _XMP_reduce_FLMM_CLAUSE()

void _XMP_reduce_FLMM_CLAUSE ( void *  data_addr,
int  count,
int  datatype,
int  op,
int  num_locs,
  ... 
)
366 {
368  _XMP_ASSERT(nodes->is_member);
369 
370  // setup information
371  MPI_Datatype mpi_datatype;
372  size_t datatype_size; // not used in this function
373  MPI_Op mpi_op;
374  _XMP_setup_reduce_type(&mpi_datatype, &datatype_size, datatype);
375  _XMP_setup_reduce_op(&mpi_op, op);
376 
377  // reduce <reduction-variable>
378  size_t n = datatype_size * count;
379  void *temp_buffer = _XMP_alloc(n);
380  memcpy(temp_buffer, data_addr, n);
381 
382  MPI_Allreduce(temp_buffer, data_addr, count, mpi_datatype, mpi_op, *((MPI_Comm *)nodes->comm));
383 
384  // compare results
385  n = sizeof(int) * count;
386  int *cmp_buffer = _XMP_alloc(n);
387  _XMP_compare_reduce_results(cmp_buffer, temp_buffer, data_addr, count, datatype);
388 
389  // reduce <location-variable>
390  va_list args;
391  va_start(args, num_locs);
392  for (int i = 0; i < num_locs; i++) {
393  void *loc = va_arg(args, void *);
394  int loc_datatype = va_arg(args, int);
395 
396  _XMP_setup_reduce_type(&mpi_datatype, &datatype_size, loc_datatype);
397  _XMP_setup_reduce_FLMM_op(&mpi_op, op);
398  _XMP_init_localtion_variables(loc, count, loc_datatype, cmp_buffer, op);
399 
400  n = datatype_size * count;
401  void *loc_temp = _XMP_alloc(n);
402  memcpy(loc_temp, loc, n);
403 
404  MPI_Allreduce(loc_temp, loc, count, mpi_datatype, mpi_op, *((MPI_Comm *)nodes->comm));
405 
406  _XMP_free(loc_temp);
407  }
408  va_end(args);
409 
410  _XMP_free(temp_buffer);
411  _XMP_free(cmp_buffer);
412 }
Here is the call graph for this function:

◆ _XMP_reduce_FLMM_NODES_ENTIRE()

void _XMP_reduce_FLMM_NODES_ENTIRE ( _XMP_nodes_t nodes,
void *  addr,
int  count,
int  datatype,
int  op,
int  num_locs,
  ... 
)
247 {
248  if(count == 0) return; // FIXME not good implementation
249  if(!nodes->is_member) return;
250 
251  // setup information
252  MPI_Datatype mpi_datatype;
253  size_t datatype_size;
254  MPI_Op mpi_op;
255  _XMP_setup_reduce_type(&mpi_datatype, &datatype_size, datatype);
256  _XMP_setup_reduce_op(&mpi_op, op);
257 
258  // reduce <reduction-variable>
259  size_t n = datatype_size * count;
260  void *temp_buffer = _XMP_alloc(n);
261  memcpy(temp_buffer, addr, n);
262 
263  MPI_Allreduce(temp_buffer, addr, count, mpi_datatype, mpi_op, *((MPI_Comm *)nodes->comm));
264 
265  // compare results
266  n = sizeof(int) * count;
267  int *cmp_buffer = _XMP_alloc(n);
268  _XMP_compare_reduce_results(cmp_buffer, temp_buffer, addr, count, datatype);
269 
270  // reduce <location-variable>
271  va_list args;
272  va_start(args, num_locs);
273  for (int i = 0; i < num_locs; i++) {
274  void *loc = va_arg(args, void *);
275  int loc_datatype = va_arg(args, int);
276 
277  _XMP_setup_reduce_type(&mpi_datatype, &datatype_size, loc_datatype);
278  _XMP_setup_reduce_FLMM_op(&mpi_op, op);
279  _XMP_init_localtion_variables(loc, count, loc_datatype, cmp_buffer, op);
280 
281  n = datatype_size * count;
282  void *loc_temp = _XMP_alloc(n);
283  memcpy(loc_temp, loc, n);
284 
285  MPI_Allreduce(loc_temp, loc, count, mpi_datatype, mpi_op, *((MPI_Comm *)nodes->comm));
286 
287  _XMP_free(loc_temp);
288  }
289  va_end(args);
290 
291  _XMP_free(temp_buffer);
292  _XMP_free(cmp_buffer);
293 }
Here is the call graph for this function:

◆ _XMP_reduce_NODES_ENTIRE()

void _XMP_reduce_NODES_ENTIRE ( _XMP_nodes_t nodes,
void *  addr,
int  count,
int  datatype,
int  op 
)
217  {
218  if (count == 0) {
219  return; // FIXME not good implementation
220  }
221 
222  if (!nodes->is_member) {
223  return;
224  }
225 
226  // setup information
227  MPI_Datatype mpi_datatype = MPI_INT; //dummy
228  size_t datatype_size;
229  MPI_Op mpi_op = MPI_SUM; // dummy
230  _XMP_setup_reduce_type(&mpi_datatype, &datatype_size, datatype);
231  _XMP_setup_reduce_op(&mpi_op, op);
232 
233 #ifdef _XMP_MPI3
234  if(xmp_is_async()){
236  MPI_Iallreduce(MPI_IN_PLACE, addr, count, mpi_datatype, mpi_op, *((MPI_Comm *)nodes->comm),
237  &async->reqs[async->nreqs]);
238  async->nreqs++;
239  }
240  else
241 #endif
242  MPI_Allreduce(MPI_IN_PLACE, addr, count, mpi_datatype, mpi_op, *((MPI_Comm *)nodes->comm));
243 }
Here is the call graph for this function:

◆ _XMP_setup_reduce_type()

void _XMP_setup_reduce_type ( MPI_Datatype *  mpi_datatype,
size_t *  datatype_size,
int  datatype 
)
13  {
14  switch (datatype) {
15  case _XMP_N_TYPE_BOOL:
16  //{ *mpi_datatype = MPI_C_BOOL; *datatype_size = sizeof(_Bool); break; }
17  { *mpi_datatype = MPI_LOGICAL; *datatype_size = sizeof(_Bool); break; }
18  case _XMP_N_TYPE_CHAR:
19  { *mpi_datatype = MPI_SIGNED_CHAR; *datatype_size = sizeof(char); break; }
21  { *mpi_datatype = MPI_UNSIGNED_CHAR; *datatype_size = sizeof(unsigned char); break; }
22  case _XMP_N_TYPE_SHORT:
23  { *mpi_datatype = MPI_SHORT; *datatype_size = sizeof(short); break; }
25  { *mpi_datatype = MPI_UNSIGNED_SHORT; *datatype_size = sizeof(unsigned short); break; }
26  case _XMP_N_TYPE_INT:
27  { *mpi_datatype = MPI_INT; *datatype_size = sizeof(int); break; }
29  { *mpi_datatype = MPI_UNSIGNED; *datatype_size = sizeof(unsigned int); break; }
30  case _XMP_N_TYPE_LONG:
31  { *mpi_datatype = MPI_LONG; *datatype_size = sizeof(long); break; }
33  { *mpi_datatype = MPI_UNSIGNED_LONG; *datatype_size = sizeof(unsigned long); break; }
35  { *mpi_datatype = MPI_LONG_LONG; *datatype_size = sizeof(long long); break; }
37  { *mpi_datatype = MPI_UNSIGNED_LONG_LONG; *datatype_size = sizeof(unsigned long long); break; }
38  case _XMP_N_TYPE_FLOAT:
39  { *mpi_datatype = MPI_FLOAT; *datatype_size = sizeof(float); break; }
40  case _XMP_N_TYPE_DOUBLE:
41  { *mpi_datatype = MPI_DOUBLE; *datatype_size = sizeof(double); break; }
43  { *mpi_datatype = MPI_LONG_DOUBLE; *datatype_size = sizeof(long double); break; }
44 #ifdef __STD_IEC_559_COMPLEX__
45  case _XMP_N_TYPE_FLOAT_IMAGINARY:
46  { *mpi_datatype = MPI_FLOAT; *datatype_size = sizeof(float _Imaginary); break; }
47  case _XMP_N_TYPE_DOUBLE_IMAGINARY:
48  { *mpi_datatype = MPI_DOUBLE; *datatype_size = sizeof(double _Imaginary); break; }
49  case _XMP_N_TYPE_LONG_DOUBLE_IMAGINARY:
50  { *mpi_datatype = MPI_LONG_DOUBLE; *datatype_size = sizeof(long double _Imaginary); break; }
51 #endif
52 
53 #if ((MPI_VERSION >= 3) || (MPI_VERSION == 2 && MPI_SUBVERSION >= 2))
55  { *mpi_datatype = MPI_C_FLOAT_COMPLEX; *datatype_size = sizeof(float _Complex); break; }
57  { *mpi_datatype = MPI_C_DOUBLE_COMPLEX; *datatype_size = sizeof(double _Complex); break; }
59  { *mpi_datatype = MPI_C_LONG_DOUBLE_COMPLEX; *datatype_size = sizeof(long double _Complex); break; }
60 #endif
61 
62  default:
63  _XMP_fatal("unknown data type for reduction");
64  }
65 }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ _XMPF_reduce_FLMM_NODES_ENTIRE()

void _XMPF_reduce_FLMM_NODES_ENTIRE ( _XMP_nodes_t nodes,
void *  addr,
int  count,
int  datatype,
int  op,
int  num_locs,
void **  loc_vars,
int *  loc_types 
)
298  {
299 
300  if (count == 0) {
301  return; // FIXME not good implementation
302  }
303 
304  if (!nodes->is_member) {
305  return;
306  }
307 
308  // setup information
309  MPI_Datatype mpi_datatype;
310  size_t datatype_size;
311  MPI_Op mpi_op;
312  _XMP_setup_reduce_type(&mpi_datatype, &datatype_size, datatype);
313  _XMP_setup_reduce_op(&mpi_op, op);
314 
315  // reduce <reduction-variable>
316  size_t n = datatype_size * count;
317  void *temp_buffer = _XMP_alloc(n);
318  memcpy(temp_buffer, addr, n);
319 
320  MPI_Allreduce(temp_buffer, addr, count, mpi_datatype, mpi_op, *((MPI_Comm *)nodes->comm));
321 
322  // compare results
323  n = sizeof(int) * count;
324  int *cmp_buffer = _XMP_alloc(n);
325  _XMP_compare_reduce_results(cmp_buffer, temp_buffer, addr, count, datatype);
326 
327  // reduce <location-variable>
328  for (int i = 0; i < num_locs; i++) {
329  void *loc = loc_vars[i];
330  int loc_datatype = loc_types[i];
331 
332  _XMP_setup_reduce_type(&mpi_datatype, &datatype_size, loc_datatype);
333  _XMP_setup_reduce_FLMM_op(&mpi_op, op);
334  _XMP_init_localtion_variables(loc, count, loc_datatype, cmp_buffer, op);
335 
336  n = datatype_size * count;
337  void *loc_temp = _XMP_alloc(n);
338  memcpy(loc_temp, loc, n);
339 
340  MPI_Allreduce(loc_temp, loc, count, mpi_datatype, mpi_op, *((MPI_Comm *)nodes->comm));
341 
342  _XMP_free(loc_temp);
343  }
344 
345  _XMP_free(temp_buffer);
346  _XMP_free(cmp_buffer);
347 }
Here is the call graph for this function:

◆ xmp_reduce_initialize()

void xmp_reduce_initialize ( )
554 {
555  MPI_Op_create(_reduce_maxloc, 1, &_xmp_maxloc);
556  MPI_Op_create(_reduce_minloc, 1, &_xmp_minloc);
557 }

◆ xmp_reduce_loc_execute()

void xmp_reduce_loc_execute ( const int  op)
653 {
655 
656  if(nodes->is_member && nodes->comm_size != 1){
657  size_t total_reduce_size = 0;
658  for(int i=0;i<_nlocs+2;i++)
659  total_reduce_size += _size[i];
660 
661  char *buffer = malloc(total_reduce_size);
662 
663  size_t offset = 0;
664  for(int i=0;i<_nlocs+2;i++){
665  memcpy(buffer + offset, _addr[i], _size[i]);
666  offset += _size[i];
667  }
668 
669  if(op == _XMP_N_REDUCE_MAXLOC)
670  MPI_Allreduce(MPI_IN_PLACE, buffer, total_reduce_size, MPI_BYTE, _xmp_maxloc, *((MPI_Comm *)nodes->comm));
671  else if(op == _XMP_N_REDUCE_MINLOC)
672  MPI_Allreduce(MPI_IN_PLACE, buffer, total_reduce_size, MPI_BYTE, _xmp_minloc, *((MPI_Comm *)nodes->comm));
673  else
674  _XMP_fatal("Unknown operation in reduction directve");
675 
676  offset = 0;
677  for(int i=0;i<_nlocs+2;i++){
678  memcpy(_addr[i], buffer + offset, _size[i]);
679  offset += _size[i];
680  }
681 
682  long double value = *(long double *)_addr[0];
683  _cast_define_double_value(_value_addr, value, _datatype);
684 
685  free(buffer);
686  }
687 
688  free(_size);
689  free(_addr);
690 }
Here is the call graph for this function:

◆ xmp_reduce_loc_init()

void xmp_reduce_loc_init ( const int  nlocs,
const long double  value,
void *  value_addr,
const int  datatype 
)
572 {
573  _nlocs = nlocs;
574  _value = value;
575  _value_addr = value_addr;
576  _datatype = datatype;
577  _node_num = _XMP_get_execution_nodes()->comm_rank;
578 
579  _addr = malloc(sizeof(void *) * (nlocs+2));
580  _addr[0] = &_value;
581  _addr[1] = &_node_num;
582 
583  _size = malloc(sizeof(int) * (nlocs+2));
584  _size[0] = sizeof(long double);
585  _size[1] = sizeof(int);
586 
587  _num = 2;
588 }

◆ xmp_reduce_loc_set()

void xmp_reduce_loc_set ( void *  buf,
const int  length,
const size_t  s 
)
598 {
599  _addr[_num] = buf;
600  _size[_num] = length * s;
601  _num++;
602 }
_XMP_nodes_info_type::size
int size
Definition: xmp_data_struct.h:32
_XMP_nodes_type::info
_XMP_nodes_info_t info[1]
Definition: xmp_data_struct.h:60
_XMP_nodes_info_type
Definition: xmp_data_struct.h:31
_XMP_nodes_type::comm_size
int comm_size
Definition: xmp_data_struct.h:48
_XMP_N_TYPE_BOOL
#define _XMP_N_TYPE_BOOL
Definition: xmp_constant.h:80
_XMP_N_TYPE_INT
#define _XMP_N_TYPE_INT
Definition: xmp_constant.h:85
xmp_is_async
_Bool xmp_is_async()
Definition: xmp_async.c:20
_XMP_N_REDUCE_MINLOC
#define _XMP_N_REDUCE_MINLOC
Definition: xmp_constant.h:61
_XMP_nodes_type::is_member
int is_member
Definition: xmp_data_struct.h:46
_XMP_alloc
void * _XMP_alloc(size_t size)
Definition: xmp_util.c:21
_XMP_N_TYPE_DOUBLE
#define _XMP_N_TYPE_DOUBLE
Definition: xmp_constant.h:92
_XMP_N_REDUCE_LASTMIN
#define _XMP_N_REDUCE_LASTMIN
Definition: xmp_constant.h:56
_XMP_N_TYPE_DOUBLE_COMPLEX
#define _XMP_N_TYPE_DOUBLE_COMPLEX
Definition: xmp_constant.h:102
_XMP_N_TYPE_LONG_DOUBLE
#define _XMP_N_TYPE_LONG_DOUBLE
Definition: xmp_constant.h:93
_XMP_template_chunk_type::onto_nodes_info
_XMP_nodes_info_t * onto_nodes_info
Definition: xmp_data_struct.h:94
_XMP_finalize_comm
void _XMP_finalize_comm(void *comm)
_XMP_world_rank
int _XMP_world_rank
Definition: xmp_world.c:9
_XMP_N_TYPE_UNSIGNED_LONGLONG
#define _XMP_N_TYPE_UNSIGNED_LONGLONG
Definition: xmp_constant.h:90
_XMP_N_REDUCE_FIRSTMAX
#define _XMP_N_REDUCE_FIRSTMAX
Definition: xmp_constant.h:53
_XMP_N_TYPE_LONG
#define _XMP_N_TYPE_LONG
Definition: xmp_constant.h:87
_XMP_N_TYPE_SHORT
#define _XMP_N_TYPE_SHORT
Definition: xmp_constant.h:83
_XMP_N_TYPE_FLOAT_COMPLEX
#define _XMP_N_TYPE_FLOAT_COMPLEX
Definition: xmp_constant.h:101
_XMP_N_TYPE_FLOAT
#define _XMP_N_TYPE_FLOAT
Definition: xmp_constant.h:91
_XMP_N_TYPE_UNSIGNED_INT
#define _XMP_N_TYPE_UNSIGNED_INT
Definition: xmp_constant.h:86
_XMP_N_INT_FALSE
#define _XMP_N_INT_FALSE
Definition: xmp_constant.h:5
_XMP_get_current_async
_XMP_async_comm_t * _XMP_get_current_async()
Definition: xmp_async.c:205
_XMP_N_TYPE_UNSIGNED_LONG
#define _XMP_N_TYPE_UNSIGNED_LONG
Definition: xmp_constant.h:88
_XMP_template_chunk_type
Definition: xmp_data_struct.h:78
_XMP_async_comm::nreqs
int nreqs
Definition: xmp_data_struct.h:460
_XMP_N_DIST_DUPLICATION
#define _XMP_N_DIST_DUPLICATION
Definition: xmp_constant.h:28
_XMP_N_TYPE_UNSIGNED_SHORT
#define _XMP_N_TYPE_UNSIGNED_SHORT
Definition: xmp_constant.h:84
_XMP_N_TYPE_CHAR
#define _XMP_N_TYPE_CHAR
Definition: xmp_constant.h:81
_XMP_N_TYPE_UNSIGNED_CHAR
#define _XMP_N_TYPE_UNSIGNED_CHAR
Definition: xmp_constant.h:82
_XMP_N_REDUCE_MAXLOC
#define _XMP_N_REDUCE_MAXLOC
Definition: xmp_constant.h:60
_XMP_async_comm::reqs
MPI_Request * reqs
Definition: xmp_data_struct.h:464
_XMP_async_comm
Definition: xmp_data_struct.h:458
_XMP_nodes_info_type::rank
int rank
Definition: xmp_data_struct.h:35
_XMP_template_chunk_type::dist_manner
int dist_manner
Definition: xmp_data_struct.h:87
_XMP_free
void _XMP_free(void *p)
Definition: xmp_util.c:37
_XMP_ASSERT
#define _XMP_ASSERT(_flag)
Definition: xmp_internal.h:34
_XMP_N_TYPE_LONG_DOUBLE_COMPLEX
#define _XMP_N_TYPE_LONG_DOUBLE_COMPLEX
Definition: xmp_constant.h:103
_XMP_N_REDUCE_LASTMAX
#define _XMP_N_REDUCE_LASTMAX
Definition: xmp_constant.h:55
_XMP_nodes_type::comm
_XMP_comm_t * comm
Definition: xmp_data_struct.h:53
_XMP_fatal
void _XMP_fatal(char *msg)
Definition: xmp_util.c:42
_XMP_setup_reduce_type
void _XMP_setup_reduce_type(MPI_Datatype *mpi_datatype, size_t *datatype_size, int datatype)
Definition: xmp_reduce.c:13
_XMP_N_TYPE_LONGLONG
#define _XMP_N_TYPE_LONGLONG
Definition: xmp_constant.h:89
_XMP_N_REDUCE_FIRSTMIN
#define _XMP_N_REDUCE_FIRSTMIN
Definition: xmp_constant.h:54
_XMP_template_type::is_distributed
_Bool is_distributed
Definition: xmp_data_struct.h:105
_XMP_nodes_type::dim
int dim
Definition: xmp_data_struct.h:47
_XMP_nodes_type
Definition: xmp_data_struct.h:40
_XMP_push_comm
void _XMP_push_comm(void *comm)
_XMP_RETURN_IF_SINGLE
#define _XMP_RETURN_IF_SINGLE
Definition: xmp_internal.h:37
_XMP_N_INT_TRUE
#define _XMP_N_INT_TRUE
Definition: xmp_constant.h:4
_XMP_get_execution_nodes
void * _XMP_get_execution_nodes(void)
Definition: xmp_nodes_stack.c:46