[mpich-discuss] Erroneous MPI type tag warning

Junchao Zhang jczhang at mcs.anl.gov
Wed Dec 25 21:29:08 CST 2013


To strictly obey MPI standard, we should declare MPI_2INT's type attribute
as

typedef int mpich_array_mpi_2int[2];
static const MPI_Datatype mpich_mpi_2int
MPICH_ATTR_TYPE_TAG_LAYOUT_COMPATIBLE (mpich_array_mpi_2int) =
MPI_2INT;

Then, users should write code as follows:

typedef int int2[2];
int2 in, out;
...
MPI_Reduce(&in, &out, 1, MPI_2INT, MPI_MAXLOC, ...);

It is inconvenient. After testing the code, I found the compiler warning
disappears. But if we change the code into

int in[2], out[2]
MPI_Reduce(in, out, 2, MPI_2INT, MPI_MAXLOC, ...);

OR

struct {int value; int loc; } in, out;
MPI_Reduce(&in, &out, 1, MPI_2INT, MPI_MAXLOC, ...);

The warning happens again. In reality, struct {int value; int loc; } should
have the same layout as int[2]. In this sense, the current MPI_2INT
handling in MPICH is fine. The warning reflects the compiler's weakness
rather than a fault in MPICH code.

--Junchao Zhang


On Mon, Dec 23, 2013 at 10:55 AM, Markus Geimer <m.geimer at fz-juelich.de>wrote:

> Hi,
>
> >   I guess the warning has nothing to do with padding.
>
> Agreed. The warning is due to the type_tag attributes defined in
> MPICH's 'mpi.h' header file.
>
> > For MPI_Reduce(in, out, 1, MPI_2INT, ...), the compiler tries to
> > match int, i.e., typeof(*in), with MPI_2INT.  Whatever the layout of
> > MPI_2INT is defined (e.g., struct {int i1; int i2} or int[2]), the
> > compiler fails at matching. If you want to use MPI_2INT, then in, out
> > should be defined as of type struct {int v1;  int v2}.
>
> Well, according to the C99 standard "Each non-bit-field member of a
> structure or union object is aligned in an *implementation-defined*
> manner appropriate to its type." (§6.7.2.1) It is therefore not
> guaranteed that the two ints in the struct are contiguous -- which
> means that, strictly speaking, int[2] is the only portable choice.
> (Although I'm not aware of any compiler that would insert padding
> between the two ints, i.e., in practice the struct should be fine,
> too.)
>
> >   I agree that MPI_Reduce(in, out, 1, MPI_2INT, ...) is absolutely
> > right.  I think the only reason for the warning is that the compiler is
> > not smart enough.
>
> Compilers could always be smarter ;-) It would be great if you could
> come up with a datatype that is -- from the compiler's perspective --
> compatible with both struct {int i1; int i2} and int[2]. Otherwise,
> I suggest to remove the type check for MPI_2INT as the warning is
> misleading.
>
> Thanks,
> Markus
>
>
> > On Sun, Dec 22, 2013 at 3:56 AM, Markus Geimer <m.geimer at fz-juelich.de
> > <mailto:m.geimer at fz-juelich.de>> wrote:
> >
> >     Dear MPICH developers,
> >
> >     When compiling the attached example with MPICH 3.1rc2 using Clang
> 3.3,
> >     I get the following compiler warnings:
> >
> >     -------------------- snip --------------------
> >     mpi2int.c:17:20: warning: argument type 'int *' doesn't match
> specified
> >     'MPI' type tag [-Wtype-safety]
> >         MPI_Reduce(in, out, 1, MPI_2INT, MPI_MAXLOC, 0, MPI_COMM_WORLD);
> >                        ^~~     ~~~~~~~~
> >     mpi2int.c:17:16: warning: argument type 'int *' doesn't match
> specified
> >     'MPI' type tag [-Wtype-safety]
> >         MPI_Reduce(in, out, 1, MPI_2INT, MPI_MAXLOC, 0, MPI_COMM_WORLD);
> >                    ^~          ~~~~~~~~
> >     2 warnings generated.
> >     -------------------- snip --------------------
> >
> >     According to the MPI standard, however, MPI_2INT is a datatype as if
> >     defined by
> >
> >             MPI_Type_contiguous(2, MPI_INT, MPI_2INT)
> >
> >     i.e., 'int[2]' should be a perfect match. This is not necessarily
> true
> >     for the type used for comparison,
> >
> >             struct mpich_struct_mpi_2int { int i1; int i2; };
> >
> >     which will only be contiguous if the compiler does not add any
> padding.
> >
> >     Is there any chance this gets fixed for the final 3.1 release? Or did
> >     I miss something?
> >
> >     Thanks,
> >     Markus
> >
>
> --
> Dr. Markus Geimer
> Juelich Supercomputing Centre
> Institute for Advanced Simulation
> Forschungszentrum Juelich GmbH
> 52425 Juelich, Germany
>
> Phone:  +49-2461-61-1773
> Fax:    +49-2461-61-6656
> E-mail: m.geimer at fz-juelich.de
> WWW:    http://www.fz-juelich.de/jsc/
>
>
>
> ------------------------------------------------------------------------------------------------
>
> ------------------------------------------------------------------------------------------------
> Forschungszentrum Juelich GmbH
> 52425 Juelich
> Sitz der Gesellschaft: Juelich
> Eingetragen im Handelsregister des Amtsgerichts Dueren Nr. HR B 3498
> Vorsitzender des Aufsichtsrats: MinDir Dr. Karl Eugen Huthmacher
> Geschaeftsfuehrung: Prof. Dr. Achim Bachem (Vorsitzender),
> Karsten Beneke (stellv. Vorsitzender), Prof. Dr.-Ing. Harald Bolt,
> Prof. Dr. Sebastian M. Schmidt
>
> ------------------------------------------------------------------------------------------------
>
> ------------------------------------------------------------------------------------------------
>
> _______________________________________________
> discuss mailing list     discuss at mpich.org
> To manage subscription options or unsubscribe:
> https://lists.mpich.org/mailman/listinfo/discuss
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mpich.org/pipermail/discuss/attachments/20131225/50242452/attachment.html>


More information about the discuss mailing list