Due to the possibility of silently introducing errors into user applications, 
the BigCount WG no longer thinks that C11 _Generic is a good idea.  We are 
therefore dropping that from our proposal.  The new proposal will therefore 
essentially just be the addition of a bunch of MPI_Count-enabled "_x" functions 
in C, combined with the addition of a bunch of polymorphic MPI_Count-enabled 
interfaces in Fortran.


Joseph Schuchart raised a very important point in a recent mailing thread: the 
following C/C++ code does not raise a compiler warning:

#include <stdio.h>

static void foo(int j) {
    printf("foo(j) = %d\n", j);

int main(int argc, char *argv[]) {
    /* 8589934592LL == 2^33 */
    long long i = 8589934592LL + 11;
    return 0;

If you compile and run this program on a commodity x86-64 platform, a) you 
won't get a warning from the compiler, and b) you'll see "11" printed out.  I 
tried with gcc 9 and clang 8 -- both with the C and C++ compilers.  I even 
tried with "-Wall -pedantic".  No warnings.

This is because casting from a larger int type to a smaller int type is 
perfectly valid C/C++.

Because of this, there is a possibility that we could be silently introducing 
errors into user applications.  Consider:

1. An application upgrades its "count" parameters to type MPI_Count for all 
calls to MPI_Send.
   --> Recall that "MPI_Count" already exists in MPI-3.1, and is likely of type 
(long long) on commodity x86-64 platforms
2. The application then uses values in that "count" parameter that are greater 
than 2^32.

If the user's MPI implementation and compiler both support C11 _Generic, 
everything is great.

But if either the MPI implementation or the compiler do not support C11 
_Generic, ***the "count" value will be silently truncated at run time***.

This seems like a very bad idea, from a design standpoint.

We have therefore come full circle: we are back to adding a bunch of "_x" 
functions for C, and there will be no polymorphism (in C).  Sorry, folks.

Note that Fortran does not have similar problems:

1. Fortran compilers have supported polymorphism for 20+ years
2. Fortran does not automatically cast between INTEGER values of different sizes

After much debate, the BigCount WG has decided that C11 _Generic just isn't 
worth it.  That's no reason to penalize Fortran, though.

Jeff Squyres

mpi-forum mailing list

Reply via email to