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.
Hi,
Agreed. The warning is due to the type_tag attributes defined in
> I guess the warning has nothing to do with padding.
MPICH's 'mpi.h' header file.
Well, according to the C99 standard "Each non-bit-field member of a
> 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}.
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.)
Compilers could always be smarter ;-) It would be great if you could
> 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.
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
> <mailto:m.geimer@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@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@mpich.org
To manage subscription options or unsubscribe:
https://lists.mpich.org/mailman/listinfo/discuss