work around a possible redhat+MPICH bug
git-svn-id: https://yap.svn.sf.net/svnroot/yap/trunk@668 b08c6af1-5177-4d33-ba66-4b1c6b8b522a
This commit is contained in:
parent
a282a4e7c1
commit
33a7448b24
@ -9,14 +9,14 @@
|
|||||||
**************************************************************************
|
**************************************************************************
|
||||||
* *
|
* *
|
||||||
* File: mpi.c *
|
* File: mpi.c *
|
||||||
* Last rev: $Date: 2002-10-29 14:02:43 $ *
|
* Last rev: $Date: 2002-10-31 11:13:21 $ *
|
||||||
* mods: *
|
* mods: *
|
||||||
* comments: Interface to an MPI library *
|
* comments: Interface to an MPI library *
|
||||||
* *
|
* *
|
||||||
*************************************************************************/
|
*************************************************************************/
|
||||||
|
|
||||||
#ifndef lint
|
#ifndef lint
|
||||||
static char *rcsid = "$Header: /Users/vitor/Yap/yap-cvsbackup/library/mpi/mpi.c,v 1.11 2002-10-29 14:02:43 stasinos Exp $";
|
static char *rcsid = "$Header: /Users/vitor/Yap/yap-cvsbackup/library/mpi/mpi.c,v 1.12 2002-10-31 11:13:21 stasinos Exp $";
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "Yap.h"
|
#include "Yap.h"
|
||||||
@ -76,16 +76,29 @@ expand_buffer( int space )
|
|||||||
|
|
||||||
char *tmp;
|
char *tmp;
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
printf( "expanding by %d (to %d)...", space, (bufsize+space));
|
||||||
|
#endif
|
||||||
|
|
||||||
tmp = malloc( bufsize + space );
|
tmp = malloc( bufsize + space );
|
||||||
if( tmp == NULL ) {
|
if( tmp == NULL ) {
|
||||||
Error(SYSTEM_ERROR, TermNil, "out of memory" );
|
Error(SYSTEM_ERROR, TermNil, "out of memory" );
|
||||||
exit_yap( EXIT_FAILURE );
|
exit_yap( EXIT_FAILURE );
|
||||||
}
|
}
|
||||||
memcpy( tmp, buf, bufsize );
|
memcpy( tmp, buf, bufsize );
|
||||||
|
#if 0
|
||||||
|
printf("memcpy'd...");
|
||||||
|
#endif
|
||||||
free( buf );
|
free( buf );
|
||||||
|
#if 0
|
||||||
|
printf("free'd...");
|
||||||
|
#endif
|
||||||
buf = tmp;
|
buf = tmp;
|
||||||
#else /* use realloc */
|
#else /* use realloc */
|
||||||
buf = realloc( buf, bufsize + space );
|
buf = realloc( buf, bufsize + space );
|
||||||
|
#if 0
|
||||||
|
printf("realloc'ed space...");
|
||||||
|
#endif
|
||||||
if( buf == NULL ) {
|
if( buf == NULL ) {
|
||||||
Error(SYSTEM_ERROR, TermNil, "out of memory");
|
Error(SYSTEM_ERROR, TermNil, "out of memory");
|
||||||
exit_yap( EXIT_FAILURE );
|
exit_yap( EXIT_FAILURE );
|
||||||
@ -93,6 +106,13 @@ expand_buffer( int space )
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
bufsize += space;
|
bufsize += space;
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
printf("SUCCESS\n");
|
||||||
|
printf( "New bufsize: %d\n", bufsize );
|
||||||
|
buf[bufsize-space] = 0;
|
||||||
|
printf("Buffer contents: %s\n", buf);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
@ -355,7 +375,35 @@ p_mpi_open(void) /* mpi_open(?rank, ?num_procs, ?proc_name) */
|
|||||||
Term t_rank = Deref(ARG1), t_numprocs = Deref(ARG2), t_procname = Deref(ARG3);
|
Term t_rank = Deref(ARG1), t_numprocs = Deref(ARG2), t_procname = Deref(ARG3);
|
||||||
Int retv;
|
Int retv;
|
||||||
|
|
||||||
MPI_Init( &mpi_argc, &mpi_argv );
|
/*
|
||||||
|
With MPICH MPI_Init() must be called during initialisation,
|
||||||
|
but with LAM it can be called from Prolog (mpi_open/3)
|
||||||
|
|
||||||
|
The symptoms match a known RedHat bug, see
|
||||||
|
http://email.osc.edu/pipermail/mpiexec/2002-July/000067.html
|
||||||
|
for a suggested workaround:
|
||||||
|
Redhat have somehow broken their sem.h and ipc.h. If you use your own
|
||||||
|
kernel, copy from ../src/kernel/include/asm & ../src/kernel/include/linux
|
||||||
|
the file ipc.h and sem.h to /usr/include/sys, recompile your mpich and
|
||||||
|
everything might start working. (it did for us)
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Note that if MPI_Init() fails, Yap/MPICH and Yap/LAM bahave differently:
|
||||||
|
in Yap/MPICH we are still at the Yap initialisation phase, so we let
|
||||||
|
Yap exit(FAILURE), whereas in Yap/LAM mpi_open/3 simply fails.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if ! HAVE_LIBMPICH
|
||||||
|
retv = MPI_Init( &mpi_argc, &mpi_argv );
|
||||||
|
if( retv ) {
|
||||||
|
Term t;
|
||||||
|
|
||||||
|
t = MkIntegerTerm(retv);
|
||||||
|
Error( SYSTEM_ERROR, t, "MPI_Init() returned non-zero" );
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
MPI_Comm_size( MPI_COMM_WORLD, &numprocs );
|
MPI_Comm_size( MPI_COMM_WORLD, &numprocs );
|
||||||
MPI_Comm_rank( MPI_COMM_WORLD, &rank );
|
MPI_Comm_rank( MPI_COMM_WORLD, &rank );
|
||||||
MPI_Get_processor_name( processor_name, &namelen );
|
MPI_Get_processor_name( processor_name, &namelen );
|
||||||
@ -744,6 +792,31 @@ InitMPI(void)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* With MPICH MPI_Init() must be called during initialisation,
|
||||||
|
but with LAM it can be called from Prolog (mpi_open/3).
|
||||||
|
See also the comment at "if ! HAVE_LIBMPICH" above!
|
||||||
|
*/
|
||||||
|
#if HAVE_LIBMPICH
|
||||||
|
{
|
||||||
|
int retv;
|
||||||
|
|
||||||
|
retv = MPI_Init(&mpi_argc, &mpi_argv);
|
||||||
|
if( retv ) {
|
||||||
|
Term t;
|
||||||
|
|
||||||
|
t = MkIntegerTerm(retv)
|
||||||
|
Error(SYSTEM_ERROR, t, "MPI_Init() returned non-zero");
|
||||||
|
exit_yap( EXIT_FAILURE );
|
||||||
|
}
|
||||||
|
#if 1
|
||||||
|
/* DEBUG */
|
||||||
|
else {
|
||||||
|
puts("MPI_Init() is happy!");
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
InitCPred( "mpi_open", 3, p_mpi_open, SafePredFlag|SyncPredFlag );
|
InitCPred( "mpi_open", 3, p_mpi_open, SafePredFlag|SyncPredFlag );
|
||||||
InitCPred( "mpi_close", 0, p_mpi_close, SyncPredFlag );
|
InitCPred( "mpi_close", 0, p_mpi_close, SyncPredFlag );
|
||||||
InitCPred( "mpi_send", 3, p_mpi_send, SafePredFlag|SyncPredFlag );
|
InitCPred( "mpi_send", 3, p_mpi_send, SafePredFlag|SyncPredFlag );
|
||||||
|
Reference in New Issue
Block a user