300 CHAPTER 7. MESSAGE PASSING INTERFACE
12. call mpi_init(ierr)
13. call mpi_comm_rank(mpi_comm_world,my_rank,ierr)
14. call mpi_comm_size(mpi_comm_world,p,ierr)
15.! Pro cessor 0 packs and broadcasts the four number.
16. if (my_rank.eq.0) then
17. a = exp(1.)
18. b = 4*atan(1.)
19. c = 1
20. d = 186000
21. location = 0
22. call mpi_pack(a,1,mpi_real,numbers,100,location,&
mpi_comm_world, ierr)
23. call mpi_pack(b,1,mpi_real,numbers,100,location,&
mpi_comm_world, ierr)
24. call mpi_pack(c,1,mpi_integer,numbers,100,location,&
mpi_comm_world, ierr)
25. call mpi_pack(d,1,mpi_integer,numbers,100,location,&
mpi_comm_world, ierr)
26. call mpi_bcast(numbers,100,mpi_packed,0,&
mpi_comm_world,ierr)
27. else
28. call mpi_bcast(numbers,100,mpi_packed,0,&
mpi_comm_world,ierr)
29.! Each processor unpacks the numbers.
30. location = 0
31. call mpi_unpack(numbers,100,location,a,1,mpi_real,&
mpi_comm_world, ierr)
32. call mpi_unpack(numbers,100,location,b,1,mpi_real,&
mpi_comm_world, ierr)
33. call mpi_unpack(numbers,100,location,c,1,mpi_integer,&
mpi_comm_world, ierr)
34. call mpi_unpack(numbers,100,location,d,1,mpi_integer,&
mpi_comm_world, ierr)
35. end if
36.! Each processor prints the numbers.
37. print*,’my_rank =’,my_rank, ’a = ’,a
38. print*,’my_rank =’,my_rank, ’b = ’,b
39. print*,’my_rank =’,my_rank, ’c = ’,c
40. print*,’my_rank =’,my_rank, ’d = ’,d
41. call mpi_finalize(ierr)
42. end program packmpi
!
my_rank = 0 a = 2.718281746
my_rank = 0 b = 3.141592741
© 2004 by Chapman & Hall/CRC