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