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