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 <[email protected]>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 <[email protected] <mailto:[email protected]>> 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: [email protected] 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 [email protected] To manage subscription options or unsubscribe: https://lists.mpich.org/mailman/listinfo/discuss