[mpich-discuss] Erroneous MPI type tag warning

Markus Geimer m.geimer at fz-juelich.de
Mon Dec 23 10:55:13 CST 2013


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
------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------




More information about the discuss mailing list