Next: Independent Loop
Up: Forall construct
Previous: Forall construct
10 marks
- 2 for changing first DO to INDEPENDENT FORALL
- 2 for changing second DO to INDEPENDENT FORALL
- 1 for not changing
DI i = 1,n-1 - 2 for changing 4th DO loop to INDEPENDENT FORALL
- 1+1+1 for not changing last 3 DO loops
PROGRAM GAUSS_90
REAL, allocatable :: A(:,:), X(:), Y(:), START(:)
INTEGER :: i
REAL TEMP
REAL, allocatable :: SWAP(:)
INTEGER j, n, location, location_array(1)
print *, "Problem size = ? (>5)"
read (*,*) n
print *, "Problem size = ", n
allocate(a(n,n), x(n), y(n), start(n), swap(n))
A = 0.1
!HPF$ INDEPENDENT
FORALL (i=1:n)
START(i) = i
A(1+MODULO(i+1,n),i) = i+5
END FORALL
!* Was:
!* DO i=1,n
!* START(i) = i
!* A(1+MODULO(i+1,n),i) = i+5
!* ENDDO
Y = 0
!HPF$ INDEPENDENT
FORALL (i=1:n) Y(i) = SUM( A(i,:)*START )
!* Was:
!* DO i = 1, n
!* Y(i) = SUM( A(i,:)*START )
!* ENDDO
!CALL GAUSS_ELIM_90( A, X, Y )
DO i = 1, n-1
location_array = MAXLOC( ABS(A(i:n,i)) ) !
location = location_array(1)+i-1 !
SWAP(i:n) = A(location,i:n) !
TEMP = Y(location) !
IF (location /= i) THEN !
A(location,i:n) = A(i,i:n) !
A(i,i:n) = SWAP(i:n) !
Y(location) = Y(i) !
Y(i) = TEMP !
END IF !
!HPF$ INDEPENDENT
FORALL (j=i+1:n)
A(j,i) = A(j, i) / swap(i)
A(j, i+1:n) = A(j, i+1:n ) - a(j, i) * SWAP(i+1:n)
Y(j) = Y(j) - a(j,i) * TEMP
END FORALL
!* DO j = i+1, n
!* A(j,i) = A(j, i) / swap(i)
!* A(j, i+1:n) = A(j, i+1:n ) - a(j, i) * SWAP(i+1:n)
!* Y(j) = Y(j) - a(j,i) * TEMP
!* ENDDO
ENDDO
X(n) = Y(n) / A(n,n)
!* Cannot change
DO i = n-1, 1, -1
Y(1:i) = Y(1:i) - X(i+1) * A(1:i, i+1)
X(i) = Y(i) / A(i,i)
ENDDO
!* Cannot change -> contains Output
DO i = 1, 5
WRITE(*,*) i, X(i)
ENDDO
!* Cannot change -> contains Output
DO i = n - 4, n
WRITE(*,*) i, X(i)
ENDDO
END PROGRAM GAUSS_90
Next: Independent Loop
Up: Forall construct
Previous: Forall construct
©University of Liverpool, 1997
Thu May 29 10:11:26 BST 1997Not for commercial use.