added project

This commit is contained in:
ALEXks
2023-09-14 19:43:13 +03:00
parent d78c55e275
commit 59c56cc5c2
638 changed files with 352236 additions and 92 deletions

View File

@@ -0,0 +1,60 @@
PROGRAM GAUSF
PARAMETER ( N = 10 )
REAL A( N, N+1 ),X( N )
C section A(1:N,1:N) - matrix of coefficients "A"
C section A(1:N,N+1) - vector of free members "b"
CDVM$ DISTRIBUTE A ( BLOCK, *)
CDVM$ ALIGN X(I) WITH A(I,N+1)
PRINT *, '********** TEST_GAUSS **********'
CDVM$ PARALLEL (I) ON A(I,*)
DO 100 I=1,N
DO 100 J=1,N+1
IF (I .EQ. J) THEN
A(I,J)=2.0
ELSE
IF (J .EQ. N+1) THEN
A(I,J)=1.0
ELSE
A(I,J)=0.0
ENDIF
ENDIF
100 CONTINUE
C
C ELIMINATION
C
DO 1 I = 1, N-1
C the i-th row of array A will be buffered before
C execution of i-th iteration, and reference A(I,K)
C will be replaced with corresponding reference to buffer
CDVM$ PARALLEL ( J ) ON A( J, * ), REMOTE_ACCESS (A( I, :))
DO 5 J = I+1, N
DO 5 K = I+1, N+1
A( J, K ) = A( J, K ) - A( J, I ) * A( I, K ) / A( I, I )
5 CONTINUE
1 CONTINUE
X( N ) = A( N, N+1 ) / A( N, N )
C BACK SUBSTITUTION
C
DO 6 J = N-1, 1, -1
C the (j+1)-th elements of array X will be buffered before
C execution of j-th iteration, and reference X(J+1)
C will be replaced with reference to temporal variable
CDVM$ PARALLEL ( I ) ON A( I , * ), REMOTE_ACCESS ( X( J+1 ))
DO 7 I = 1, J
A( I, N+1 ) = A( I, N+1 ) - A( I,J+1)*X(J+1)
7 CONTINUE
X( J ) = A( J, N+1 ) / A( J, J)
6 CONTINUE
PRINT *, X
END

View File

@@ -0,0 +1,57 @@
PROGRAM GAUSGB
PARAMETER ( N = 10 ,N1 = N-3)
REAL A( N, N+1 ),X( N )
INTEGER GB(2)
C section A(1:N,1:N) - matrix of coefficients "A"
C section A(1:N,N+1) - vector of free members "b"
CDVM$ DISTRIBUTE A ( GEN_BLOCK(GB), *)
CDVM$ ALIGN X(I) WITH A(I,N+1)
DATA GB(1)/3/, GB(2)/N1/
PRINT *, '********** TEST_GAUSGB **********'
CDVM$ PARALLEL (I) ON A(I,*)
DO 100 I=1,N
DO 100 J=1,N+1
IF (I .EQ. J) THEN
A(I,J)=2.0
ELSE
IF (J .EQ. N+1) THEN
A(I,J)=1.0
ELSE
A(I,J)=0.0
ENDIF
ENDIF
100 CONTINUE
C
C ELIMINATION
C
DO 1 I = 1, N
C the i-th row of array A will be buffered before
C execution of i-th iteration, and reference A(I,K)
C will be replaced with corresponding reference to buffer
CDVM$ PARALLEL ( J ) ON A( J, * ), REMOTE_ACCESS (A( I, :))
DO 5 J = I+1, N
DO 5 K = I+1, N+1
A( J, K ) = A( J, K ) - A( J, I ) * A( I, K ) / A( I, I )
5 CONTINUE
1 CONTINUE
X( N ) = A( N, N+1 ) / A( N, N )
C BACK SUBSTITUTION
C
DO 6 J = N-1, 1, -1
C the (j+1)-th elements of array X will be buffered before
C execution of j-th iteration, and reference X(J+1)
C will be replaced with reference to temporal variable
CDVM$ PARALLEL ( I ) ON A( I , * ), REMOTE_ACCESS ( X( J+1 ))
DO 7 I = 1, J
A( I, N+1 ) = A( I, N+1 ) - A( I,J+1)*X(J+1)
7 CONTINUE
X( J ) = A( J, N+1 ) / A( J, J)
6 CONTINUE
PRINT *, X
END

View File

@@ -0,0 +1,45 @@
PROGRAM GAUSH
PARAMETER ( N = 10 )
REAL A( N, N+1 ),X( N )
C section A(1:N,1:N) - matrix of coefficients "A"
C section A(1:N,N+1) - vector of free members "b"
CHPF$ DISTRIBUTE A ( BLOCK, *)
CHPF$ ALIGN X(I) WITH A(I,N+1)
PRINT *, '********** TEST_GAUSSHPF *********'
CHPF$ INDEPENDENT
DO 100 I=1,N
DO 100 J=1,N+1
IF (I .EQ. J) THEN
A(I,J)=2.0
ELSE
IF (J .EQ. N+1) THEN
A(I,J)=1.0
ELSE
A(I,J)=0.0
ENDIF
ENDIF
100 CONTINUE
C
C ELIMINATION
C
DO 1 I = 1, N-1
CHPF$ INDEPENDENT
DO 5 J = I+1, N
DO 5 K = I+1, N+1
A( J, K ) = A( J, K ) - A( J, I ) * A( I, K ) / A( I, I )
5 CONTINUE
1 CONTINUE
X( N ) = A( N, N+1 ) / A( N, N )
C BACK SUBSTITUTION
C
DO 6 J = N-1, 1, -1
CHPF$ INDEPENDENT
DO 7 I = 1, J
A( I, N+1 ) = A( I, N+1 ) - A( I,J+1)*X(J+1)
7 CONTINUE
X( J ) = A( J, N+1 ) / A( J, J)
6 CONTINUE
PRINT *, X
END

View File

@@ -0,0 +1,53 @@
PROGRAM GAUSWH
PARAMETER ( N = 10 )
REAL A( N, N+1 ),X( N )
DOUBLE PRECISION WB(10)
C section A(1:N,1:N) - matrix of coefficients "A"
C section A(1:N,N+1) - vector of free members "b"
CDVM$ DISTRIBUTE A ( WGT_BLOCK(WB,10), *)
CDVM$ ALIGN X(I) WITH A(I,N+1)
DATA WB/10.,9.,8.,7.,6.,5.,4.,3.,2.,1./
CDVM$ PARALLEL (I) ON A(I,*)
DO 100 I=1,N
DO 100 J=1,N+1
IF (I .EQ. J) THEN
A(I,J)=2.0
ELSE
IF (J .EQ. N+1) THEN
A(I,J)=1.0
ELSE
A(I,J)=0.0
ENDIF
ENDIF
100 CONTINUE
C
C ELIMINATION
C
DO 1 I = 1, N-1
C the i-th row of array A will be buffered before
C execution of i-th iteration, and reference A(I,K)
C will be replaced with corresponding reference to buffer
CDVM$ PARALLEL ( J ) ON A( J, * ), REMOTE_ACCESS (A( I, :))
DO 5 J = I+1, N
DO 5 K = I+1, N+1
A( J, K ) = A( J, K ) - A( J, I ) * A( I, K ) / A( I, I )
5 CONTINUE
1 CONTINUE
X( N ) = A( N, N+1 ) / A( N, N )
C BACK SUBSTITUTION
C
DO 6 J = N-1, 1, -1
C the (j+1)-th elements of array X will be buffered before
C execution of j-th iteration, and reference X(J+1)
C will be replaced with reference to temporal variable
CDVM$ PARALLEL ( I ) ON A( I , * ), REMOTE_ACCESS ( X( J+1 ))
DO 7 I = 1, J
A( I, N+1 ) = A( I, N+1 ) - A( I,J+1)*X(J+1)
7 CONTINUE
X( J ) = A( J, N+1 ) / A( J, J)
6 CONTINUE
PRINT *, X
END

View File

@@ -0,0 +1,47 @@
PROGRAM JAC
PARAMETER (L=8, ITMAX=20)
REAL A(L,L), EPS, MAXEPS, B(L,L)
CDVM$ DISTRIBUTE ( BLOCK, BLOCK) :: A
CDVM$ ALIGN B(I,J) WITH A(I,J)
C arrays A and B with block distribution
PRINT *, '********** TEST_JACOBI **********'
MAXEPS = 0.5E - 7
CDVM$ PARALLEL (J,I) ON A(I, J)
C nest of two parallel loops, iteration (i,j) will be executed on
C processor, which is owner of element A(i,j)
DO 1 J = 1, L
DO 1 I = 1, L
A(I, J) = 0.
IF(I.EQ.1 .OR. J.EQ.1 .OR. I.EQ.L .OR. J.EQ.L) THEN
B(I, J) = 0.
ELSE
B(I, J) = ( 1. + I + J )
ENDIF
1 CONTINUE
DO 2 IT = 1, ITMAX
EPS = 0.
CDVM$ PARALLEL (J, I) ON A(I, J), REDUCTION ( MAX( EPS ))
C variable EPS is used for calculation of maximum value
DO 21 J = 2, L-1
DO 21 I = 2, L-1
EPS = MAX ( EPS, ABS( B( I, J) - A( I, J)))
A(I, J) = B(I, J)
21 CONTINUE
CDVM$ PARALLEL (J, I) ON B(I, J), SHADOW_RENEW (A)
C Copying shadow elements of array A from
C neighbouring processors before loop execution
DO 22 J = 2, L-1
DO 22 I = 2, L-1
B(I, J) = (A( I-1, J ) + A( I, J-1 ) + A( I+1, J)+
* A( I, J+1 )) / 4
22 CONTINUE
PRINT 200, IT, EPS
200 FORMAT(' IT = ',I4, ' EPS = ', E14.7)
IF ( EPS . LT . MAXEPS ) GO TO 3
2 CONTINUE
3 OPEN (3, FILE='JAC.DAT', FORM='FORMATTED', STATUS='UNKNOWN')
WRITE (3,*) B
CLOSE (3)
END

View File

@@ -0,0 +1,62 @@
PROGRAM JACAS
PARAMETER (K=8, ITMAX=20)
REAL A(K,K), EPS, MAXEPS, B(K,K)
CDVM$ DISTRIBUTE ( BLOCK, BLOCK) :: A
CDVM$ ALIGN B(I,J) WITH A(I,J)
CDVM$ REDUCTION_GROUP REPS
C arrays A and B with block distribution
PRINT *, '********** TEST_JACOBI_AS **********'
CDVM$ SHADOW_GROUP SA ( A )
C creation of descriptor for operations with imported/exported
C elements of array A
MAXEPS = 0.5E - 7
CDVM$ PARALLEL ( J, I) ON A( I, J)
C nest of parallel loops for initialization of arrays
DO 1 J = 1, K
DO 1 I = 1, K
A( I, J) = 0.
IF(I.EQ.1 .OR. J.EQ.1 .OR. I.EQ.K .OR. J.EQ.K) THEN
B(I, J) = 0.
ELSE
B(I, J) = ( 1. + I + J )
ENDIF
1 CONTINUE
DO 2 IT = 1, ITMAX
EPS = 0.
C descriptor of reduction operations is created
C and initial values of reduction variables are stored
CDVM$ PARALLEL ( J, I) ON A( I, J) , SHADOW_START SA,
CDVM$* REDUCTION(REPS:MAX(EPS))
C the loops iteration order is changed: at first
C exported (boundary) elements of A are calculated and sent
C then internal elements of array A are calculated
DO 21 J = 2, K-1
DO 21 I = 2, K-1
EPS = MAX ( EPS, ABS( B( I, J) - A( I, J)))
A( I, J) = B( I, J)
21 CONTINUE
CDVM$ REDUCTION_START REPS
C start of reduction operation to accumulate the partial results
C calculated in copies of variable EPS on every processor
CDVM$ PARALLEL ( J, I) ON B( I, J) , SHADOW_WAIT SA
C the loops iteration order is changed: at first
C internal elements of B are calculated, then imported elements
C of array A from neighboring processors are received,
C then boundary elements of array B are calculated
DO 22 J = 2, K-1
DO 22 I = 2, K-1
B(I, J) = (A( I-1, J ) + A( I, J-1 ) + A( I+1, J ) +
* A( I, J+1 ))/4
22 CONTINUE
CDVM$ REDUCTION_WAIT REPS
C awaiting completion of reduction operation
PRINT 200, IT, EPS
200 FORMAT(' IT = ',I4, ' EPS = ', E14.7)
IF ( EPS .LT. MAXEPS ) GO TO 3
2 CONTINUE
3 OPEN (3, FILE='JACAS.DAT', FORM='FORMATTED',STATUS='UNKNOWN')
WRITE (3,*) B
CLOSE (3)
END

View File

@@ -0,0 +1,44 @@
PROGRAM JACH
PARAMETER (L=8, ITMAX=20)
REAL A(L,L), B(L,L)
CHPF$ DISTRIBUTE ( BLOCK, BLOCK) :: A
CHPF$ ALIGN B(I,J) WITH A(I,J)
C arrays A and B with block distribution
PRINT *, '********** TEST_JACH **********'
C nest of two INDEPENDENT loops, iteration (i,j) will be executed on
C processor, which is owner of element A(i,j)
CHPF$ INDEPENDENT
DO 1 J = 1, L
CHPF$ INDEPENDENT
DO 1 I = 1, L
A(I, J) = 0.
IF(I.EQ.1 .OR. J.EQ.1 .OR. I.EQ.L .OR. J.EQ.L) THEN
B(I, J) = 0.
ELSE
B(I, J) = ( 1. + I + J )
ENDIF
1 CONTINUE
DO 2 IT = 1, ITMAX
CHPF$ INDEPENDENT
DO 21 J = 2, L-1
CHPF$ INDEPENDENT
DO 21 I = 2, L-1
A(I, J) = B(I, J)
21 CONTINUE
CHPF$ INDEPENDENT
DO 22 J = 2, L-1
CHPF$ INDEPENDENT
DO 22 I = 2, L-1
B(I, J) = (A( I-1, J ) + A( I, J-1 ) + A( I+1, J)+
* A( I, J+1 )) / 4
22 CONTINUE
PRINT 300, IT
300 FORMAT(' IT = ',I4)
2 CONTINUE
3 OPEN (3, FILE='JACH.DAT', FORM='FORMATTED', STATUS='UNKNOWN')
WRITE (3,*) B
CLOSE (3)
END

View File

@@ -0,0 +1,46 @@
PROGRAM REDBF
PARAMETER (N=10)
REAL A(N,N), EPS, MAXEXP, W
INTEGER ITMAX
CDVM$ DISTRIBUTE A(BLOCK, BLOCK)
PRINT *, '********** TEST_REDBLACK **********'
ITMAX = 20
MAXEXP = 0.5E - 5
W = 0.5
CDVM$ PARALLEL (J,I) ON A(I, J)
DO 1 J = 1,N
DO 1 I = 1,N
IF (I.EQ.J) THEN
A(I,J) = N+2
ELSE
A(I,J) = -1.
ENDIF
1 CONTINUE
DO 2 IT = 1, ITMAX
EPS = 0.
C loop for red and black variables
DO 3 IRB = 0,1
CDVM$ PARALLEL (J,I) ON A(I, J), NEW (S), REDUCTION (MAX(EPS)),
CDVM$* SHADOW_RENEW (A)
C variable S - private variable in loop iterations
C variable EPS is used for calculation of maximum value
C Exception : iteration space is not rectangular
DO 21 J = 2,N-1
DO 21 I = 2 + MOD(J+IRB,2), N-1, 2
S = A(I,J)
A(I,J) = (W/4) * (A(I-1,J) + A(I+1,J) + A(I,J-1) +
* A(I,J+1)) + (1-W) * A(I,J)
EPS = MAX (EPS, ABS(S - A(I,J)))
21 CONTINUE
3 CONTINUE
PRINT 200, IT, EPS
200 FORMAT(' IT = ',I4, ' EPS = ', E14.7)
IF (EPS.LT.MAXEXP) GO TO 4
2 CONTINUE
4 OPEN (3, FILE='REDBF.DAT', FORM='FORMATTED',STATUS='UNKNOWN')
WRITE (3,*) A
CLOSE (3)
END

View File

@@ -0,0 +1,53 @@
PROGRAM REDBH
PARAMETER (N1 = 20,N2 = 10)
REAL A(N1,N2),W
INTEGER ITMAX
!HPF$ DISTRIBUTE (BLOCK,BLOCK) :: A
ITMAX = 20
W = 0.5
!HPF$ INDEPENDENT
DO 1 J = 1,N2
!HPF$ INDEPENDENT
DO 1 I = 1,N1
IF (I.EQ.J) THEN
A(I,J) = N1+2
ELSE
A(I,J) = (-(1.))
ENDIF
1 CONTINUE
DO 2 IT = 1,ITMAX
!HPF$ INDEPENDENT
DO 21 J = 1,N2/2-1
!HPF$ INDEPENDENT
DO 21 I = 1,N1/2-1
A(2*I+1,2*J+1) = W/4*(A(2*I,2*J+1)+A(2*I+2,2*J+1)+
+ A(2*I+1,2*J)+A(2*I+1,2*J+2))+(1-W)*A(2*I+1,2*J+1)
21 CONTINUE
!HPF$ INDEPENDENT
DO 22 J = 1, N2/2-1
!HPF$ INDEPENDENT
DO 22 I = 1,N1/2-1
A(2*I,2*J) = W/4*(A(2*I-1,2*J)+A(2*I+1,2*J)+A(2*I,2*J-1)+
+ A(2*I,2*J+1))+(1-W)*A(2*I,2*J)
22 CONTINUE
!HPF$ INDEPENDENT
DO 23 J = 1,N2/2-1
!HPF$ INDEPENDENT
DO 23 I = 1,N1/2-1
A(2*I,2*J+1) = W/4*(A(2*I-1,2*J+1)+A(2*I+1,2*J+1)+
+ A(2*I,2*J)+A(2*I,2*J+2))+(1-W)*A(2*I,2*J+1)
23 CONTINUE
!HPF$ INDEPENDENT
DO 24 J = 1,N2/2-1
!HPF$ INDEPENDENT
DO 24 I = 1,N1/2-1
A(2*I+1,2*J) = W/4*(A(2*I,2*J)+A(2*I+2,2*J)+A(2*I+1,2*J-1)+
+ A(2*I+1,2*J+1))+(1-W)*A(2*I+1,2*J)
24 CONTINUE
PRINT *,'IT= ',IT
2 CONTINUE
OPEN (3, FILE='REDBH.DAT', FORM='FORMATTED',STATUS='UNKNOWN')
WRITE (3,*) A
CLOSE (3)
END

View File

@@ -0,0 +1,38 @@
PROGRAM SOR
PARAMETER ( N = 10 )
REAL A( N, N ), EPS, MAXEPS, W
INTEGER ITMAX
*DVM$ DISTRIBUTE A ( BLOCK, BLOCK )
PRINT *, '********** TEST_SOR **********'
ITMAX=20
MAXEPS = 0.5E - 5
W = 0.5
*DVM$ PARALLEL ( J, I ) ON A( I, J )
DO 1 J = 1, N
DO 1 I = 1, N
IF ( I .EQ.J) THEN
A( I, J ) = N + 2
ELSE
A( I, J ) = -1.0
ENDIF
1 CONTINUE
DO 2 IT = 1, ITMAX
EPS = 0.
*DVM$ PARALLEL ( J, I) ON A( I, J), NEW (S),
*DVM$* REDUCTION ( MAX( EPS )), ACROSS (A(1:1,1:1))
DO 21 J = 2, N-1
DO 21 I = 2, N-1
S = A( I, J )
A( I, J ) = (W / 4) * (A( I-1, J ) + A( I+1, J ) + A( I, J-1 ) +
* A( I, J+1 )) + ( 1-W ) * A( I, J)
EPS = MAX ( EPS, ABS( S - A( I, J )))
21 CONTINUE
PRINT 200, IT, EPS
200 FORMAT(' IT = ',I4, ' EPS = ', E14.7)
IF (EPS .LT. MAXEPS ) GO TO 4
2 CONTINUE
4 OPEN (3, FILE='SOR.DAT', FORM='FORMATTED',STATUS='UNKNOWN')
WRITE (3,*) A
CLOSE (3)
END

View File

@@ -0,0 +1,130 @@
PROGRAM TASK2J
PARAMETER (L=8, ITMAX=20)
REAL A(L,L), EPS,EPS1, MAXEPS, B(L,L),A1(L,L),B1(L,L)
INTEGER LP(2),HP(2)
CDVM$ PROCESSORS P(NUMBER_OF_PROCESSORS())
CDVM$ TASK MB( 2 )
CDVM$ ALIGN B1( I, J ) WITH A1( I, J )
CDVM$ ALIGN B ( I, J ) WITH A ( I, J )
CDVM$ DISTRIBUTE :: A, A1
PRINT *, '********** TEST_TASK2J ***********'
CALL DPT(LP,HP,2)
CDVM$ MAP MB( 1 ) ONTO P( LP( 1) : HP(1))
CDVM$ REDISTRIBUTE A ( *, BLOCK ) ONTO MB( 1 )
CDVM$ MAP MB( 2 ) ONTO P( LP(2) : HP(2) )
CDVM$ REDISTRIBUTE A1( *, BLOCK ) ONTO MB( 2 )
MAXEPS = 0.5E - 7
CDVM$ TASK_REGION MB
CDVM$ ON MB( 1 )
CDVM$ PARALLEL (J,I) ON A(I, J)
C nest of two parallel loops, iteration (i,j) will be executed on
C processor, which is owner of element A(i,j)
DO 1 J = 1, L
DO 1 I = 1, L
A(I, J) = 0.
IF(I.EQ.1 .OR. J.EQ.1 .OR. I.EQ.L .OR. J.EQ.L) THEN
B(I, J) = 0.
ELSE
B(I, J) = ( 1. + I + J )
ENDIF
1 CONTINUE
DO 2 IT = 1, ITMAX
EPS = 0.
CDVM$ PARALLEL (J, I) ON A(I, J), REDUCTION ( MAX( EPS ))
C variable EPS is used for calculation of maximum value
DO 21 J = 2, L-1
DO 21 I = 2, L-1
EPS = MAX ( EPS, ABS( B( I, J) - A( I, J)))
A(I, J) = B(I, J)
21 CONTINUE
CDVM$ PARALLEL (J, I) ON B(I, J), SHADOW_RENEW (A)
C Copying shadow elements of array A from
C neighbouring processors before loop execution
DO 22 J = 2, L-1
DO 22 I = 2, L-1
B(I, J) = (A( I-1, J ) + A( I, J-1 ) + A( I+1, J)+
* A( I, J+1 )) / 4
22 CONTINUE
IF ( EPS . LT . MAXEPS ) GO TO 3
2 CONTINUE
3 OPEN (1, FILE='JACOBI1.DAT',FORM='FORMATTED',STATUS='UNKNOWN')
WRITE (1,200) IT, EPS
200 FORMAT(' IT = ',I4, ' EPS = ', E14.7)
CLOSE (1)
CDVM$ END ON
CDVM$ ON MB( 2 )
CDVM$ PARALLEL (J,I) ON A1(I, J)
C nest of two parallel loops, iteration (i,j) will be executed on
C processor, which is owner of element A1(i,j)
DO 19 J = 1, L
DO 19 I = 1, L
A1(I, J) = 0.
IF(I.EQ.1 .OR. J.EQ.1 .OR. I.EQ.L .OR. J.EQ.L) THEN
B1(I, J) = 0.
ELSE
B1(I, J) = ( 1. + I + J )
ENDIF
19 CONTINUE
DO 29 IT = 1, ITMAX
EPS1 = 0.
CDVM$ PARALLEL (J, I) ON A1(I, J), REDUCTION ( MAX( EPS1 ))
C variable EPS1 is used for calculation of maximum value
DO 219 J = 2, L-1
DO 219 I = 2, L-1
EPS1 = MAX ( EPS1, ABS( B1( I, J) - A1( I, J)))
A1(I, J) = B1(I, J)
219 CONTINUE
CDVM$ PARALLEL (J, I) ON B1(I, J), SHADOW_RENEW (A1)
C Copying shadow elements of array A1 from
C neighbouring processors before loop execution
DO 229 J = 2, L-1
DO 229 I = 2, L-1
B1(I, J) = (A1( I-1, J ) + A1( I, J-1 ) + A1(I+1, J)+
* A1( I, J+1 )) / 4
229 CONTINUE
IF ( EPS1 . LT . MAXEPS ) GO TO 39
29 CONTINUE
39 OPEN (2, FILE='JACOBI2.DAT',FORM='FORMATTED',STATUS='UNKNOWN')
WRITE (2,200) IT, EPS1
CLOSE (2)
CDVM$ END ON
CDVM$ END TASK_REGION
PRINT *, ' B'
PRINT *, B
PRINT *, ' '
PRINT *, ' B1'
PRINT *, B1
END
SUBROUTINE DPT(LP,HP,NT)
C distributing processors for NT tasks (NT = 2)
INTEGER LP(2), HP(2)
NUMBER_OF_PROCESSORS() = 1
CDVM$ DEBUG 1 (D = 0)
NP = NUMBER_OF_PROCESSORS()
NTP = NP/NT
IF(NP.EQ.1) THEN
LP(1) = 1
HP(1) = 1
LP(2) = 1
HP(2) = 1
ELSE
LP(1) = 1
HP(1) = NTP
LP(2) = NTP+1
HP(2) = NP
END IF
CDVM$ ENDDEBUG 1
END

View File

@@ -0,0 +1,126 @@
PROGRAM TASKS
C rectangular grid is distributed on two blocks
C
C
PARAMETER (K=8, N1 = 4, ITMAX=20, N2 = K - N1 )
CDVM$ PROCESSORS P(NUMBER_OF_PROCESSORS( ))
REAL A1(N1+1,K), A2(N2+1,K), B1(N1+1,K), B2(N2+1,K)
INTEGER LP(2),HP(2)
CDVM$ TASK MB( 2 )
CDVM$ ALIGN B1( I, J ) WITH A1( I, J )
CDVM$ ALIGN B2( I, J ) WITH A2( I, J )
CDVM$ DISTRIBUTE :: A1, A2
CDVM$ REMOTE_GROUP BOUND
PRINT *, '********** TEST_TASKS **********'
CALL DPT(LP,HP,2)
CDVM$ MAP MB( 1 ) ONTO P( LP(1) : HP(1))
CDVM$ REDISTRIBUTE A1( *, BLOCK ) ONTO MB( 1 )
CDVM$ MAP MB( 2 ) ONTO P( LP(2) : HP(2))
CDVM$ REDISTRIBUTE A2( *, BLOCK ) ONTO MB( 2 )
C Initialization
CDVM$ PARALLEL ( J, I ) ON A1(I, J)
DO 10 J = 1, K
DO 10 I = 1, N1
IF(I.EQ.1 .OR. J.EQ.1 .OR. J.EQ.K) THEN
A1(I, J) = 0.
B1(I, J) = 0.
ELSE
B1(I, J) = 1. + I + J
A1(I, J) = B1(I, J)
ENDIF
10 CONTINUE
CDVM$ PARALLEL ( J, I ) ON A2(I, J)
DO 20 J = 1, K
DO 20 I = 2, N2+1
IF(I.EQ.N2+1 .OR. J.EQ.1 .OR. J.EQ.K) THEN
A2(I, J) = 0.
B2(I, J) = 0.
ELSE
B2(I, J) = 1. + (I+N1-1) + J
A2(I, J) = B2(I, J)
ENDIF
20 CONTINUE
DO 2 IT = 1, ITMAX
CDVM$ PREFETCH BOUND
C exchange bounds
CDVM$ PARALLEL ( J ) ON A1(N1+1, J),
CDVM$* REMOTE_ACCESS (BOUND : B2( 2, J ) )
DO 30 J = 1, K
30 A1(N1+1, J) = B2(2, J)
CDVM$ PARALLEL ( J ) ON A2( 1, J),
CDVM$* REMOTE_ACCESS (BOUND : B1( N1, J ) )
DO 40 J = 1, K
40 A2(1, J) = B1(N1, J)
CDVM$ TASK_REGION MB
CDVM$ ON MB( 1 )
CDVM$ PARALLEL ( J, I ) ON B1(I, J),
CDVM$* SHADOW_RENEW ( A1 )
DO 50 J = 2, K-1
DO 50 I = 2, N1
50 B1(I, J)=(A1(I-1, J) + A1(I,J-1) + A1(I+1,J) + A1(I,J+1))/4
CDVM$ PARALLEL ( J, I ) ON A1(I, J)
DO 60 J = 2, K-1
DO 60 I = 2, N1
60 A1(I, J) = B1( I, J )
CDVM$ END ON
CDVM$ ON MB( 2 )
CDVM$ PARALLEL ( J, I ) ON B2(I, J),
CDVM$* SHADOW_RENEW ( A2 )
DO 70 J = 2, K-1
DO 70 I = 2, N2
70 B2(I,J) = (A2(I-1,J) + A2(I,J-1) + A2(I+1,J) + A2(I,J+1))/4
CDVM$ PARALLEL ( J, I ) ON A2(I, J)
DO 80 J = 2, K-1
DO 80 I = 2, N2
80 A2(I, J) = B2( I, J )
CDVM$ END ON
CDVM$ END TASK_REGION
2 CONTINUE
PRINT *, 'A1'
PRINT *, A1
PRINT *, ' '
PRINT *, 'A2'
PRINT *, A2
END
SUBROUTINE DPT(LP,HP,NT)
C distributing processors for NT tasks (NT = 2)
INTEGER LP(2), HP(2)
NUMBER_OF_PROCESSORS() = 1
CDVM$ DEBUG 1 (D = 0)
NP = NUMBER_OF_PROCESSORS()
NTP = NP/NT
IF(NP.EQ.1) THEN
LP(1) = 1
HP(1) = 1
LP(2) = 1
HP(2) = 1
ELSE
LP(1) = 1
HP(1) = NTP
LP(2) = NTP+1
HP(2) = NP
END IF
CDVM$ ENDDEBUG 1
END

View File

@@ -0,0 +1,169 @@
PROGRAM TASKST
C rectangular grid is distributed on two blocks
C
C
PARAMETER (K=8, N1 = 4, ITMAX=20, N2 = K - N1 )
CDVM$ PROCESSORS P(NUMBER_OF_PROCESSORS( ))
REAL A1(N1+1,K), A2(N2+1,K), B1(N1+1,K), B2(N2+1,K)
REAL A(K,K), B(K,K)
INTEGER LP(2),HP(2)
CDVM$ TASK MB( 2 )
CDVM$ DISTRIBUTE A(*,BLOCK) ONTO P
CDVM$ ALIGN B( I, J ) WITH A( I, J )
CDVM$ ALIGN B1( I, J ) WITH A1( I, J )
CDVM$ ALIGN B2( I, J ) WITH A2( I, J )
CDVM$ DISTRIBUTE :: A1, A2
CDVM$ REMOTE_GROUP BOUND
PRINT *, '********** TEST_TASKS_T **********'
CALL DPT(LP,HP,2)
CDVM$ MAP MB( 1 ) ONTO P( LP(1) : HP(1) )
CDVM$ REDISTRIBUTE A1( *, BLOCK ) ONTO MB( 1 )
CDVM$ MAP MB( 2 ) ONTO P( LP(2) : HP(2) )
CDVM$ REDISTRIBUTE A2( *, BLOCK ) ONTO MB( 2 )
C Initialization
CDVM$ PARALLEL ( J, I ) ON A1(I, J)
DO 10 J = 1, K
DO 10 I = 1, N1
IF(I.EQ.1 .OR. J.EQ.1 .OR. J.EQ.K) THEN
A1(I, J) = 0.
B1(I, J) = 0.
ELSE
B1(I, J) = 1. + I + J
A1(I, J) = B1(I, J)
ENDIF
10 CONTINUE
CDVM$ PARALLEL ( J, I ) ON A2(I, J)
DO 20 J = 1, K
DO 20 I = 2, N2+1
IF(I.EQ.N2+1 .OR. J.EQ.1 .OR. J.EQ.K) THEN
A2(I, J) = 0.
B2(I, J) = 0.
ELSE
B2(I, J) = 1. + (I+N1-1) + J
A2(I, J) = B2(I, J)
ENDIF
20 CONTINUE
DO 2 IT = 1, ITMAX
CDVM$ PREFETCH BOUND
C exchange bounds
CDVM$ PARALLEL ( J ) ON A1(N1+1, J),
CDVM$* REMOTE_ACCESS (BOUND : B2( 2, J ) )
DO 30 J = 1, K
30 A1(N1+1, J) = B2(2, J)
CDVM$ PARALLEL ( J ) ON A2( 1, J),
CDVM$* REMOTE_ACCESS (BOUND : B1( N1, J ) )
DO 40 J = 1, K
40 A2(1, J) = B1(N1, J)
CDVM$ TASK_REGION MB
CDVM$ ON MB( 1 )
CDVM$ PARALLEL ( J, I ) ON B1(I, J),
CDVM$* SHADOW_RENEW ( A1 )
DO 50 J = 2, K-1
DO 50 I = 2, N1
50 B1(I, J)=(A1(I-1, J) + A1(I,J-1) + A1(I+1,J) + A1(I,J+1))/4
CDVM$ PARALLEL ( J, I ) ON A1(I, J)
DO 60 J = 2, K-1
DO 60 I = 2, N1
60 A1(I, J) = B1( I, J )
CDVM$ END ON
CDVM$ ON MB( 2 )
CDVM$ PARALLEL ( J, I ) ON B2(I, J),
CDVM$* SHADOW_RENEW ( A2 )
DO 70 J = 2, K-1
DO 70 I = 2, N2
70 B2(I,J) = (A2(I-1,J) + A2(I,J-1) + A2(I+1,J) + A2(I,J+1))/4
CDVM$ PARALLEL ( J, I ) ON A2(I, J)
DO 80 J = 2, K-1
DO 80 I = 2, N2
80 A2(I, J) = B2( I, J )
CDVM$ END ON
CDVM$ END TASK_REGION
2 CONTINUE
C 1-task JACOBI
CDVM$ PARALLEL (J,I) ON A(I, J)
C nest of two parallel loops, iteration (i,j) will be executed on
C processor, which is owner of element A(i,j)
DO 1 J = 1, K
DO 1 I = 1, K
A(I, J) = 0.
IF(I.EQ.1 .OR. J.EQ.1 .OR. I.EQ.K .OR. J.EQ.K) THEN
B(I, J) = 0.
ELSE
B(I, J) = ( 1. + I + J )
ENDIF
1 CONTINUE
DO 3 IT = 1, ITMAX
CDVM$ PARALLEL (J, I) ON A(I, J)
C variable EPS is used for calculation of maximum value
DO 21 J = 2, K-1
DO 21 I = 2, K-1
A(I, J) = B(I, J)
21 CONTINUE
CDVM$ PARALLEL (J, I) ON B(I, J), SHADOW_RENEW (A)
C Copying shadow elements of array A from
C neighbouring processors before loop execution
DO 22 J = 2, K-1
DO 22 I = 2, K-1
B(I, J) = (A( I-1, J ) + A( I, J-1 ) + A( I+1, J)+
* A( I, J+1 )) / 4
22 CONTINUE
3 CONTINUE
C compare 2-task JACOBI with 1-task JACOBI
CDVM$ PARALLEL (I,J) ON B1(I,J),REMOTE_ACCESS (B(I,J))
DO 11 I = 2,N1
DO 11 J = 2, K-1
IF(B1(I,J).NE.B(I,J)) THEN
PRINT *, 'error B1(',I,',',J,')'
STOP
ENDIF
11 CONTINUE
CDVM$ PARALLEL (I,J) ON B2(I,J),REMOTE_ACCESS (B(I+(N1-1),J))
DO 12 I = 2,N2
DO 12 J = 2, K-1
IF(B2(I,J).NE.B(I+(N1-1),J)) THEN
PRINT *, 'error B2(',I,',',J,')','B(',I+N1-1,',',J,')'
STOP
ENDIF
12 CONTINUE
PRINT *, '--- DONE ---'
END
SUBROUTINE DPT(LP,HP,NT)
C distributing processors for NT tasks (NT = 2)
INTEGER LP(2), HP(2)
NUMBER_OF_PROCESSORS() = 1
CDVM$ DEBUG 1 (D = 0)
NP = NUMBER_OF_PROCESSORS()
NTP = NP/NT
IF(NP.EQ.1) THEN
LP(1) = 1
HP(1) = 1
LP(2) = 1
HP(2) = 1
ELSE
LP(1) = 1
HP(1) = NTP
LP(2) = NTP+1
HP(2) = NP
END IF
CDVM$ ENDDEBUG 1
END