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. Пример распараллеливания алгоритма суммирования ряда чисел