[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