root/oshmem/op/op.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


   1 /*
   2  * Copyright (c) 2013      Mellanox Technologies, Inc.
   3  *                         All rights reserved.
   4  * Copyright (c) 2019      Research Organization for Information Science
   5  *                         and Technology (RIST).  All rights reserved.
   6  * $COPYRIGHT$
   7  *
   8  * Additional copyrights may follow
   9  *
  10  * $HEADER$
  11  */
  12 #ifndef OSHMEM_OP_H
  13 #define OSHMEM_OP_H
  14 
  15 #include "oshmem_config.h"
  16 #include "oshmem/types.h"
  17 #include "oshmem/constants.h"
  18 
  19 #include "oshmem/mca/scoll/scoll.h"
  20 
  21 #include "opal/class/opal_list.h"
  22 #include "opal/dss/dss_types.h"
  23 
  24 BEGIN_C_DECLS
  25 
  26 /* ******************************************************************** */
  27 
  28 /**
  29  * Corresponding to the types that we can reduce over.
  30  */
  31 enum {
  32     OSHMEM_OP_TYPE_SHORT,       /** C integer: short */
  33     OSHMEM_OP_TYPE_INT,         /** C integer: int */
  34     OSHMEM_OP_TYPE_LONG,        /** C integer: long */
  35     OSHMEM_OP_TYPE_LLONG,       /** C integer: long long */
  36     OSHMEM_OP_TYPE_INT16_T,     /** C integer: int16_t */
  37     OSHMEM_OP_TYPE_INT32_T,     /** C integer: int32_t */
  38     OSHMEM_OP_TYPE_INT64_T,     /** C integer: int64_t */
  39 
  40     OSHMEM_OP_TYPE_FLOAT,       /** Floating point: float */
  41     OSHMEM_OP_TYPE_DOUBLE,      /** Floating point: double */
  42     OSHMEM_OP_TYPE_LDOUBLE,     /** Floating point: long double */
  43 
  44     OSHMEM_OP_TYPE_FCOMPLEX,    /** Complex: float */
  45     OSHMEM_OP_TYPE_DCOMPLEX,    /** Complex: double */
  46 
  47     OSHMEM_OP_TYPE_FINT2,       /** Fortran integer: int2 */
  48     OSHMEM_OP_TYPE_FINT4,       /** Fortran integer: int4 */
  49     OSHMEM_OP_TYPE_FINT8,       /** Fortran integer: int8 */
  50     OSHMEM_OP_TYPE_FREAL4,      /** Fortran integer: real4 */
  51     OSHMEM_OP_TYPE_FREAL8,      /** Fortran integer: real8 */
  52     OSHMEM_OP_TYPE_FREAL16,     /** Fortran integer: real16 */
  53 
  54     /** Maximum type */
  55     OSHMEM_OP_TYPE_NUMBER
  56 };
  57 
  58 /**
  59  * Supported reduce operations.
  60  */
  61 enum {
  62     OSHMEM_OP_AND,      /** AND */
  63     OSHMEM_OP_OR,       /** OR */
  64     OSHMEM_OP_XOR,      /** XOR */
  65     OSHMEM_OP_MAX,      /** MAX */
  66     OSHMEM_OP_MIN,      /** MIN */
  67     OSHMEM_OP_SUM,      /** SUM */
  68     OSHMEM_OP_PROD,     /** PROD */
  69 
  70     /** Maximum operation */
  71     OSHMEM_OP_NUMBER
  72 };
  73 
  74 typedef void (oshmem_op_c_handler_fn_t)(void *, void *, int);
  75 
  76 /**
  77  * Back-end type of OSHMEM reduction operations
  78  */
  79 struct oshmem_op_t {
  80     opal_object_t               base;
  81     int                         id;             /**< index in global array */
  82     int                         op;             /**< operation type */
  83     int                         dt;             /**< datatype */
  84     size_t                      dt_size;        /**< datatype size */
  85     union {
  86         /** C handler function pointer */
  87         oshmem_op_c_handler_fn_t *c_fn;
  88     } o_func;
  89 };
  90 typedef struct oshmem_op_t oshmem_op_t;
  91 OSHMEM_DECLSPEC OBJ_CLASS_DECLARATION(oshmem_op_t);
  92 
  93 /* Bitwise AND */
  94 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_and_short;
  95 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_and_int;
  96 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_and_long;
  97 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_and_longlong;
  98 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_and_fint2;
  99 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_and_fint4;
 100 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_and_fint8;
 101 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_and_int16;
 102 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_and_int32;
 103 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_and_int64;
 104 
 105 /* Bitwise OR */
 106 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_or_short;
 107 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_or_int;
 108 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_or_long;
 109 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_or_longlong;
 110 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_or_fint2;
 111 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_or_fint4;
 112 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_or_fint8;
 113 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_or_int16;
 114 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_or_int32;
 115 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_or_int64;
 116 
 117 /* Bitwise XOR */
 118 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_xor_short;
 119 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_xor_int;
 120 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_xor_long;
 121 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_xor_longlong;
 122 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_xor_fint2;
 123 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_xor_fint4;
 124 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_xor_fint8;
 125 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_xor_int16;
 126 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_xor_int32;
 127 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_xor_int64;
 128 
 129 /* MAX */
 130 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_max_short;
 131 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_max_int;
 132 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_max_long;
 133 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_max_longlong;
 134 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_max_float;
 135 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_max_double;
 136 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_max_longdouble;
 137 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_max_fint2;
 138 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_max_fint4;
 139 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_max_fint8;
 140 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_max_freal4;
 141 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_max_freal8;
 142 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_max_freal16;
 143 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_max_int16;
 144 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_max_int32;
 145 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_max_int64;
 146 
 147 /* MIN */
 148 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_min_short;
 149 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_min_int;
 150 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_min_long;
 151 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_min_longlong;
 152 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_min_float;
 153 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_min_double;
 154 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_min_longdouble;
 155 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_min_fint2;
 156 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_min_fint4;
 157 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_min_fint8;
 158 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_min_freal4;
 159 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_min_freal8;
 160 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_min_freal16;
 161 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_min_int16;
 162 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_min_int32;
 163 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_min_int64;
 164 
 165 /* SUM */
 166 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_sum_short;
 167 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_sum_int;
 168 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_sum_long;
 169 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_sum_longlong;
 170 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_sum_float;
 171 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_sum_double;
 172 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_sum_longdouble;
 173 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_sum_complexf;
 174 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_sum_complexd;
 175 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_sum_fint2;
 176 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_sum_fint4;
 177 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_sum_fint8;
 178 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_sum_freal4;
 179 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_sum_freal8;
 180 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_sum_freal16;
 181 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_sum_int16;
 182 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_sum_int32;
 183 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_sum_int64;
 184 
 185 /* PROD */
 186 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_prod_short;
 187 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_prod_int;
 188 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_prod_long;
 189 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_prod_longlong;
 190 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_prod_float;
 191 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_prod_double;
 192 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_prod_longdouble;
 193 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_prod_complexf;
 194 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_prod_complexd;
 195 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_prod_fint2;
 196 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_prod_fint4;
 197 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_prod_fint8;
 198 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_prod_freal4;
 199 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_prod_freal8;
 200 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_prod_freal16;
 201 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_prod_int16;
 202 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_prod_int32;
 203 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_prod_int64;
 204 
 205 /* SWAP */
 206 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_swap_int;
 207 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_swap_long;
 208 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_swap_longlong;
 209 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_swap_int32;
 210 OSHMEM_DECLSPEC extern oshmem_op_t* oshmem_op_swap_int64;
 211 
 212 /**
 213  * Initialize the op interface.
 214  *
 215  * @returns OSHMEM_SUCCESS Upon success
 216  * @returns OSHMEM_ERROR Otherwise
 217  *
 218  * Invoked from oshmem_shmem_init(); sets up the op interface, creates
 219  * the predefined operations.
 220  */
 221 int oshmem_op_init(void);
 222 
 223 /**
 224  * Finalize the op interface.
 225  *
 226  * @returns OSHMEM_SUCCESS Always
 227  *
 228  * Invokes from oshmem_shmem_finalize(); tears down the op interface.
 229  */
 230 int oshmem_op_finalize(void);
 231 
 232 END_C_DECLS
 233 
 234 #endif /* OSHMEM_OP_H */

/* [<][>][^][v][top][bottom][index][help] */