278 CHAPTER 7. MESSAGE PASSING INTERFACE
in lines 31-40 communicates all the loc_a to processor 0 and stores them in the
array a_list. The print commands in lines 26-28 and lines 43-47 verify this.
The outputs for the print commands might not appear in sequential order that
is indicated following the code listing. This output verifies the communications
for p = 4 processors.
MPI/Fortran 9x Code basicmpi.f
1. program basicmpi
2.! Illustrates the basic eight mpi commands.
3. implicit none
4.! Includes the mpi Fortran library.
5. include ’mpif.h’
6. real:: a,b,h,loc_a,loc_b,total
7. real, dimension(0:31):: a_list
8. integer:: my_rank,p,n,source,dest,tag,ierr,loc_n
9. integer:: i,status(mpi_status_size)
10.! Every processor gets values for a,b and n.
11. data a,b,n,dest,tag/0.0,100.0,1024,0,50/
12.! Initializes mpi, gets the rank of the processor, my_rank,
13.! and number of pro cessors, p.
14. call mpi_init(ierr)
15. call mpi_comm_rank(mpi_comm_world,my_rank,ierr)
16. call mpi_comm_size(mpi_comm_world,p,ierr)
17. print*,’my_rank =’,my_rank, ’a = ’,a
18. print*,’my_rank =’,my_rank, ’b = ’,b
19. print*,’my_rank =’,my_rank, ’n = ’,n
20. h = (b-a)/n
21.! Each processor has unique value of loc_n, loc_a and loc_b.
22. loc_n = n/p
23. loc_a = a+my_rank*loc_n*h
24. loc_b = loc_a + loc_n*h
25.! Each processor prints its loc_n, loc_a and loc_b.
26. print*,’my_rank =’,my_rank, ’loc_a = ’,lo c_a
27. print*,’my_rank =’,my_rank, ’loc_b = ’,loc_b
28. print*,’my_rank =’,my_rank, ’loc_n = ’,loc_n
29.! Processors p not equal 0 sends a_loc to an array, a_list,
30.! in processor 0, and processor 0 recieves these.
31. if (my_rank.eq.0) then
32. a_list(0) = loc_a
33. do source = 1,p-1
34. call mpi_recv(a_list(source),1,mpi_real,source &
35. ,50,mpi_comm_world,status,ierr)
36. end do
37. else
38. call mpi_send(loc_a,1,mpi_real,0,50,&
© 2004 by Chapman & Hall/CRC