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