Build process: sizeof (MPI_Offset)

Christopher Subich csubich at math.uwaterloo.ca
Fri Nov 17 17:49:55 CST 2006


As is documented in the configure script, checking the size of 
MPI_Offset is particularly troublesome.  There are, however, a couple 
bugs related to this:

In the actual check (configure.in), the comment says to compile with 
$MPICC and link with $CC.  In the code, both compilation and linking are 
done with $MPICC, which can cause an error at execution.

If the execution happens to fail, then $ac_cv_sizeof_MPI_Offset is left 
undefined.  When checking the Fortran datatypes, the check for "Integer 
* sizeof_MPI_Offset" will fail -- it will be a check for "Integer * 
[blank]".

There is a way to check sizeof_MPI_Offset at compile time; this example 
was adapted from the autoconf manual, which describes the same pattern 
for checking sizeof(int):

AC_DEFUN(UD_MPI_OFFSET,[
if test ! $ac_cv_sizeof_MPI_Offset; then
AC_MSG_CHECKING(if MPI_Offset is size $1)
AC_COMPILE_IFELSE([
#include "mpi.h"
#include <stdio.h>
int main( int argc, char **argv )
{
      static int test_array [[sizeof (MPI_Offset) == $1 ? 1 : -1]];
      return 0;
}],AC_MSG_RESULT(yes)
ac_cv_sizeof_MPI_Offset=$1
,AC_MSG_RESULT(no))
fi
])

UD_MPI_OFFSET(8)
UD_MPI_OFFSET(4)
UD_MPI_OFFSET(16)


This code will check, using compile-only tests, whether 
sizeof(MPI_Offset) is 8, 4, or 16.  (8 and 4 are the only values I've 
personally seen it take).  It should be placed inside the "compilation 
with $MPICC" section, in configure.in (the DEFUN could be moved to 
acloal.m4).

If the compile checks work, it will set ac_cv_sizeof_MPI_Offset to the 
proper size, causing the later runtime check to be skipped, with a 
(cached) value.  If the compilations all fail, then the runtime check 
will be executed as normal.

Additionally, at least one MPI implementation (HP's) requires a seperate 
library to be linked in for MPI-IO.  At the end of the configure script 
(after all the other TRY_COMPILEs), I resolve this by adding:

SAVECC=$CC
CC=$MPICC
AC_SEARCH_LIBS(MPI_File_sync,mpio hpmpio,,
   AC_MSG_ERROR(Cannot find MPI-IO library)
)
CC=$SAVECC

This code must go after any other compilation tests, as when successful 
it adds -l[library] to LIBS.  This library will then be linked in with 
any other TRY_COMPILES, and if those are done with $CC rather than 
$MPICC the compilation might fail.




More information about the parallel-netcdf mailing list