|
17 | 17 | * Copyright (c) 2015 Research Organization for Information Science
|
18 | 18 | * and Technology (RIST). All rights reserved.
|
19 | 19 | * Copyright (c) 2018 FUJITSU LIMITED. All rights reserved.
|
| 20 | + * Copyright (c) 2020 IBM Corporation. All rights reserved. |
20 | 21 | * $COPYRIGHT$
|
21 | 22 | *
|
22 | 23 | * Additional copyrights may follow
|
@@ -228,6 +229,72 @@ int ompi_op_init(void)
|
228 | 229 | ompi_op_ddt_map[OMPI_DATATYPE_MPI_SHORT_FLOAT] = OMPI_OP_BASE_TYPE_SHORT_FLOAT;
|
229 | 230 | ompi_op_ddt_map[OMPI_DATATYPE_MPI_C_SHORT_FLOAT_COMPLEX] = OMPI_OP_BASE_TYPE_C_SHORT_FLOAT_COMPLEX;
|
230 | 231 |
|
| 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 | + |
231 | 298 | /* Create the intrinsic ops */
|
232 | 299 |
|
233 | 300 | if (OMPI_SUCCESS !=
|
|
0 commit comments