a first take at an MPE interface

git-svn-id: https://yap.svn.sf.net/svnroot/yap/trunk@371 b08c6af1-5177-4d33-ba66-4b1c6b8b522a
This commit is contained in:
stasinos 2002-02-22 14:31:45 +00:00
parent 22ab6fafd4
commit dcbba128ff
9 changed files with 6986 additions and 2739 deletions

View File

@ -657,6 +657,9 @@ YapInit(yap_init_args *yap_init)
#if HAVE_MPI #if HAVE_MPI
InitMPI (); InitMPI ();
#endif #endif
#if HAVE_MPE
InitMPE ();
#endif
if (yap_init->YapPrologBootFile != NULL) { if (yap_init->YapPrologBootFile != NULL) {
/* /*

View File

@ -54,6 +54,7 @@ YAP_EXTRAS=@YAP_EXTRAS@
# for c_interface.c # for c_interface.c
# #
CC=@CC@ CC=@CC@
MPI_CC=@MPI_CC@
CPPFLAGS=@CPPFLAGS@ -I. -I$(srcdir)/H -I$(srcdir)/OPTYap CPPFLAGS=@CPPFLAGS@ -I. -I$(srcdir)/H -I$(srcdir)/OPTYap
CFLAGS= @CFLAGS@ $(YAP_EXTRAS) $(DEFS) $(CPPFLAGS) CFLAGS= @CFLAGS@ $(YAP_EXTRAS) $(DEFS) $(CPPFLAGS)
C_INTERF_FLAGS= @C_INTERF_FLAGS@ $(YAP_EXTRAS) $(DEFS) $(CPPFLAGS) -I$(srcdir)/include C_INTERF_FLAGS= @C_INTERF_FLAGS@ $(YAP_EXTRAS) $(DEFS) $(CPPFLAGS) -I$(srcdir)/include
@ -76,7 +77,7 @@ INSTALL_PROGRAM=@INSTALL_PROGRAM@
M4GENHDRS=$(srcdir)/@M4GENHDRS@ M4GENHDRS=$(srcdir)/@M4GENHDRS@
M4GENABSMI=$(srcdir)/@M4GENABSMI@ M4GENABSMI=$(srcdir)/@M4GENABSMI@
INDENT=@INDENT@ INDENT=@INDENT@
SHELL=/bin/sh SHELL=@SHELL@
RANLIB=@RANLIB@ RANLIB=@RANLIB@
AR=@AR@ AR=@AR@
srcdir=@srcdir@ srcdir=@srcdir@
@ -146,7 +147,7 @@ C_SOURCES= \
$(srcdir)/OPTYap/or.cowengine.c $(srcdir)/OPTYap/or.sbaengine.c \ $(srcdir)/OPTYap/or.cowengine.c $(srcdir)/OPTYap/or.sbaengine.c \
$(srcdir)/OPTYap/or.scheduler.c $(srcdir)/OPTYap/or.cut.c \ $(srcdir)/OPTYap/or.scheduler.c $(srcdir)/OPTYap/or.cut.c \
$(srcdir)/OPTYap/tab.tries.c $(srcdir)/OPTYap/tab.suspend.c \ $(srcdir)/OPTYap/tab.tries.c $(srcdir)/OPTYap/tab.suspend.c \
$(srcdir)/library/mpi/mpi.c $(srcdir)/library/mpi/mpi.c $(srcdir)/library/mpi/mpe.c
PL_SOURCES= \ PL_SOURCES= \
$(srcdir)/pl/arith.yap $(srcdir)/pl/arrays.yap $(srcdir)/pl/boot.yap \ $(srcdir)/pl/arith.yap $(srcdir)/pl/arrays.yap $(srcdir)/pl/boot.yap \
@ -170,9 +171,10 @@ ENGINE_OBJECTS = \
cdmgr.o cmppreds.o compiler.o computils.o \ cdmgr.o cmppreds.o compiler.o computils.o \
corout.o dbase.o errors.o eval.o bignum.o \ corout.o dbase.o errors.o eval.o bignum.o \
exec.o grow.o heapgc.o index.o init.o \ exec.o grow.o heapgc.o index.o init.o \
iopreds.o depth_bound.o mavar.o modules.o mpi.o other.o \ iopreds.o depth_bound.o mavar.o modules.o other.o \
parser.o save.o scanner.o sort.o stdpreds.o sysbits.o tracer.o \ parser.o save.o scanner.o sort.o stdpreds.o sysbits.o tracer.o \
unify.o userpreds.o utilpreds.o write.o ypsocks.o ypstdio.o unify.o userpreds.o utilpreds.o write.o ypsocks.o ypstdio.o \
mpi.o mpe.o
C_INTERFACE_OBJECTS = \ C_INTERFACE_OBJECTS = \
load_foreign.o load_dl.o load_dld.o \ load_foreign.o load_dl.o load_dld.o \
@ -432,8 +434,10 @@ tab.suspend.o: $(srcdir)/OPTYap/tab.suspend.c
$(CC) -c $(CFLAGS) $(srcdir)/OPTYap/tab.suspend.c -o $@ $(CC) -c $(CFLAGS) $(srcdir)/OPTYap/tab.suspend.c -o $@
mpi.o: $(srcdir)/library/mpi/mpi.c mpi.o: $(srcdir)/library/mpi/mpi.c
$(CC) -c $(CFLAGS) $(srcdir)/library/mpi/mpi.c -o $@ $(MPI_CC) -c $(CFLAGS) $(srcdir)/library/mpi/mpi.c -o $@
mpe.o: $(srcdir)/library/mpi/mpe.c
$(MPI_CC) -c $(CFLAGS) $(srcdir)/library/mpi/mpe.c -o $@
## CPP'ed files (for macro debugging) ## CPP'ed files (for macro debugging)
@ -455,7 +459,7 @@ startup: yap $(PL_SOURCES)
echo "['$(srcdir)/pl/init.yap']. save_program(startup)." | @CROSS_SIMULATOR@ ./yap -b $(srcdir)/pl/boot.yap echo "['$(srcdir)/pl/init.yap']. save_program(startup)." | @CROSS_SIMULATOR@ ./yap -b $(srcdir)/pl/boot.yap
yap: $(HEADERS) yap.o @YAPLIB@ yap: $(HEADERS) yap.o @YAPLIB@
$(CC) $(STANDARD_CFLAGS) $(LDFLAGS) -o yap yap.o @YAPLIB@ $(LIBS) $(MPI_CC) $(STANDARD_CFLAGS) $(LDFLAGS) -o yap yap.o @YAPLIB@ $(LIBS)
libYap.a: $(LIB_OBJECTS) libYap.a: $(LIB_OBJECTS)
-rm -f libYap.a -rm -f libYap.a

11
README
View File

@ -13,7 +13,7 @@ Yap is and for instructions on how to build it.
YAP 4.2 is known to build with many versions of gcc (<= gcc-2.7.2, >= YAP 4.2 is known to build with many versions of gcc (<= gcc-2.7.2, >=
gcc-2.8.1, >= egcs-1.0.1, gcc-2.95.*) and on a variety of Unix'es: gcc-2.8.1, >= egcs-1.0.1, gcc-2.95.*) and on a variety of Unix'es:
SunOS 4.1, Solaris 2.*, Irix 5.2, HP-UX 10, Dec Alpha Unix, Linux 1.2 SunOS 4.1, Solaris 2.*, Irix 5.2, HP-UX 10.20, Dec Alpha Unix, Linux 1.2
and Linux 2.* (RedHat 4.0 through 5.2, Debian 2.*) in both the x86 and and Linux 2.* (RedHat 4.0 through 5.2, Debian 2.*) in both the x86 and
alpha platforms. It has been built on Windows NT 4.0 using Cygwin from alpha platforms. It has been built on Windows NT 4.0 using Cygwin from
Cygnus Solutions (see README.cygwin) and using Visual C++ 6.0. Cygnus Solutions (see README.cygwin) and using Visual C++ 6.0.
@ -31,9 +31,9 @@ distribute these packages.
If you have a question about this software, desire to add code, found If you have a question about this software, desire to add code, found
a bug, want to request a feature, or wonder how to get further a bug, want to request a feature, or wonder how to get further
assistance, please send e-mail to yappers@ncc.up.pt. To subscribe to assistance, please send e-mail to yap-users@lists.sourceforge.net. To
the mailing list, send a request to majordomo@ncc.up.pt with body subscribe to the mailing list or access the list archives, please see
"subscribe yappers". http://lists.sourceforge.net/lists/listinfo/yap-users
Online documentation is available for Yap at: Online documentation is available for Yap at:
@ -88,7 +88,8 @@ To compile YAP just do:
(7) Happy? make install (7) Happy? make install
(8) "make install-info" will create the info files in the standard info directory. (8) "make install_info" will create the info files in the standard
info directory.
(9) "make html" will create documentation in html format in the (9) "make html" will create documentation in html format in the
current directory. current directory.

View File

@ -12,15 +12,27 @@
#undef HAVE_LIBGMP #undef HAVE_LIBGMP
/* What MPI libraries are there? */ /* What MPI libraries are there? */
#undef HAVE_LIBMPICH #define HAVE_LIBMPI 0
#define HAVE_LIBMPICH 0
/* Should we use MPI ? */ /* Should we use MPI ? */
#if HAVE_LIBMPICH #if HAVE_LIBMPI
#define HAVE_MPI 1 #define HAVE_MPI 1
#else #else
#define HAVE_MPI 0 #define HAVE_MPI 0
#endif #endif
/* Is there an MPE library? */
#define HAVE_LIBMPE 0
/* Should we use MPE ? */
#if HAVE_LIBMPE && HAVE_MPI
#define HAVE_MPE 1
#else
#define HAVE_MPE 0
#endif
/* does the compiler support inline ? */ /* does the compiler support inline ? */
#undef inline #undef inline

8730
configure vendored

File diff suppressed because it is too large Load Diff

View File

@ -69,18 +69,31 @@ AC_ARG_WITH(readline,
fi, fi,
[yap_cv_readline=yes]) [yap_cv_readline=yes])
AC_ARG_WITH(mpich, AC_ARG_WITH(mpi,
[ --with-mpich[=DIR] use MPICH library in DIR], [ --with-mpi[=DIR] use MPI library in DIR],
if test $withval = yes; then if test $withval = yes; then
yap_cv_mpich=yes yap_cv_mpi=yes
elif test $withval = no; then elif test $withval = no; then
yap_cv_mpich=no yap_cv_mpi=no
else else
yap_cv_mpich=$with_mpich yap_cv_mpi=$with_mpi
LDFLAGS="$LDFLAGS -L${yap_cv_mpich}/lib" LDFLAGS="$LDFLAGS -L${yap_cv_mpi}/lib"
CPPFLAGS="$CPPFLAGS -I${yap_cv_mpich}/include" CPPFLAGS="$CPPFLAGS -I${yap_cv_mpi}/include"
fi, fi,
[yap_cv_mpich=yes]) [yap_cv_mpi=yes])
AC_ARG_WITH(mpe,
[ --with-mpe[=DIR] use MPE library in DIR],
if test $withval = yes; then
yap_cv_mpe=yes
elif test $withval = no; then
yap_cv_mpe=no
else
yap_cv_mpe=$with_mpe
LDFLAGS="$LDFLAGS -L${yap_cv_mpe}/lib"
CPPFLAGS="$CPPFLAGS -I${yap_cv_mpe}/include"
fi,
[yap_cv_mpe=yes])
AC_ARG_WITH(heap-space, AC_ARG_WITH(heap-space,
[ --with-heap-space[=space] default heap size in Kbytes], [ --with-heap-space[=space] default heap size in Kbytes],
@ -216,9 +229,11 @@ dnl Checks for programs.
AC_PROG_LN_S AC_PROG_LN_S
AC_PROG_INSTALL AC_PROG_INSTALL
AC_PROG_RANLIB AC_PROG_RANLIB
AC_CHECK_TOOL(INDENT,indent,true) AC_CHECK_TOOL(INDENT,indent,:)
AC_CHECK_TOOL(AR,ar,true) AC_CHECK_TOOL(AR,ar,:)
AC_CHECK_TOOL(MPI_CC,mpicc,:)
AC_PATH_PROG(INSTALL_INFO,install-info,true,$PATH:/sbin:/usr/sbin:/usr/etc:/usr/local/sbin) AC_PATH_PROG(INSTALL_INFO,install-info,true,$PATH:/sbin:/usr/sbin:/usr/etc:/usr/local/sbin)
AC_PATH_PROG(SHELL,sh)
AC_SUBST(INSTALL_COMMAND) AC_SUBST(INSTALL_COMMAND)
AC_SUBST(CROSS_SIMULATOR) AC_SUBST(CROSS_SIMULATOR)
@ -262,14 +277,38 @@ if test "$yap_cv_gmp" != "no"
then then
AC_CHECK_LIB(gmp,main) AC_CHECK_LIB(gmp,main)
fi fi
if test "$yap_cv_mpich" != "no"
if test "$yap_cv_mpi" != "no"
then then
OLD_CC=${CC}
CC=${MPI_CC}
AC_CHECK_LIB(mpi,MPI_Init)
if test "$ac_cv_lib_mpi_MPI_Init" = yes
then
#LIBS="$LIBS -lpmpich"
YAPMPILIB=YapMPI.a
else
AC_CHECK_LIB(mpich,MPI_Init) AC_CHECK_LIB(mpich,MPI_Init)
if test "$ac_cv_lib_mpich_MPI_Init" = yes if test "$ac_cv_lib_mpi_MPI_Init" = yes
then then
LIBS="$LIBS -lpmpich" LIBS="$LIBS -lpmpich"
YAPMPILIB=YapMPI.a
else
YAPMPILIB=
fi fi
fi fi
CC=${OLD_CC}
fi
if test "$yap_cv_mpe" != "no"
then
OLD_CC=${CC}
CC=${MPI_CC}
AC_CHECK_LIB(mpe,MPE_Init_log)
CC=${OLD_CC}
fi
AC_SUBST(YAPMPILIB)
AC_PROG_CPP AC_PROG_CPP
@ -755,10 +794,11 @@ fi
mkdir -p library/regex mkdir -p library/regex
mkdir -p library/system mkdir -p library/system
mkdir -p library/mpi
mkdir -p CHR mkdir -p CHR
mkdir -p CLPQR mkdir -p CLPQR
AC_OUTPUT(Makefile library/regex/Makefile library/system/Makefile library/random/Makefile .depend library/Makefile CHR/Makefile CLPQR/Makefile) AC_OUTPUT(Makefile library/regex/Makefile library/system/Makefile library/random/Makefile library/mpi/Makefile .depend library/Makefile CHR/Makefile CLPQR/Makefile)
make depend make depend

View File

@ -23,20 +23,35 @@ calc( From, To, Acc, Res ) :- !,
do(0, Num) :- do(0, Num) :-
!, !,
mpe_create_event(Ev1),
mpe_create_event(Ev2),
format( "Ev1 == ~q, Ev2 == ~q~n", [Ev1,Ev2] ),
mpe_create_state(Ev1,Ev2),
format( "1 AA~n", [] ),
mpe_log(Ev1),
format( "2 AA~n", [] ),
mpi_bcast( Num, 0 ), mpi_bcast( Num, 0 ),
format( 'Proc 0: broadcast ~q.~n', [Num] ). format( 'Proc 0: broadcast ~q.~n', [Num] ),
mpe_log(Ev2).
do(Rank, _) :- do(Rank, _) :-
!, !,
mpe_create_event(Ev1),
mpe_create_event(Ev2),
format( "Ev1 == ~q, Ev2 == ~q~n", [Ev1,Ev2] ),
mpe_log(Ev1),
mpi_bcast( Num, 0 ), mpi_bcast( Num, 0 ),
format( 'Proc ~q: had ~q broadcast from 0.~n', [Rank, Num] ). format( 'Proc ~q: had ~q broadcast from 0.~n', [Rank, Num] ),
mpe_log(Ev2).
%% %%
%% This is the entry point %% This is the entry point
%% %%
start(Num) :- start(Msg) :-
mpi_open( Rank, NumProc, ProcName ), mpi_open( Rank, NumProc, ProcName ),
format( 'Rank: ~q NumProc: ~q, ProcName: ~q~n', [Rank,NumProc,ProcName] ), format( 'Rank: ~q NumProc: ~q, ProcName: ~q~n', [Rank,NumProc,ProcName] ),
do( Rank, Num ), mpe_open,
format( 'Rank ~q finished!~n', [Rank] ). do(Rank, Msg),
format( 'Rank ~q finished!~n', [Rank] ),
mpe_close.

148
library/mpi/mpe.c Normal file
View File

@ -0,0 +1,148 @@
/*************************************************************************
* *
* YAP Prolog *
* *
* Yap Prolog was developed at NCCUP - Universidade do Porto *
* *
* Copyright S. Konstantopoulos and Universidade do Porto 2002 *
* *
**************************************************************************
* *
* File: mpe.c *
* Last rev: $Date: 2002-02-22 14:31:45 $ *
* mods: *
* comments: Interface to an MPE library *
* *
*************************************************************************/
#ifndef lint
static char *rcsid = "$Header: ";
#endif
#include "Yap.h"
#if HAVE_MPE
#if 0
/* for AtomEof */
#include "Heap.h"
#include "yapio.h"
#include <stdlib.h>
#include <string.h>
#endif
#include "Yatom.h"
#include <mpe.h>
STATIC_PROTO (Int p_init, (void));
STATIC_PROTO (Int p_start, (void));
STATIC_PROTO (Int p_close, (void));
STATIC_PROTO (Int p_create_event, (void));
STATIC_PROTO (Int p_create_state, (void));
STATIC_PROTO (Int p_log, (void));
/*
* Auxiliary Data and Functions
*/
/*
* C Predicates
*/
static Int
p_init() /* mpe_open */
{
int retv;
retv = MPE_Init_log();
printf( "MPE_Init_log(): %d\n", retv );
return TRUE;
}
static Int
p_start() /* mpe_start */
{
int retv;
retv = MPE_Start_log();
printf( "MPE_Start_log(): %d\n", retv );
return TRUE;
}
static Int /* mpe_close(+FileName) */
p_close()
{
int retv;
retv = MPE_Finish_log( "test.log" );
printf( "MPE_Finish_log(): %d\n", retv );
return TRUE;
}
static Int /* mpe_create_event(-Event) */
p_create_event()
{
Int event_id;
event_id = MPE_Log_get_event_number();
return unify(ARG1, MkIntegerTerm(event_id));
}
static Int /* mpe_create_state(+Event,+Event,+Text,+Colour) */
p_create_state()
{
Int start_id, end_id;
char *descr, *colour;
start_id = IntOfTerm(ARG1);
end_id = IntOfTerm(ARG2);
descr = "State";
colour = "red";
MPE_Describe_state( start_id, end_id, descr, colour );
return TRUE;
}
static Int
p_log() /* mpe_log(+Event) */
{
Int event_id;
event_id = IntOfTerm(ARG1);
MPE_Log_event( event_id, 0, "Event" );
return TRUE;
}
/*
* Init
*/
void
InitMPE(void)
{
MPE_Init_log();
InitCPred( "mpe_open", 0, p_init, SafePredFlag );
InitCPred( "mpe_start", 0, p_start, SafePredFlag );
InitCPred( "mpe_close", 0, p_close, SafePredFlag );
InitCPred( "mpe_create_event", 1, p_create_event, SafePredFlag );
InitCPred( "mpe_create_state", 2, p_create_state, SafePredFlag );
InitCPred( "mpe_log", 1, p_log, SafePredFlag );
}
#endif /* HAVE_MPE */

View File

@ -9,14 +9,14 @@
************************************************************************** **************************************************************************
* * * *
* File: mpi.c * * File: mpi.c *
* Last rev: $Date: 2002-02-12 17:35:41 $ * * Last rev: $Date: 2002-02-22 14:31:45 $ *
* 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.2 2002-02-12 17:35:41 stasinos Exp $"; static char *rcsid = "$Header: /Users/vitor/Yap/yap-cvsbackup/library/mpi/mpi.c,v 1.3 2002-02-22 14:31:45 stasinos Exp $";
#endif #endif
#include "Yap.h" #include "Yap.h"
@ -173,13 +173,14 @@ mpi_parse(void)
static Int static Int
p_mpi_open(void) /* mpi_open(?rank, ?num_procs, ?proc_name) */ p_mpi_open(void) /* mpi_open(?rank, ?num_procs, ?proc_name) */
{ {
Term t_rank = ARG1, t_numprocs = ARG2, t_name = ARG3; Term t_rank = Deref(ARG1), t_numprocs = Deref(ARG2), t_procname = Deref(ARG3);
Int retv;
unify( MkIntTerm(rank), t_rank ); retv = unify(t_rank, MkIntTerm(rank));
unify( MkIntTerm(numprocs), t_numprocs ); retv = retv && unify(t_numprocs, MkIntTerm(numprocs));
unify( MkAtomTerm(LookupAtom(processor_name)), t_name ); retv = retv && unify(t_procname, MkAtomTerm(LookupAtom(processor_name)));
return TRUE; return retv;
} }
@ -280,9 +281,10 @@ p_mpi_receive() /* mpi_receive(-data, ?orig, ?tag) */
/* NULL-terminate the string and add the ". " termination /* NULL-terminate the string and add the ". " termination
required by the parser. */ required by the parser. */
buf[status.count] = 0; MPI_Get_count( &status, MPI_CHAR, &buflen );
buf[buflen] = 0;
strcat( buf, ". " ); strcat( buf, ". " );
buflen = status.count + 2; buflen += 2;
bufptr = 0; bufptr = 0;
/* parse received string into a Prolog term */ /* parse received string into a Prolog term */
@ -388,11 +390,11 @@ InitMPI(void)
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 );
InitCPred( "mpi_open", 3, p_mpi_open, SafePredFlag ); InitCPred( "mpi_open", 3, p_mpi_open, /*SafePredFlag|SyncPredFlag*/ 0 );
InitCPred( "mpi_close", 0, p_mpi_close, SafePredFlag ); InitCPred( "mpi_close", 0, p_mpi_close, SafePredFlag );
InitCPred( "mpi_send", 3, p_mpi_send, SafePredFlag ); InitCPred( "mpi_send", 3, p_mpi_send, SafePredFlag );
InitCPred( "mpi_receive", 3, p_mpi_receive, SafePredFlag ); InitCPred( "mpi_receive", 3, p_mpi_receive, SyncPredFlag );
InitCPred( "mpi_bcast", 2, p_mpi_bcast, SafePredFlag ); InitCPred( "mpi_bcast", 2, p_mpi_bcast, SyncPredFlag );
} }
#endif /* HAVE_MPI */ #endif /* HAVE_MPI */