Be careful what you wish for. I remember looking at this issue a while ago, but I can't remember why or how I ran into it. I do remember convincing myself that the MPI standard was correct in restricting SIZEOF to numeric types. For one thing, a character variable type is a string container in Fortran, while in C it is a single character. What would be the correct interpretation for SIZEOF in Fortran? The maximum length? The TRIM'd length? What would be the correct interpretation in C? 1? strlen()? strlen()+1? The size of a character itself may not be the same on either end of an MPI connection if, for example, one program is compiled using 8-bit characters and the other is compiled using uses 16-bit characters. Interchanging strings opens up a can of worms. As far as logical, there is no C logical type. In Fortran, while the size of a logical variable is specified as a "storage unit" (the same as an integer), the representation of true and false is unspecified, and, thus, is processor dependent. On VAXes, only a single bit matters; the instruction set supports this logical data type. (In C, thought there is no logical data type, the C standard does specify 0=false and 1=true for the result of relational and logical operators and 0=false and not 0=true for logical operator operands.) This means it is problematic to exchange logical data between Fortran programs (C makes no sense, since there is no logical data type) when different compilers (part of what Fortran calls a processor) are used.
Better to find out what discussions took place in the MPI standards committee before adding extensions to SIZEOF. They may very well have good reasons to avoid character and logical data, as I concluded. Larry Baker US Geological Survey 650-329-5608 ba...@usgs.gov On 15 Apr 2016, at 5:34 AM, Jeff Squyres (jsquyres) wrote: > Nadia -- > > I believe that the character and logical types are not in this script already > because the description of MPI_SIZEOF in MPI-3.1 says that the input choice > buffer parameter is: > > IN x a Fortran variable of numeric intrinsic type (choice) > > As I understand it (and my usual disclaimer here: I am *not* a Fortran > expert), CHARACTER and LOGICAL types are not numeric in Fortran. > > However, we could add such interfaces as an extension. > > I just checked MPICH 3.2, and they *do* include MPI_SIZEOF interfaces for > CHARACTER and LOGICAL, but they are missing many of the other MPI_SIZEOF > interfaces that we have in OMPI. Meaning: OMPI and MPICH already diverge > wildly on MPI_SIZEOF. :-\ > > I guess I don't have a strong opinion here. If you file a PR for this patch, > I won't object. :-) > > >> On Apr 15, 2016, at 3:22 AM, DERBEY, NADIA <nadia.der...@atos.net> wrote: >> >> Hi, >> >> The following trivial example doesn't compile because of 2 missing types >> in the MPI_SIZEOF subroutines (in mpi_sizeof.f90). >> >> [derbeyn@btp0 test]$ cat mpi_sizeof.f90 >> program main >> ! use mpi >> include 'mpif.h' >> >> integer ierr, sz, mpisize >> real r1 >> integer i1 >> character ch1 >> logical l1 >> >> call MPI_INIT(ierr) >> call MPI_SIZEOF(r1, sz, ierr) >> call MPI_SIZEOF(i1, sz, ierr) >> call MPI_SIZEOF(l1, sz, ierr) >> call MPI_SIZEOF(ch1, sz, ierr) >> call MPI_FINALIZE(ierr) >> >> end >> [derbeyn@btp0 test]$ mpif90 -o mpi_sizeof mpi_sizeof.f90 >> mpi_sizeof.f90(14): error #6285: There is no matching specific >> subroutine for this generic subroutine call. [MPI_SIZEOF] >> call MPI_SIZEOF(ch1, sz, ierr) >> -------------^ >> mpi_sizeof.f90(15): error #6285: There is no matching specific >> subroutine for this generic subroutine call. [MPI_SIZEOF] >> call MPI_SIZEOF(l1, sz, ierr) >> -------------^ >> compilation aborted for mpi_sizeof.f90 (code 1) >> >> >> This problem happens both on master and v2.x. The following patch seems >> to solve the issue: >> >> diff --git a/ompi/mpi/fortran/base/gen-mpi-sizeof.pl >> b/ompi/mpi/fortran/base/gen-mpi-sizeof.pl >> index 5ea3dca3..a2a99924 100755 >> --- a/ompi/mpi/fortran/base/gen-mpi-sizeof.pl >> +++ b/ompi/mpi/fortran/base/gen-mpi-sizeof.pl >> @@ -145,6 +145,9 @@ sub generate { >> # Main >> >> ############################################################################# >> >> +queue_sub("character", "char", "character_kinds"); >> +queue_sub("logical", "logical", "logical_kinds"); >> + >> for my $size (qw/8 16 32 64/) { >> queue_sub("integer(int${size})", "int${size}", "int${size}"); >> } >> >> Regards, >> Nadia >> >> -- >> Nadia Derbey - B1-387 >> HPC R&D - MPI >> Tel: +33 4 76 29 77 62 >> nadia.der...@atos.net >> 1 Rue de Provence BP 208 >> 38130 Echirolles Cedex, France >> www.atos.com >> _______________________________________________ >> devel mailing list >> de...@open-mpi.org >> Subscription: http://www.open-mpi.org/mailman/listinfo.cgi/devel >> Link to this post: >> http://www.open-mpi.org/community/lists/devel/2016/04/18765.php > > > -- > Jeff Squyres > jsquy...@cisco.com > For corporate legal information go to: > http://www.cisco.com/web/about/doing_business/legal/cri/ > > _______________________________________________ > devel mailing list > de...@open-mpi.org > Subscription: http://www.open-mpi.org/mailman/listinfo.cgi/devel > Link to this post: > http://www.open-mpi.org/community/lists/devel/2016/04/18766.php