1 program EXAMPLE
2 include 'mpif.h'
3 double precision PI25DT
4 parameter (PI25DT = 3.141592653589793238462643d0)
5 double precision mypi, pi, h, sum, x, f, a
6 integer n, my_id, np, comm, i, rc
7 f(a) = 4.d0 / (1.d0 + a*a)
8 call MPI_INIT( ierr )
9 Comm=MPI_COMM_WORLD
10 call MPI_COMM_RANK(COMM, my_id, ierr )
11 call MPI_COMM_SIZE(COMM, np, ierr )
12 print *, "Process ", my_id, " of ", np, " is alive"
13 sizetype = 1
14 sumtype = 2
15 10 if ( my_id .eq. 0 ) then
16 write(6,98)
17 98 format('Enter the number of intervals: (0 quits)')
18 read(5,99) n
19 99 format(i10)
20 endif
21 call MPI_BCAST(n,1,MPI_INTEGER,0,COMM,ierr)
22 if ( n .le. 0 ) goto 30
23 h = 1.0d0/n
24 sum = 0.0d0
25 do i = my_id+1, n, np
26 x = h * (dble(i) - 0.5d0)
27 sum = sum + f(x)
28 end do
29 mypi = h * sum
30 call MPI_REDUCE(mypi,pi,1,MPI_DOUBLE_PRECISION,MPI_SUM,
31 * 0,COMM,ierr)
32 if (my_id .eq. 0) then
33 write(6, 97) pi, abs(pi - PI25DT)
34 97 format(' pi is approximately: ', F18.16,
35 * ' Error is: ', F18.16)
36 endif
37 goto 10
38 30 call MPI_FINALIZE(rc)
39 stop
40 end
Рис. 55. Пример распараллеливания алгоритма суммирования ряда чисел