1
1

Correctly mark the Fortran data-types as being Fortran (not C and change it later

to Fortran). Add a new global variable, which keep track of all MPI predefined types.
This variable include all optional types, and is depend on the system where OMPI is
compiled.  Use this variable to correctly find out the size match type.

This commit was SVN r10204.
Этот коммит содержится в:
George Bosilca 2006-06-05 20:44:17 +00:00
родитель 3e0104f414
Коммит d7fa11d576
2 изменённых файлов: 25 добавлений и 8 удалений

Просмотреть файл

@ -21,10 +21,12 @@
#include "ompi/datatype/datatype.h"
#include "ompi/datatype/datatype_internal.h"
extern int32_t ompi_ddt_number_of_predefined_data;
const ompi_datatype_t*
ompi_ddt_match_size( int size, uint16_t datakind, uint16_t datalang )
{
uint32_t i;
int32_t i;
const ompi_datatype_t* datatype;
/* If we're not looking for a complex C++ type then set the default type to C */
@ -33,8 +35,10 @@ ompi_ddt_match_size( int size, uint16_t datakind, uint16_t datalang )
datalang = DT_FLAG_DATA_C;
}
for( i = 0; i < DT_MAX_PREDEFINED; i++ ) {
datatype = ompi_ddt_basicDatatypes[i];
for( i = 0; i < ompi_ddt_number_of_predefined_data; i++ ) {
datatype = ompi_pointer_array_get_item(ompi_datatype_f_to_c_table, i);
if( (datatype->flags & DT_FLAG_DATA_LANGUAGE) != datalang )
continue;
if( (datatype->flags & DT_FLAG_DATA_TYPE) != datakind )

Просмотреть файл

@ -76,6 +76,12 @@ int ompi_ddt_dfd = -1;
INIT_BASIC_TYPE( TYPE, NAME )
#endif /* OMPI_WANT_F77_BINDINGS */
/**
* This is the number of predefined datatypes. It is different than the MAX_PREDEFINED
* as it include all the optional datatypes (such as MPI_INTEGER?, MPI_REAL?).
*/
int32_t ompi_ddt_number_of_predefined_data = 0;
OMPI_DECLSPEC ompi_datatype_t ompi_mpi_datatype_null =
{ BASEOBJ_DATA, 0, 0, 0, 0,
0, 0, DT_FLAG_PREDEFINED, 0, 1,
@ -124,13 +130,13 @@ OMPI_DECLSPEC ompi_datatype_t ompi_mpi_real = INIT_BASIC_FORTRAN_TYPE( DT_REAL,
OMPI_DECLSPEC ompi_datatype_t ompi_mpi_dblprec = INIT_BASIC_FORTRAN_TYPE( DT_DBLPREC, DBLPREC, OMPI_SIZEOF_FORTRAN_DOUBLE_PRECISION, OMPI_ALIGNMENT_FORTRAN_DOUBLE_PRECISION, DT_FLAG_DATA_FLOAT );
#if HAVE_LONG_DOUBLE
OMPI_DECLSPEC ompi_datatype_t ompi_mpi_ldblcplex = INIT_BASIC_DATA( ompi_complex_long_double_t, OMPI_ALIGNMENT_LONG_DOUBLE, COMPLEX_LONG_DOUBLE, DT_FLAG_DATA_C | DT_FLAG_DATA_COMPLEX );
OMPI_DECLSPEC ompi_datatype_t ompi_mpi_ldblcplex = INIT_BASIC_DATA( ompi_complex_long_double_t, OMPI_ALIGNMENT_LONG_DOUBLE, COMPLEX_LONG_DOUBLE, DT_FLAG_DATA_FORTRAN | DT_FLAG_DATA_COMPLEX );
#else
OMPI_DECLSPEC ompi_datatype_t ompi_mpi_ldblcplex = INIT_UNAVAILABLE_DATA( COMPLEX_LONG_DOUBLE );
#endif /* HAVE_LONG_DOUBLE */
OMPI_DECLSPEC ompi_datatype_t ompi_mpi_cplex = INIT_BASIC_DATA( ompi_complex_float_t, OMPI_ALIGNMENT_FLOAT, COMPLEX_FLOAT, DT_FLAG_DATA_C | DT_FLAG_DATA_COMPLEX );
OMPI_DECLSPEC ompi_datatype_t ompi_mpi_dblcplex = INIT_BASIC_DATA( ompi_complex_double_t, OMPI_ALIGNMENT_DOUBLE, COMPLEX_DOUBLE, DT_FLAG_DATA_C | DT_FLAG_DATA_COMPLEX );
OMPI_DECLSPEC ompi_datatype_t ompi_mpi_cplex = INIT_BASIC_DATA( ompi_complex_float_t, OMPI_ALIGNMENT_FLOAT, COMPLEX_FLOAT, DT_FLAG_DATA_FORTRAN | DT_FLAG_DATA_COMPLEX );
OMPI_DECLSPEC ompi_datatype_t ompi_mpi_dblcplex = INIT_BASIC_DATA( ompi_complex_double_t, OMPI_ALIGNMENT_DOUBLE, COMPLEX_DOUBLE, DT_FLAG_DATA_FORTRAN | DT_FLAG_DATA_COMPLEX );
OMPI_DECLSPEC ompi_datatype_t ompi_mpi_float_int = INIT_BASIC_TYPE( DT_FLOAT_INT, FLOAT_INT );
OMPI_DECLSPEC ompi_datatype_t ompi_mpi_double_int = INIT_BASIC_TYPE( DT_DOUBLE_INT, DOUBLE_INT );
#if HAVE_LONG_DOUBLE
@ -354,6 +360,8 @@ int ompi_ddt_local_sizes[DT_MAX_PREDEFINED];
/* just memcpy as it's easier this way */ \
memcpy( (PDATA), (PORIGDDT), sizeof(ompi_datatype_t) ); \
strncpy( (PDATA)->name, MPIDDTNAME, MPI_MAX_OBJECT_NAME ); \
/* forget the language flag */ \
(PDATA)->flags &= ~DT_FLAG_DATA_LANGUAGE; \
} while(0)
int ompi_ddt_register_params(void)
@ -510,8 +518,13 @@ int32_t ompi_ddt_init( void )
/* This macro makes everything significantly easier to read below.
All hail the moog! :-) */
#define MOOG(name) ompi_mpi_##name.d_f_to_c_index = \
ompi_pointer_array_add(ompi_datatype_f_to_c_table, &ompi_mpi_##name);
#define MOOG(name) \
{ \
ompi_mpi_##name.d_f_to_c_index = \
ompi_pointer_array_add(ompi_datatype_f_to_c_table, &ompi_mpi_##name); \
if( ompi_ddt_number_of_predefined_data < (ompi_mpi_##name).d_f_to_c_index ) \
ompi_ddt_number_of_predefined_data = (ompi_mpi_##name).d_f_to_c_index; \
}
MOOG(datatype_null);
MOOG(byte);