49 lines
		
	
	
		
			913 B
		
	
	
	
		
			Prolog
		
	
	
	
	
	
			
		
		
	
	
			49 lines
		
	
	
		
			913 B
		
	
	
	
		
			Prolog
		
	
	
	
	
	
:- use_module(library(lam_mpi)).
 | 
						|
 | 
						|
:- initialization(main).
 | 
						|
 | 
						|
main :-
 | 
						|
       mpi_init,
 | 
						|
       mpi_comm_size(2),
 | 
						|
       mpi_comm_rank(Rank),
 | 
						|
       do_comm(Rank),
 | 
						|
       mpi_finalize.
 | 
						|
 | 
						|
do_comm(0) :-
 | 
						|
	   between(1,10,I),
 | 
						|
	   NI is I*10,
 | 
						|
	   gen_list(NI,List),
 | 
						|
	   mpi_isend(List, 1, I, Handle),
 | 
						|
	   T =.. [f|List],
 | 
						|
	   mpi_isend(T, 1, I, Handle2),
 | 
						|
	   mpi_wait(Handle2, _),
 | 
						|
	   mpi_wait(Handle, _),
 | 
						|
	   fail.
 | 
						|
do_comm(0) :-
 | 
						|
	   between(1,10,I),
 | 
						|
	   NI is 2.3*I,
 | 
						|
	   mpi_send(NI, 1, I),
 | 
						|
	   fail.
 | 
						|
do_comm(0).
 | 
						|
do_comm(1) :-
 | 
						|
	   between(1,10,I),
 | 
						|
	   mpi_irecv(0, I, Handle),
 | 
						|
	   mpi_irecv(0, I, Handle1),
 | 
						|
	   mpi_wait_recv(Handle1, _, _T),
 | 
						|
	   mpi_wait_recv(Handle, _, _List),
 | 
						|
	   writeln(I:_T),
 | 
						|
	   writeln(I:_List),
 | 
						|
	   fail.
 | 
						|
do_comm(1) :-
 | 
						|
	   between(1,10,I),
 | 
						|
	   mpi_recv(0, I, T),
 | 
						|
	   writeln(I:T),
 | 
						|
	   fail.
 | 
						|
do_comm(1).
 | 
						|
 | 
						|
gen_list(0,[]) :- !.
 | 
						|
gen_list(I,I.List) :-
 | 
						|
          I1 is I-1,
 | 
						|
          gen_list(I1,List).
 | 
						|
 |