Commit ca7f2390 authored by William Gropp's avatar William Gropp
Browse files

[svn-r10724] Correct implementation of MPI_COUNT, remove MPI_2COMPLEX and...

[svn-r10724] Correct implementation of MPI_COUNT, remove MPI_2COMPLEX and MPI_2DOUBLE_COMPLEX (invalid since MPI 1.1), and update generation of Fortran predefined MPI values
parent 238dafdc
......@@ -4260,10 +4260,23 @@ int main(int argc, char **argv )
fi
# Get the size for the bsendoverhead
AC_CHECK_SIZEOF(MPIR_Bsend_data_t,128,[
AC_CHECK_SIZEOF(MPIR_Bsend_data_t,0,[
#define MPI_Datatype int
#ifdef HAVE_STDLIB_H
#include <stdlib.h>
#endif
#ifdef HAVE_STDINT_H
#include <stdint.h>
#endif
#include "${master_top_srcdir}/src/include/mpibsend.h"]
)
if test "$ac_cv_sizeof_MPIR_Bsend_data_t" = "0" ; then
AC_MSG_ERROR([Unable to determine the size of MPI_BSEND_OVERHEAD"])
# In the past, a default of 128 was used (still likely good enough),
# but the autoconf SIZEOF macro has been changed to ignore the second
# argument, so code that depended on the prior defined behavior now
# silently breaks.
fi
BSEND_OVERHEAD=$ac_cv_sizeof_MPIR_Bsend_data_t
export BSEND_OVERHEAD
AC_SUBST(BSEND_OVERHEAD)
......@@ -5356,16 +5369,16 @@ subsystems="$devsubsystems $subsystems $bindingsubsystems"
# Find the size of OPA_ptr_t. This step needs to come after the OPA
# configure above in order to get the size OPA_ptr_t evaluated for
# this platform.
AC_CHECK_SIZEOF(OPA_ptr_t,-1,[
AC_CHECK_SIZEOF(OPA_ptr_t,0,[
#include "${master_top_srcdir}/src/openpa/src/opa_primitives.h"
pthread_mutex_t *OPA_emulation_lock;
])
if test "$enable_f77" != "yes" ; then
# These are Fortran datatypes ONLY. Set to null if no Fortran compiler.
# Removed the invalid 2COMPLEX and 2DOUBLE_COMPLEX
for name in CHARACTER INTEGER REAL LOGICAL COMPLEX DOUBLE_PRECISION \
2INTEGER 2REAL DOUBLE_COMPLEX 2COMPLEX 2DOUBLE_PRECISION \
2DOUBLE_COMPLEX ; do
2INTEGER 2REAL DOUBLE_COMPLEX 2DOUBLE_PRECISION ; do
fullname="MPI_$name"
eval $fullname=MPI_DATATYPE_NULL
done
......@@ -5384,8 +5397,8 @@ AC_SUBST(MPI_2INTEGER)
AC_SUBST(MPI_2REAL)
AC_SUBST(MPI_DOUBLE_COMPLEX)
AC_SUBST(MPI_2DOUBLE_PRECISION)
AC_SUBST(MPI_2COMPLEX)
AC_SUBST(MPI_2DOUBLE_COMPLEX)
dnl AC_SUBST(MPI_2COMPLEX)
dnl AC_SUBST(MPI_2DOUBLE_COMPLEX)
AC_SUBST(MPI_FINT)
# If ROMIO was successfully configured, then ROMIO will have exported the
......@@ -5535,7 +5548,7 @@ AC_SUBST([MPI_COUNT_DATATYPE])
# 0x4c000045 is 1275068485 in decimal, add ($MPI_SIZEOF_COUNT * 256) and you get
# the decimal equivalent of the hex number
MPI_F77_COUNT=`expr 1275068484 '+' '(' 256 '*' $MPI_SIZEOF_OFFSET ')'`
MPI_F77_COUNT=`expr 1275068485 '+' '(' 256 '*' $MPI_SIZEOF_OFFSET ')'`
AC_SUBST([MPI_F77_COUNT])
# ----------------------------------------------------------------------------
......
......@@ -3746,16 +3746,21 @@ if ($write_mpif) {
foreach $key (IDENT,CONGRUENT,SIMILAR,UNEQUAL) {
&print_mpif_int( "MPI_$key" );
}
# Window flavor and model
foreach $key (FLAVOR_CREATE,FLAVOR_ALLOCATE,FLAVOR_DYNAMIC,FLAVOR_SHARED,
SEPARATE, UNIFIED) {
&print_mpif_int( "MPI_WIN_$key" );
}
# Collective operations
foreach $key (MAX, MIN, SUM, PROD, LAND, BAND, LOR, BOR, LXOR, BXOR, MINLOC, MAXLOC, REPLACE ) {
foreach $key (MAX, MIN, SUM, PROD, LAND, BAND, LOR, BOR, LXOR, BXOR, MINLOC, MAXLOC, REPLACE, NO_OP ) {
&print_mpif_int( "MPI_$key" );
}
# Objects
foreach $key ('COMM_WORLD', 'COMM_SELF', 'GROUP_EMPTY', 'COMM_NULL', 'WIN_NULL', 'FILE_NULL', 'GROUP_NULL', 'OP_NULL', 'DATATYPE_NULL', 'REQUEST_NULL', 'ERRHANDLER_NULL', 'INFO_NULL', ) {
foreach $key ('COMM_WORLD', 'COMM_SELF', 'GROUP_EMPTY', 'COMM_NULL', 'WIN_NULL', 'FILE_NULL', 'GROUP_NULL', 'OP_NULL', 'DATATYPE_NULL', 'REQUEST_NULL', 'ERRHANDLER_NULL', 'INFO_NULL', 'INFO_ENV' ) {
&print_mpif_int( "MPI_$key" );
}
# Attributes
foreach $key (TAG_UB, HOST, IO, WTIME_IS_GLOBAL, UNIVERSE_SIZE, LASTUSEDCODE, APPNUM, WIN_BASE, WIN_SIZE, WIN_DISP_UNIT ) {
foreach $key (TAG_UB, HOST, IO, WTIME_IS_GLOBAL, UNIVERSE_SIZE, LASTUSEDCODE, APPNUM, WIN_BASE, WIN_SIZE, WIN_DISP_UNIT, WIN_CREATE_FLAVOR, WIN_MODEL ) {
# Special cast: The Fortran versions of these attributes have
# value 1 greater than the C versions
$attrval = $mpidef{"MPI_$key"};
......@@ -3768,7 +3773,7 @@ if ($write_mpif) {
&print_mpif_int( "MPI_$key" );
}
# String sizes
# See MPI-2 2.6.2 and 4.12.9; the constants for string lenghts are
# See MPI-2 2.6.2 and 4.12.9; the constants for string lengths are
# defined as one less than the C/C++ version
# Missing - max processor name!
......@@ -3805,10 +3810,14 @@ if ($write_mpif) {
#
# Datatypes
# These are determined and set at configure time
foreach $key (COMPLEX, DOUBLE_COMPLEX, LOGICAL, REAL, DOUBLE_PRECISION, INTEGER, '2INTEGER', '2COMPLEX', '2DOUBLE_PRECISION', '2REAL', '2DOUBLE_COMPLEX', CHARACTER) {
foreach $key (COMPLEX, DOUBLE_COMPLEX, LOGICAL, REAL, DOUBLE_PRECISION, INTEGER, '2INTEGER', '2DOUBLE_PRECISION', '2REAL', CHARACTER) {
print MPIFFD " INTEGER MPI_$key\n";
print MPIFFD " PARAMETER (MPI_$key=\@MPI_$key\@)\n";
}
# 2COMPLEX and 2DOUBLE_COMPLEX were defined in MPI 1 and removed in
# MPI 1.1. Don't define them for the Fortran interface.
#foreach $key ('2COMPLEX', '2DOUBLE_COMPLEX') {
#}
# Value of MPI_BYTE from top level configure!
$mpidef{"MPI_BYTE"} = hex "0x4c00010d";
foreach $key (BYTE, UB, LB, PACKED) {
......@@ -4918,9 +4927,12 @@ sub ReadInterfaceForDefinitions {
# Eat until we find the closing right brace
$enum_line = $1;
while (! ($enum_line =~ /}/)) {
$enum_line .= <MPIFD>;
my $newline = <MPIFD>;
$newline =~ s/\r*\n//;
$enum_line .= $newline;
$linecount++;
}
print "Handling enum $enum_line...\n" if $debug;
# Now process for names and values
while (($enum_line =~ /\s*(MPI[X]*_[A-Z_0-9]*)\s*=\s*([a-fx0-9]*)(.*)/)) {
$mpidef{$1} = $2;
......
......@@ -111,6 +111,7 @@ static mpi_names_t mpi_names[] = {
/* address/offset types */
type_name_entry(MPI_AINT),
type_name_entry(MPI_OFFSET),
type_name_entry(MPI_COUNT),
{ 0, (char *) 0 }, /* Sentinel used to indicate the last element */
};
......
......@@ -73,9 +73,10 @@ static MPI_Datatype mpi_dtypes[] = {
MPI_C_DOUBLE_COMPLEX,
MPI_C_LONG_DOUBLE_COMPLEX,
/* address/offset types */
/* address/offset/count types */
MPI_AINT,
MPI_OFFSET,
MPI_COUNT,
/* Fortran types */
MPI_COMPLEX,
......@@ -219,7 +220,6 @@ int MPIR_Datatype_builtin_fillin(void)
MPID_Datatype *dptr;
MPI_Datatype d = MPI_DATATYPE_NULL;
static int is_init = 0;
char error_msg[1024];
/* FIXME: This is actually an error, since this routine
should only be called once */
......@@ -246,14 +246,11 @@ int MPIR_Datatype_builtin_fillin(void)
if (dptr < MPID_Datatype_builtin ||
dptr > MPID_Datatype_builtin + MPID_DATATYPE_N_BUILTIN)
{
MPIU_Snprintf(error_msg, 1024,
"%dth builtin datatype handle references invalid memory",
i);
mpi_errno = MPIR_Err_create_code(MPI_SUCCESS,
MPIR_ERR_FATAL, FCNAME,
__LINE__, MPI_ERR_INTERN,
"**fail", "**fail %s",
error_msg);
"**typeinitbadmem", "**typeinitbadmem %d",
i);
return mpi_errno;
}
/* --END ERROR HANDLING-- */
......@@ -274,16 +271,11 @@ int MPIR_Datatype_builtin_fillin(void)
/* --BEGIN ERROR HANDLING-- */
if (d != -1 && i < sizeof(mpi_dtypes)/sizeof(*mpi_dtypes) && mpi_dtypes[i] != -1) {
/* We did not hit the end-of-list */
/*MPIU_Internal_error_printf( "Did not initialize all of the predefined datatypes (only did first %d)\n", i-1 );*/
MPIU_Snprintf(error_msg, 1024,
"Did not initialize all of the predefined datatypes (only did first %d)\n",
i-1);
mpi_errno = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_FATAL,
FCNAME, __LINE__,
MPI_ERR_INTERN, "**fail",
"**fail %s", error_msg);
return mpi_errno;
mpi_errno = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_FATAL,
FCNAME, __LINE__,
MPI_ERR_INTERN, "**typeinitfail",
"**typeinitfail %d", i-1);
return mpi_errno;
}
/* --END ERROR HANDLING-- */
is_init = 1;
......
......@@ -427,7 +427,9 @@ extern MPIU_Object_alloc_t MPID_Datatype_mem;
* here. */
/* FIXME calculating this value this way is foolish, we should make this more
* automatic and less error prone */
#define MPID_DATATYPE_N_BUILTIN 68
/* FIXME: Given that this is relatively static, an adequate alternative is
to provide a check that this value is valid. */
#define MPID_DATATYPE_N_BUILTIN 69
extern MPID_Datatype MPID_Datatype_builtin[MPID_DATATYPE_N_BUILTIN + 1];
extern MPID_Datatype MPID_Datatype_direct[];
......
......@@ -114,12 +114,12 @@ static mpi_names_t mpi_names[] = {
#if MTEST_HAVE_MIN_MPI_VERSION(2,2)
/* added in MPI-2.2 */
{ MPI_C_LONG_DOUBLE_COMPLEX, "MPI_C_LONG_DOUBLE_COMPLEX" },
{ MPI_AINT, "MPI_AINT" },
{ MPI_OFFSET, "MPI_OFFSET" },
#endif
#if MTEST_HAVE_MIN_MPI_VERSION(3,0)
/* added in MPI 3 */
{ MPI_COUNT, "MPI_COUNT" },
{ MPI_AINT, "MPI_AINT" },
{ MPI_OFFSET, "MPI_OFFSET" },
#endif
{ 0, (char *)0 }, /* Sentinal used to indicate the last element */
};
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment