49 lines
		
	
	
		
			913 B
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			49 lines
		
	
	
		
			913 B
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
								 | 
							
								:- 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).
							 | 
						||
| 
								 | 
							
								
							 |