1               PROGRAM EXAMPLE

2               INCLUDE 'mpif.h'

3               PARAMETER(NDIM=1500)

4               COMMON/main/ A(NDIM,NDIM)     

5               COMMON/first/ b(NDIM)     

6               REAL*8   A,b

7               INTEGER  my_id,np,ierr,comm

8               INTEGER  n

9               OPEN(UNIT=19,FILE='iter.dat',ACCESS='APPEND')

10              OPEN(UNIT=20,FILE='iter.rez')

11              CALL MPI_Init(ierr)

12              comm=MPI_COMM_WORLD

13              CALL MPI_Comm_rank(comm,my_id,ierr)

14              CALL MPI_Comm_size(comm,np,ierr)

15              IF (my_id.eq.0) THEN

16                Write (*,*) 'Process ',my_id,' of ',np

17                Write (19,*) 'Process ',my_id,' of ',np

18              END IF

19       2002   FORMAT('Dimension ','|','Iteration ','|',

20            *        'Time      ','|','EPS       ','|','MFLOPS')

21              DO n=100,1500,100

22                CALL matgen(n)

23                CALL iteration(n,np,my_id,comm)

24              END DO

25              CALL MPI_Finalize(ierr)

26              CLOSE(19)      

27              CLOSE(20)             

28              STOP

29              END

30              SUBROUTINE iteration(n,np,my_id,comm)

31              IMPLICIT REAL*8 (A-D)

32              INCLUDE 'mpif.h'

33              PARAMETER(NDIM=1500)

34              COMMON/BLK 10/ x(NDIM)

35              COMMON/BLK 11/ xn(NDIM)     

36              COMMON/BLK 12/ xn_temp(NDIM)     

37              COMMON/main/ A (NDIM,NDIM)     

38              COMMON/first/ b (NDIM)     

39              INTEGER  my_id,np,ierr,comm

40              INTEGER  n,i,j,k,iter,shag

41              REAL*8   A, b

42              REAL*8   x,xn,xn_temp

43              REAL*8   summa,e,eps,ar,epsmax,mflops

44              DOUBLE PRECISION t

45       2001   FORMAT(I10,'|',I10,'|',F10.5,'|',F10.8,'|',F10.6)

46              e=0.0000001d0

47              shag=n/np

48              DO i=1,n

49                ar=A(i,i)

50                b(i)=b(i)/ar

51                xn(i)=b(i)

52                xn_temp(i)=0

53              END DO

54              ii=shag*my_id

55              DO i=1,shag

56                ar=A(ii+i,ii+i)

57                DO j=1,n      

58                  A(ii+i,j)=-A(ii+i,j)/ar

59                END DO       

60                A(ii+i,ii+i)=1

61              END DO

62              t=MPI_Wtime()

63              iter=0

64       13     CONTINUE

65              iter=iter+1

66              DO i=1,shag

67                summa=b(ii+i)

68                DO j=1,ii+i-1

69                  summa=summa+xn(j)*A(ii+i,j)

70                END DO

71                DO j=ii+i+1,n

72                  summa=summa+xn(j)*A(ii+i,j)

73                END DO

74                x(i)=summa

75              END DO

76              CALL MPI_Allgather(x(1),shag,MPI_REAL8,xn(1),shag,

77            *      MPI_REAL8,comm,ierr)

78              eps=0        

79              DO i=1,shag

80                IF(DABS(xn(ii+i)-xn_temp(ii+i)).gt.eps) THEN

81                  eps=DABS(xn(ii+i)-xn_temp(ii+i))

82                END IF

83              END DO

84              DO i=1,n

85                xn_temp(i)=xn(i)

86              END DO

87              CALL MPI_Allreduce(eps,epsmax,1,MPI_REAL8,

88            *      MPI_MAX,comm,ierr)

89              IF (e.le.epsmax) GOTO 13

90              t=MPI_Wtime()-t

91              IF (my_id.eq.0) THEN

92                DO i=1,n

93                  write (20,*) 'x',i,'= ',xn(i)  

94                  b(i)=xn(i)     

95                END DO

96                mflops=(3*n*(n-1)*iter)/(t*1000000)

97                Write (*,2001) n,iter,t,epsmax,mflops

98                Write (19,2001) n,iter,t,epsmax,mflops

99              END IF

100         RETURN

101         END     

Рис. 59. Листинг программы, реализующей параллельный алгоритм