2006-06-04 19:43:38 +01:00
|
|
|
% Author: Nuno A. Fonseca
|
|
|
|
% Date: 2006-06-01
|
|
|
|
% $Id: lam_mpi.yap,v 1.1 2006-06-04 18:43:38 nunofonseca Exp $
|
|
|
|
|
2014-09-11 20:06:57 +01:00
|
|
|
|
|
|
|
/** @defgroup LAM LAM
|
2015-01-04 23:58:23 +00:00
|
|
|
@ingroup library
|
2014-09-11 20:06:57 +01:00
|
|
|
@{
|
|
|
|
|
|
|
|
This library provides a set of utilities for interfacing with LAM MPI.
|
|
|
|
The following routines are available once included with the
|
|
|
|
`use_module(library(lam_mpi))` command. The yap should be
|
|
|
|
invoked using the LAM mpiexec or mpirun commands (see LAM manual for
|
|
|
|
more details).
|
|
|
|
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
/** @pred mpi_barrier
|
|
|
|
|
|
|
|
|
|
|
|
Collective communication predicate. Performs a barrier
|
|
|
|
synchronization among all processes. Note that a collective
|
|
|
|
communication means that all processes call the same predicate. To be
|
|
|
|
able to use a regular `mpi_recv` to receive the messages, one
|
|
|
|
should use `mpi_bcast2`.
|
|
|
|
|
|
|
|
|
|
|
|
*/
|
|
|
|
/** @pred mpi_bcast2(+ _Root_, ? _Data_)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Broadcasts the message _Data_ from the process with rank _Root_
|
|
|
|
to all other processes.
|
|
|
|
|
|
|
|
|
|
|
|
*/
|
|
|
|
/** @pred mpi_comm_rank(- _Rank_)
|
|
|
|
|
|
|
|
|
|
|
|
Unifies _Rank_ with the rank of the current process in the MPI environment.
|
|
|
|
|
|
|
|
|
|
|
|
*/
|
|
|
|
/** @pred mpi_comm_size(- _Size_)
|
|
|
|
|
|
|
|
|
|
|
|
Unifies _Size_ with the number of processes in the MPI environment.
|
|
|
|
|
|
|
|
|
|
|
|
*/
|
|
|
|
/** @pred mpi_finalize
|
|
|
|
|
|
|
|
|
|
|
|
Terminates the MPI execution environment. Every process must call this predicate before exiting.
|
|
|
|
|
|
|
|
|
|
|
|
*/
|
|
|
|
/** @pred mpi_gc
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Attempts to perform garbage collection with all the open handles
|
|
|
|
associated with send and non-blocking broadcasts. For each handle it
|
|
|
|
tests it and the message has been delivered the handle and the buffer
|
|
|
|
are released.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/
|
|
|
|
/** @pred mpi_init
|
|
|
|
|
|
|
|
|
|
|
|
Sets up the mpi environment. This predicate should be called before any other MPI predicate.
|
|
|
|
|
|
|
|
|
|
|
|
*/
|
|
|
|
/** @pred mpi_irecv(? _Source_,? _Tag_,- _Handle_)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Non-blocking communication predicate. The predicate returns an
|
|
|
|
_Handle_ for a message that will be received from processor with
|
|
|
|
rank _Source_ and tag _Tag_. Note that the predicate succeeds
|
|
|
|
immediately, even if no message has been received. The predicate
|
|
|
|
`mpi_wait_recv` should be used to obtain the data associated to
|
|
|
|
the handle.
|
|
|
|
|
|
|
|
|
|
|
|
*/
|
|
|
|
/** @pred mpi_isend(+ _Data_,+ _Dest_,+ _Tag_,- _Handle_)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Non blocking communication predicate. The message in _Data_, with
|
|
|
|
tag _Tag_, is sent whenever possible to the processor with rank
|
|
|
|
_Dest_. An _Handle_ to the message is returned to be used to
|
|
|
|
check for the status of the message, using the `mpi_wait` or
|
|
|
|
`mpi_test` predicates. Until `mpi_wait` is called, the
|
|
|
|
memory allocated for the buffer containing the message is not
|
|
|
|
released.
|
|
|
|
|
|
|
|
|
|
|
|
*/
|
|
|
|
/** @pred mpi_msg_size( _Msg_, - _MsgSize_)
|
|
|
|
|
|
|
|
|
|
|
|
Unify _MsgSize_ with the number of bytes YAP would need to send the
|
|
|
|
message _Msg_.
|
|
|
|
|
|
|
|
|
|
|
|
*/
|
|
|
|
/** @pred mpi_recv(? _Source_,? _Tag_,- _Data_)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Blocking communication predicate. The predicate blocks until a message
|
|
|
|
is received from processor with rank _Source_ and tag _Tag_.
|
|
|
|
The message is placed in _Data_.
|
|
|
|
|
|
|
|
|
|
|
|
*/
|
|
|
|
/** @pred mpi_send(+ _Data_,+ _Dest_,+ _Tag_)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Blocking communication predicate. The message in _Data_, with tag
|
|
|
|
_Tag_, is sent immediately to the processor with rank _Dest_.
|
|
|
|
The predicate succeeds after the message being sent.
|
|
|
|
|
|
|
|
|
|
|
|
*/
|
|
|
|
/** @pred mpi_test(? _Handle_,- _Status_)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Provides information regarding the handle _Handle_, ie., if a
|
|
|
|
communication operation has been completed. If the operation
|
|
|
|
associate with _Hanlde_ has been completed the predicate succeeds
|
|
|
|
with the completion status in _Status_, otherwise it fails.
|
|
|
|
|
|
|
|
|
|
|
|
*/
|
|
|
|
/** @pred mpi_test_recv(? _Handle_,- _Status_,- _Data_)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Provides information regarding a handle. If the message associated
|
|
|
|
with handle _Hanlde_ is buffered then the predicate succeeds
|
|
|
|
unifying _Status_ with the status of the message and _Data_
|
|
|
|
with the message itself. Otherwise, the predicate fails.
|
|
|
|
|
|
|
|
|
|
|
|
*/
|
|
|
|
/** @pred mpi_version(- _Major_,- _Minor_)
|
|
|
|
|
|
|
|
|
|
|
|
Unifies _Major_ and _Minor_ with, respectively, the major and minor version of the MPI.
|
|
|
|
|
|
|
|
|
|
|
|
*/
|
|
|
|
/** @pred mpi_wait(? _Handle_,- _Status_)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Completes a non-blocking operation. If the operation was a
|
|
|
|
`mpi_send`, the predicate blocks until the message is buffered
|
|
|
|
or sent by the runtime system. At this point the send buffer is
|
|
|
|
released. If the operation was a `mpi_recv`, it waits until the
|
|
|
|
message is copied to the receive buffer. _Status_ is unified with
|
|
|
|
the status of the message.
|
|
|
|
|
|
|
|
|
|
|
|
*/
|
|
|
|
/** @pred mpi_wait_recv(? _Handle_,- _Status_,- _Data_)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Completes a non-blocking receive operation. The predicate blocks until
|
|
|
|
a message associated with handle _Hanlde_ is buffered. The
|
|
|
|
predicate succeeds unifying _Status_ with the status of the
|
|
|
|
message and _Data_ with the message itself.
|
|
|
|
|
|
|
|
|
|
|
|
*/
|
2006-06-04 19:43:38 +01:00
|
|
|
:- module(lam_mpi, [
|
|
|
|
mpi_init/0,
|
|
|
|
mpi_finalize/0,
|
|
|
|
mpi_comm_size/1,
|
|
|
|
mpi_comm_rank/1,
|
|
|
|
mpi_version/2,
|
|
|
|
mpi_send/3,
|
|
|
|
mpi_isend/4,
|
|
|
|
mpi_recv/3,
|
|
|
|
mpi_irecv/3,
|
|
|
|
mpi_wait/2,
|
2012-02-02 23:25:31 +00:00
|
|
|
mpi_wait_recv/3,
|
2006-06-04 19:43:38 +01:00
|
|
|
mpi_test/2,
|
|
|
|
mpi_test_recv/3,
|
|
|
|
mpi_bcast/2,
|
|
|
|
mpi_ibcast2/2,
|
|
|
|
mpi_ibcast2/3,
|
|
|
|
mpi_bcast2/2,
|
|
|
|
mpi_bcast2/3,
|
|
|
|
mpi_barrier/0,
|
2012-02-05 11:20:30 +00:00
|
|
|
mpi_msg_buffer_size/2,
|
|
|
|
mpi_msg_size/2,
|
2006-06-04 19:43:38 +01:00
|
|
|
mpi_gc/0
|
|
|
|
]).
|
|
|
|
|
|
|
|
:- load_foreign_files([yap_mpi], [], init_mpi).
|
2012-02-05 11:20:30 +00:00
|
|
|
|
|
|
|
mpi_msg_size(Term, Size) :-
|
|
|
|
terms:export_term(Term, Buf, Size),
|
2014-09-11 20:06:57 +01:00
|
|
|
terms:kill_exported_term(Buf).
|