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. Листинг программы, реализующей параллельный алгоритм