Skip to content

Commit d4d1fc5

Browse files
committed
updating ompi_op_ddt_map[] for more OMPI types
The OMPI types used to have more items #defined to the same values, so OMPI_DATATYPE_MPI_INT was one of OMPI_DATATYPE_MPI_INT16_T or OMPI_DATATYPE_MPI_INT32_T etc. The reduction code uses some map that's expected to have a value for each OMPI_DATATYPE_* so it neede more entries. Signed-off-by: Mark Allen <[email protected]>
1 parent 87d0047 commit d4d1fc5

File tree

1 file changed

+67
-0
lines changed

1 file changed

+67
-0
lines changed

ompi/op/op.c

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
* Copyright (c) 2015 Research Organization for Information Science
1818
* and Technology (RIST). All rights reserved.
1919
* Copyright (c) 2018 FUJITSU LIMITED. All rights reserved.
20+
* Copyright (c) 2020 IBM Corporation. All rights reserved.
2021
* $COPYRIGHT$
2122
*
2223
* Additional copyrights may follow
@@ -228,6 +229,72 @@ int ompi_op_init(void)
228229
ompi_op_ddt_map[OMPI_DATATYPE_MPI_SHORT_FLOAT] = OMPI_OP_BASE_TYPE_SHORT_FLOAT;
229230
ompi_op_ddt_map[OMPI_DATATYPE_MPI_C_SHORT_FLOAT_COMPLEX] = OMPI_OP_BASE_TYPE_C_SHORT_FLOAT_COMPLEX;
230231

232+
/*
233+
* The list of OMPI types used to end here. And the other entries were
234+
* mapped to one of the above, eg
235+
* OMPI_DATATYPE_MPI_INT was #defined as one of
236+
* OMPI_DATATYPE_MPI_INT16_T or OMPI_DATATYPE_MPI_INT32_T etc
237+
* depending on the size of an int.
238+
* The external32 fix involves more separation of OMPI datatypes.
239+
*
240+
* We could have a lot of sizeof checks like
241+
* #if SIZEOF_INT == 4
242+
* ompi_op_ddt_map[OMPI_DATATYPE_MPI_INT] = ompi_op_ddt_map[OMPI_DATATYPE_MPI_INT32_T]
243+
* ...
244+
* but that data is indirectly available already in the .id field. Both
245+
* of those OMPI types have the same OPAL value (6 in this example) for .id.
246+
*/
247+
#define FIND_MATCH(OMPIDT) do { \
248+
int opal_id_search; \
249+
int ompi_id_i; \
250+
int opal_id_i; \
251+
opal_id_search = ompi_datatype_basicDatatypes[OMPIDT]->super.id; \
252+
for (ompi_id_i = 0; ompi_id_i < OMPI_DATATYPE_MAX_PREDEFINED; ++ompi_id_i) { \
253+
opal_id_i = ompi_datatype_basicDatatypes[ompi_id_i]->super.id; \
254+
if (opal_id_i == opal_id_search && ompi_op_ddt_map[ompi_id_i] != -1) { \
255+
ompi_op_ddt_map[OMPIDT] = ompi_op_ddt_map[ompi_id_i]; \
256+
break; \
257+
} \
258+
} \
259+
if (ompi_op_ddt_map[OMPIDT] == -1) { \
260+
if (!(ompi_datatype_basicDatatypes[OMPIDT]->super.flags & \
261+
OPAL_DATATYPE_FLAG_UNAVAILABLE)) \
262+
{ \
263+
return OMPI_ERROR; \
264+
} \
265+
} \
266+
} while (0)
267+
FIND_MATCH(OMPI_DATATYPE_MPI_CHAR);
268+
FIND_MATCH(OMPI_DATATYPE_MPI_SIGNED_CHAR);
269+
FIND_MATCH(OMPI_DATATYPE_MPI_UNSIGNED_CHAR);
270+
FIND_MATCH(OMPI_DATATYPE_MPI_BYTE);
271+
FIND_MATCH(OMPI_DATATYPE_MPI_SHORT);
272+
FIND_MATCH(OMPI_DATATYPE_MPI_UNSIGNED_SHORT);
273+
FIND_MATCH(OMPI_DATATYPE_MPI_INT);
274+
FIND_MATCH(OMPI_DATATYPE_MPI_UNSIGNED);
275+
FIND_MATCH(OMPI_DATATYPE_MPI_LONG);
276+
FIND_MATCH(OMPI_DATATYPE_MPI_UNSIGNED_LONG);
277+
FIND_MATCH(OMPI_DATATYPE_MPI_LONG_LONG_INT);
278+
FIND_MATCH(OMPI_DATATYPE_MPI_UNSIGNED_LONG_LONG);
279+
FIND_MATCH(OMPI_DATATYPE_MPI_LOGICAL1);
280+
FIND_MATCH(OMPI_DATATYPE_MPI_LOGICAL2);
281+
FIND_MATCH(OMPI_DATATYPE_MPI_LOGICAL4);
282+
FIND_MATCH(OMPI_DATATYPE_MPI_LOGICAL8);
283+
FIND_MATCH(OMPI_DATATYPE_MPI_INTEGER1);
284+
FIND_MATCH(OMPI_DATATYPE_MPI_INTEGER2);
285+
FIND_MATCH(OMPI_DATATYPE_MPI_INTEGER4);
286+
FIND_MATCH(OMPI_DATATYPE_MPI_INTEGER8);
287+
FIND_MATCH(OMPI_DATATYPE_MPI_INTEGER16);
288+
FIND_MATCH(OMPI_DATATYPE_MPI_REAL2);
289+
FIND_MATCH(OMPI_DATATYPE_MPI_REAL4);
290+
FIND_MATCH(OMPI_DATATYPE_MPI_REAL8);
291+
FIND_MATCH(OMPI_DATATYPE_MPI_REAL16);
292+
FIND_MATCH(OMPI_DATATYPE_MPI_CXX_BOOL);
293+
FIND_MATCH(OMPI_DATATYPE_MPI_CXX_SHORT_FLOAT_COMPLEX);
294+
FIND_MATCH(OMPI_DATATYPE_MPI_CXX_FLOAT_COMPLEX);
295+
FIND_MATCH(OMPI_DATATYPE_MPI_CXX_DOUBLE_COMPLEX);
296+
FIND_MATCH(OMPI_DATATYPE_MPI_CXX_LONG_DOUBLE_COMPLEX);
297+
231298
/* Create the intrinsic ops */
232299

233300
if (OMPI_SUCCESS !=

0 commit comments

Comments
 (0)