Using ILP64 

Use the following options to enable the ILP64 interface

If you use ILP64 data model in the C program, be cautious about mutual correspondence between C datatypes and MPI datatypes, namely, use MPI_LONG datatype while operating on data of type long int (or any other 64-bit integer type).

If you want your C program to be LP64/ILP64 portable by specifying a flexible size integer datatype, do not forget to introduce that flexibility for the MPI integer datatype. This example program is supposed to work correctly both in LP64 and ILP64 data models:

#include <stdlib.h>

#include <stdio.h>

#include “mpi.h”

#ifdef ILP64

#define my_int long

#define MY_MPI_INT MPI_LONG

#else

#define my_int int

#define MY_MPI_INT MPI_INT

#endif

int main() {

my_int i, size, rank, buf[5] = {-1, -1, -1, -1, -1};

MPI_Init( NULL, NULL );

MPI_Comm_size( MPI_COMM_WORLD, &size );

MPI_Comm_rank( MPI_COMM_WORLD, &rank );

if( size < 2 ) return 1;

if( rank == 0 ) {

for( i = 0; i < 5; i++ ) buf[i] = i;

MPI_Send( buf, 5, MY_MPI_INT, 1, 123, MPI_COMM_WORLD );

} else if( rank == 1 ) {

MPI_Recv( buf, 5, MY_MPI_INT, 0, 123, MPI_COMM_WORLD, MPI_STATUS_IGNORE );

for( i = 0; i < 5; i++ ) printf( “Received %d in buf[%d]\n”, (int)buf[i], (int)i );

}

MPI_Finalize();

return 0;

}

The program will work correctly in both variants:

$ mpiicc –o test_lp64 test.c ; mpirun –n 2 ./test_lp64

Received 0 in buf[0]

Received 1 in buf[1]

Received 2 in buf[2]

Received 3 in buf[3]

Received 4 in buf[4]

$ mpiicc –o test_ilp64 –DILP64 –ilp64 test.c ; mpirun –n 2 ./test_ilp64

Received 0 in buf[0]

Received 1 in buf[1]

Received 2 in buf[2]

Received 3 in buf[3]

Received 4 in buf[4]