a first take at an interface to an MPI lib
git-svn-id: https://yap.svn.sf.net/svnroot/yap/trunk@354 b08c6af1-5177-4d33-ba66-4b1c6b8b522a
This commit is contained in:
49
library/mpi/examples/demo1.pl
Normal file
49
library/mpi/examples/demo1.pl
Normal file
@@ -0,0 +1,49 @@
|
||||
%% demo1.pl -- Stasinos Konstantopoulos
|
||||
%% konstant@let.rug.nl, Thu Jan 24 2002
|
||||
%%
|
||||
|
||||
%%
|
||||
%% This the calculation that needs to be performed, in this case
|
||||
%% the sum of [From..To]
|
||||
%%
|
||||
|
||||
calc( From, From, Acc, Res ) :- !,
|
||||
Res is Acc + From.
|
||||
calc( From, To, Acc, Res ) :- !,
|
||||
Acc1 is Acc + To,
|
||||
To1 is To - 1,
|
||||
calc( From, To1, Acc1, Res ).
|
||||
|
||||
%%
|
||||
%% This spreads the work among the processors
|
||||
%%
|
||||
|
||||
do(0, Num) :-
|
||||
!,
|
||||
Half is Num // 2,
|
||||
format( 'Proc 0: Calculating ~q..~q~n', [1, Half] ),
|
||||
calc( 1, Half, 0, R1 ),
|
||||
format( 'Proc 0: Done! (~q)~n', [R1] ),
|
||||
mpi_receive( R2, Source, Tag ), % Receive any Source, any Tag
|
||||
format( 'Proc ~q said: ~q (Tag: ~q)~n', [Source,R2,Tag] ),
|
||||
% mpi_receive( R2, 1, 1 ), % Be more particular
|
||||
Res is R1 + R2,
|
||||
format( 'Sum(1..~q) = ~q~n', [Num,Res] ).
|
||||
do(1, Num) :-
|
||||
!,
|
||||
Half is Num // 2,
|
||||
format( 'Proc 1: Calculating ~q..~q~n', [Half,Num] ),
|
||||
calc( Half, Num, 0, Res ),
|
||||
format( 'Proc 1: Done! (~q)~n', [Res] ),
|
||||
mpi_send( Res, 0, 1 ).
|
||||
|
||||
|
||||
%%
|
||||
%% This is the entry point
|
||||
%%
|
||||
|
||||
start(Num) :-
|
||||
mpi_open( Rank, NumProc, ProcName ),
|
||||
format( 'Rank: ~q NumProc: ~q, ProcName: ~q~n', [Rank,NumProc,ProcName] ),
|
||||
do( Rank, Num ),
|
||||
format( 'Rank ~q finished!~n', [Rank] ).
|
Reference in New Issue
Block a user