This repository has been archived on 2023-08-20. You can view files and clone it, but cannot push or open issues or pull requests.
yap-6.3/library/mpi/examples/demo1.pl
Vítor Santos Costa 9e7257978c cleanup
2014-09-09 23:55:47 -05:00

74 lines
1.6 KiB
Prolog

%% demo1.pl -- Stasinos Konstantopoulos
%% konstant@let.rug.nl, Thu Jan 24 2002
%%
:- use_module(library(mpi)).
% make the `floor' operator return integer values
:- set_prolog_flag(language, iso).
%%
%% 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
%% and collects the results.
%%
do(0, NumProc):-
!,
% broadcast task
mpi_bcast(10, 0),
set_value(n, NumProc),
set_value(acc, 0),
repeat,
mpi_receive(T, Source, Tag),
format( '0: Proc ~q said: ~q (Tag: ~q)~n', [Source,T,Tag] ),
% accumulate results
get_value(acc, Acc),
NewAcc is Acc + T,
set_value(acc, NewAcc),
% processors still left
get_value(n, Counter),
NewCounter is Counter - 1,
set_value(n, NewCounter),
NewCounter == 1,
!,
format( '0: Result: ~q.~n', [NewAcc]).
do(Rank, NumProc):-
!,
% catch the task broadcast
mpi_bcast(Job, 0),
From is floor(Job * (Rank - 1) / (NumProc - 1)),
To is floor(Job * Rank / (NumProc - 1)) - 1,
format( '~q: I am calculating ~q..~q.~n', [Rank,From,To] ),
% do the job
calc( From, To, 0, Result ),
format( '~q: sending ~q to 0. (Tag: 1)~n', [Rank,Result] ),
% send back the results
mpi_send(Result, 0, 1).
%%
%% This is the entry point
%%
start:-
mpi_open(Rank, NumProc, ProcName),
format('Rank: ~q NumProc: ~q, ProcName: ~q~n', [Rank,NumProc,ProcName]),
do(Rank, NumProc),
format( 'Rank ~q finished!~n', [Rank] ),
mpi_close.