1 /* 2 * Copyright (c) 2013 Mellanox Technologies, Inc. 3 * All rights reserved. 4 * $COPYRIGHT$ 5 * 6 * Additional copyrights may follow 7 * 8 * $HEADER$ 9 */ 10 #ifndef OSHMEM_OP_H 11 #define OSHMEM_OP_H 12 13 #include "oshmem_config.h" 14 #include "oshmem/types.h" 15 #include "oshmem/constants.h" 16 17 #include "oshmem/mca/scoll/scoll.h" 18 19 #include "opal/class/opal_list.h" 20 #include "opal/dss/dss_types.h" 21 22 #include "orte/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 /** 206 * Initialize the op interface. 207 * 208 * @returns OSHMEM_SUCCESS Upon success 209 * @returns OSHMEM_ERROR Otherwise 210 * 211 * Invoked from oshmem_shmem_init(); sets up the op interface, creates 212 * the predefined operations. 213 */ 214 int oshmem_op_init(void); 215 216 /** 217 * Finalize the op interface. 218 * 219 * @returns OSHMEM_SUCCESS Always 220 * 221 * Invokes from oshmem_shmem_finalize(); tears down the op interface. 222 */ 223 int oshmem_op_finalize(void); 224 225 END_C_DECLS 226 227 #endif /* OSHMEM_OP_H */ 228