[mpich2-commits] r5478 - in mpich2/trunk/test/mpi: datatype f77/datatype
gropp at mcs.anl.gov
gropp at mcs.anl.gov
Fri Oct 16 13:50:34 CDT 2009
Author: gropp
Date: 2009-10-16 13:50:34 -0500 (Fri, 16 Oct 2009)
New Revision: 5478
Modified:
mpich2/trunk/test/mpi/datatype/typename.c
mpich2/trunk/test/mpi/f77/datatype/allctypesf.f
Log:
Correct the datatype name tests for both C (make sure that all required types are before the optional types) and Fortran (test was broken because of implicit typing in Fortran)
Modified: mpich2/trunk/test/mpi/datatype/typename.c
===================================================================
--- mpich2/trunk/test/mpi/datatype/typename.c 2009-10-16 16:35:41 UTC (rev 5477)
+++ mpich2/trunk/test/mpi/datatype/typename.c 2009-10-16 18:50:34 UTC (rev 5478)
@@ -62,9 +62,26 @@
{ MPI_2DOUBLE_PRECISION, "MPI_2DOUBLE_PRECISION" },
{ MPI_CHARACTER, "MPI_CHARACTER" },
#endif
+#if MTEST_HAVE_MIN_MPI_VERSION(2,2)
+ /* these C99 types were added in MPI-2.2 */
+ { MPI_INT8_T, "MPI_INT8_T" },
+ { MPI_INT16_T, "MPI_INT16_T" },
+ { MPI_INT32_T, "MPI_INT32_T" },
+ { MPI_INT64_T, "MPI_INT64_T" },
+ { MPI_UINT8_T, "MPI_UINT8_T" },
+ { MPI_UINT16_T, "MPI_UINT16_T" },
+ { MPI_UINT32_T, "MPI_UINT32_T" },
+ { MPI_UINT64_T, "MPI_UINT64_T" },
+ { MPI_C_BOOL, "MPI_C_BOOL" },
+ { MPI_C_FLOAT_COMPLEX, "MPI_C_FLOAT_COMPLEX" },
+ { MPI_C_DOUBLE_COMPLEX, "MPI_C_DOUBLE_COMPLEX" },
+ { MPI_AINT, "MPI_AINT" },
+ { MPI_OFFSET, "MPI_OFFSET" },
+#endif
/* Size-specific types */
/* Do not move MPI_REAL4 - this is used to indicate the very first
- optional type */
+ optional type. In addition, you must not add any required types
+ after this type */
/* See MPI 2.1, Section 16.2. These are required, predefined types.
If the type is not available (e.g., *only* because the Fortran
compiler does not support it), the value may be MPI_DATATYPE_NULL */
@@ -84,20 +101,6 @@
this ifdef allows the test to be built and run. */
{ MPI_INTEGER16, "MPI_INTEGER16" },
#endif
-#if MTEST_HAVE_MIN_MPI_VERSION(2,2)
- /* these C99 types were added in MPI-2.2 */
- { MPI_INT8_T, "MPI_INT8_T" },
- { MPI_INT16_T, "MPI_INT16_T" },
- { MPI_INT32_T, "MPI_INT32_T" },
- { MPI_INT64_T, "MPI_INT64_T" },
- { MPI_UINT8_T, "MPI_UINT8_T" },
- { MPI_UINT16_T, "MPI_UINT16_T" },
- { MPI_UINT32_T, "MPI_UINT32_T" },
- { MPI_UINT64_T, "MPI_UINT64_T" },
- { MPI_C_BOOL, "MPI_C_BOOL" },
- { MPI_C_FLOAT_COMPLEX, "MPI_C_FLOAT_COMPLEX" },
- { MPI_C_DOUBLE_COMPLEX, "MPI_C_DOUBLE_COMPLEX" },
-#endif
/* Semi-optional types - if the compiler doesn't support long double
or long long, these might be MPI_DATATYPE_NULL */
{ MPI_LONG_DOUBLE, "MPI_LONG_DOUBLE" },
@@ -151,6 +154,7 @@
mpi_names[i].name );
continue;
}
+ MTestPrintfMsg( 10, "Checking type %s\n", mpi_names[i].name );
name[0] = 0;
MPI_Type_get_name( mpi_names[i].dtype, name, &namelen );
if (strncmp( name, mpi_names[i].name, namelen )) {
Modified: mpich2/trunk/test/mpi/f77/datatype/allctypesf.f
===================================================================
--- mpich2/trunk/test/mpi/f77/datatype/allctypesf.f 2009-10-16 16:35:41 UTC (rev 5477)
+++ mpich2/trunk/test/mpi/f77/datatype/allctypesf.f 2009-10-16 18:50:34 UTC (rev 5478)
@@ -3,38 +3,123 @@
integer atype, ierr
C
call mpi_init(ierr)
+ call mpi_comm_set_errhandler( MPI_COMM_WORLD, MPI_ERRORS_RETURN,
+ * ierr )
C
C Check that all Ctypes are available in Fortran (MPI 2.1, p 483, line 46)
C
- atype = MPI_CHAR
- atype = MPI_SIGNED_CHAR
- atype = MPI_UNSIGNED_CHAR
- atype = MPI_BYTE
- atype = MPI_WCHAR
- atype = MPI_SHORT
- atype = MPI_UNSIGNED_SHORT
- atype = MPI_INT
- atype = MPI_UNSIGNED
- atype = MPI_LONG
- atype = MPI_UNSIGNED_LONG
- atype = MPI_FLOAT
- atype = MPI_DOUBLE
- atype = MPI_LONG_DOUBLE
- atype = MPI_LONG_LONG_INT
- atype = MPI_UNSIGNED_LONG_LONG
- atype = MPI_LONG_LONG
- atype = MPI_PACKED
- atype = MPI_LB
- atype = MPI_UB
- atype = MPI_FLOAT_INT
- atype = MPI_DOUBLE_INT
- atype = MPI_LONG_INT
- atype = MPI_SHORT_INT
- atype = MPI_2INT
- atype = MPI_LONG_DOUBLE_INT
+ call checkdtype( MPI_CHAR, "MPI_CHAR", ierr )
+ call checkdtype( MPI_SIGNED_CHAR, "MPI_SIGNED_CHAR", ierr )
+ call checkdtype( MPI_UNSIGNED_CHAR, "MPI_UNSIGNED_CHAR", ierr )
+ call checkdtype( MPI_BYTE, "MPI_BYTE", ierr )
+ call checkdtype( MPI_WCHAR, "MPI_WCHAR", ierr )
+ call checkdtype( MPI_SHORT, "MPI_SHORT", ierr )
+ call checkdtype( MPI_UNSIGNED_SHORT, "MPI_UNSIGNED_SHORT", ierr )
+ call checkdtype( MPI_INT, "MPI_INT", ierr )
+ call checkdtype( MPI_UNSIGNED, "MPI_UNSIGNED", ierr )
+ call checkdtype( MPI_LONG, "MPI_LONG", ierr )
+ call checkdtype( MPI_UNSIGNED_LONG, "MPI_UNSIGNED_LONG", ierr )
+ call checkdtype( MPI_FLOAT, "MPI_FLOAT", ierr )
+ call checkdtype( MPI_DOUBLE, "MPI_DOUBLE", ierr )
+ call checkdtype( MPI_LONG_DOUBLE, "MPI_LONG_DOUBLE", ierr )
+ call checkdtype2( MPI_LONG_LONG_INT, "MPI_LONG_LONG_INT",
+ * "MPI_LONG_LONG", ierr )
+ call checkdtype( MPI_UNSIGNED_LONG_LONG,
+ * "MPI_UNSIGNED_LONG_LONG", ierr )
+ call checkdtype2( MPI_LONG_LONG, "MPI_LONG_LONG",
+ * "MPI_LONG_LONG_INT", ierr )
+ call checkdtype( MPI_PACKED, "MPI_PACKED", ierr )
+ call checkdtype( MPI_LB, "MPI_LB", ierr )
+ call checkdtype( MPI_UB, "MPI_UB", ierr )
+ call checkdtype( MPI_FLOAT_INT, "MPI_FLOAT_INT", ierr )
+ call checkdtype( MPI_DOUBLE_INT, "MPI_DOUBLE_INT", ierr )
+ call checkdtype( MPI_LONG_INT, "MPI_LONG_INT", ierr )
+ call checkdtype( MPI_SHORT_INT, "MPI_SHORT_INT", ierr )
+ call checkdtype( MPI_2INT, "MPI_2INT", ierr )
+ call checkdtype( MPI_LONG_DOUBLE_INT, "MPI_LONG_DOUBLE_INT",ierr)
C
-C This is a compilation test - If we can compile it, we pass.
+C Check that all Ctypes are available in Fortran (MPI 2.2)
+C Note that because of implicit declarations in Fortran, this
+C code should compile even with pre MPI 2.2 implementations.
+C
+ if (MPI_VERSION .gt. 2 .or. (MPI_VERSION .eq. 2 .and.
+ * MPI_SUBVERSION .ge. 2)) then
+ call checkdtype( MPI_INT8_T, "MPI_INT8_T", ierr )
+ call checkdtype( MPI_INT16_T, "MPI_INT16_T", ierr )
+ call checkdtype( MPI_INT32_T, "MPI_INT32_T", ierr )
+ call checkdtype( MPI_INT64_T, "MPI_INT64_T", ierr )
+ call checkdtype( MPI_UINT8_T, "MPI_UINT8_T", ierr )
+ call checkdtype( MPI_UINT16_T, "MPI_UINT16_T", ierr )
+ call checkdtype( MPI_UINT32_T, "MPI_UINT32_T", ierr )
+ call checkdtype( MPI_UINT64_T, "MPI_UINT64_T", ierr )
+C other C99 types
+ call checkdtype( MPI_C_BOOL, "MPI_C_BOOL", ierr )
+ call checkdtype( MPI_C_FLOAT_COMPLEX, "MPI_C_FLOAT_COMPLEX",
+ * ierr)
+ call checkdtype2( MPI_C_COMPLEX, "MPI_C_COMPLEX",
+ * "MPI_C_FLOAT_COMPLEX", ierr )
+ call checkdtype( MPI_C_DOUBLE_COMPLEX, "MPI_C_DOUBLE_COMPLEX",
+ * ierr )
+ call checkdtype( MPI_C_LONG_DOUBLE_COMPLEX,
+ * "MPI_C_LONG_DOUBLE_COMPLEX", ierr )
+C address/offset types
+ call checkdtype( MPI_AINT, "MPI_AINT", ierr )
+ call checkdtype( MPI_OFFSET, "MPI_OFFSET", ierr )
+ endif
+C
+ if (ierr .eq. 0) then
+ print *, " No Errors"
+ else
+ print *, " Found ", ierr, " errors"
+ endif
call MPI_Finalize( ierr )
- print *, " No Errors"
stop
end
+C
+C Check name of datatype
+ subroutine CheckDtype( intype, name, ierr )
+ integer intype, ierr
+ character *(*) name
+ include 'mpif.h'
+ integer ir, rlen
+ character *(MPI_MAX_OBJECT_NAME) outname
+C
+ outname = ""
+ call MPI_TYPE_GET_NAME( intype, outname, rlen, ir )
+ if (ir .ne. MPI_SUCCESS) then
+ print *, " Datatype ", name, " not available in Fortran"
+ ierr = ierr + 1
+ else
+ if (outname .ne. name) then
+ print *, " For datatype ", name, " found name ",
+ * outname(1:rlen)
+ ierr = ierr + 1
+ endif
+ endif
+
+ return
+ end
+C
+C Check name of datatype (allows alias)
+ subroutine CheckDtype2( intype, name, name2, ierr )
+ integer intype, ierr
+ character *(*) name, name2
+ include 'mpif.h'
+ integer ir, rlen
+ character *(MPI_MAX_OBJECT_NAME) outname
+C
+ outname = ""
+ call MPI_TYPE_GET_NAME( intype, outname, rlen, ir )
+ if (ir .ne. MPI_SUCCESS) then
+ print *, " Datatype ", name, " not available in Fortran"
+ ierr = ierr + 1
+ else
+ if (outname .ne. name .and. outname .ne. name2) then
+ print *, " For datatype ", name, " found name ",
+ * outname(1:rlen)
+ ierr = ierr + 1
+ endif
+ endif
+
+ return
+ end
More information about the mpich2-commits
mailing list