/** * Parse the datatype description from the args and find if the * datatype is created from a single predefined type. If yes, * return the type, otherwise return NULL. */ ompi_datatype_t* ompi_datatype_get_single_predefined_type_from_args( ompi_datatype_t* type ) { ompi_datatype_t *predef = NULL, *current_type, *current_predef; ompi_datatype_args_t* args = (ompi_datatype_args_t*)type->args; int i; if( ompi_datatype_is_predefined(type) ) return type; for( i = 0; i < args->cd; i++ ) { current_type = args->d[i]; if( ompi_datatype_is_predefined(current_type) ) { current_predef = current_type; } else { current_predef = ompi_datatype_get_single_predefined_type_from_args(current_type); if( NULL == current_predef ) { /* No single predefined datatype */ return NULL; } } if( NULL == predef ) { /* This is the first iteration */ predef = current_predef; } else { /** * What exactly should we consider as identical types? If they are * the same MPI level type, or if they map to the same OPAL datatype? * In other words, MPI_FLOAT and MPI_REAL4 are they identical? */ if( predef != current_predef ) { return NULL; } } } return predef; }
int ompi_osc_base_get_primitive_type_info(ompi_datatype_t *datatype, ompi_datatype_t **prim_datatype, uint32_t *prim_count) { ompi_datatype_t *primitive_datatype = NULL; size_t datatype_size, primitive_size, primitive_count; primitive_datatype = ompi_datatype_get_single_predefined_type_from_args(datatype); if( NULL == primitive_datatype ) { *prim_count = 0; return OMPI_SUCCESS; } ompi_datatype_type_size( datatype, &datatype_size ); ompi_datatype_type_size( primitive_datatype, &primitive_size ); primitive_count = datatype_size / primitive_size; #if OPAL_ENABLE_DEBUG assert( 0 == (datatype_size % primitive_size) ); #endif /* OPAL_ENABLE_DEBUG */ /* We now have the count as a size_t, convert it to an uint32_t */ *prim_datatype = primitive_datatype; *prim_count = (uint32_t)primitive_count; return OMPI_SUCCESS; }
static int ompi_osc_portals4_get_dt(struct ompi_datatype_t *dt, ptl_datatype_t *ptl_dt) { ompi_datatype_t *base_dt = ompi_datatype_get_single_predefined_type_from_args(dt); if (MPI_BYTE == base_dt) { *ptl_dt = PTL_INT8_T; } else if (MPI_CHAR == base_dt) { *ptl_dt = PTL_INT8_T; } else if (MPI_SHORT == base_dt) { return get_sized_type(true, sizeof(short), ptl_dt); } else if (MPI_INT == base_dt) { return get_sized_type(true, sizeof(int), ptl_dt); } else if (MPI_LONG == base_dt) { return get_sized_type(true, sizeof(long), ptl_dt); } else if (MPI_FLOAT == base_dt) { *ptl_dt = PTL_FLOAT; } else if (MPI_DOUBLE == base_dt) { *ptl_dt = PTL_DOUBLE; } else if (MPI_LONG_DOUBLE == base_dt) { *ptl_dt = PTL_LONG_DOUBLE; } else if (MPI_UNSIGNED_CHAR == base_dt) { *ptl_dt = PTL_UINT8_T; } else if (MPI_SIGNED_CHAR == base_dt) { *ptl_dt = PTL_UINT8_T; } else if (MPI_UNSIGNED_SHORT == base_dt) { return get_sized_type(false, sizeof(short), ptl_dt); } else if (MPI_UNSIGNED_LONG == base_dt) { return get_sized_type(false, sizeof(long), ptl_dt); } else if (MPI_UNSIGNED == base_dt) { return get_sized_type(false, sizeof(int), ptl_dt); #if OPAL_HAVE_LONG_LONG } else if (MPI_LONG_LONG_INT == base_dt) { return get_sized_type(true, sizeof(long long int), ptl_dt); } else if (MPI_LONG_LONG == base_dt) { return get_sized_type(true, sizeof(long long), ptl_dt); #endif } else if (MPI_INT8_T == base_dt) { *ptl_dt = PTL_INT8_T; } else if (MPI_UINT8_T == base_dt) { *ptl_dt = PTL_UINT8_T; } else if (MPI_INT16_T == base_dt) { *ptl_dt = PTL_INT16_T; } else if (MPI_UINT16_T == base_dt) { *ptl_dt = PTL_UINT16_T; } else if (MPI_INT32_T == base_dt) { *ptl_dt = PTL_INT32_T; } else if (MPI_UINT32_T == base_dt) { *ptl_dt = PTL_UINT32_T; } else if (MPI_INT64_T == base_dt) { *ptl_dt = PTL_INT64_T; } else if (MPI_UINT64_T == base_dt) { *ptl_dt = PTL_UINT64_T; #if HAVE_FLOAT__COMPLEX } else if (MPI_C_COMPLEX == base_dt) { *ptl_dt = PTL_DOUBLE_COMPLEX; } else if (MPI_C_FLOAT_COMPLEX == base_dt) { *ptl_dt = PTL_FLOAT_COMPLEX; #endif #if HAVE_DOUBLE__COMPLEX } else if (MPI_C_DOUBLE_COMPLEX == base_dt) { *ptl_dt = PTL_DOUBLE_COMPLEX; #endif #if HAVE_LONG_DOUBLE__COMPLEX } else if (MPI_C_LONG_DOUBLE_COMPLEX == base_dt) { *ptl_dt = PTL_LONG_DOUBLE_COMPLEX; #endif } else if (MPI_AINT == base_dt) { if (sizeof(MPI_Aint) == 2) { *ptl_dt = PTL_UINT16_T; } else if (sizeof(MPI_Aint) == 4) { *ptl_dt = PTL_UINT32_T; } else if (sizeof(MPI_Aint) == 8) { *ptl_dt = PTL_UINT64_T; } } else { return OMPI_ERROR; } return 0; }