The code (which is available by clicking here) given below performs Elimination. Add HPF directives for execution on a 2D processor array.
Between the indicated points, give a line by line commentary on what communications will be performed? (In other words, explain what communications are implied by each line given the distribution directives that you have supplied.)
PROGRAM GAUSS_90
REAL, allocatable :: A(:,:), X(:), Y(:), START(:)
INTEGER :: i
character*10 time
REAL TEMP
REAL, allocatable :: SWAP(:)
INTEGER j, n, location, location_array(1)
print *, "Problem size = ? (>5)"
read (*,*) n
print *, "Problem size = ", n
call date_and_time(time=time)
print *, time, " ---- time to start the job"
allocate(a(n,n), x(n), y(n), start(n), swap(n))
A = 0.1
DO i=1,n
START(i) = i
A(1+MODULO(i+1,n),i) = i+5
ENDDO
Y = 0
DO i = 1, n
Y(i) = SUM( A(i,:)*START )
ENDDO
call date_and_time(time=time)
print *, time, " ---- problem has been set up"
!CALL GAUSS_ELIM_90( A, X, Y )
DO i = 1, n-1
! Between here >>
!-------------------------------------------------+
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 !
!-------------------------------------------------+
! << and here
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
call date_and_time(time=time)
print *, time, " ---- forward finished "
X(n) = Y(n) / A(n,n)
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
call date_and_time(time=time)
print *, time, " ---- problem has been solved"
DO i = 1, 5
WRITE(*,*) i, X(i)
ENDDO
DO i = n - 4, n
WRITE(*,*) i, X(i)
ENDDO
END PROGRAM GAUSS_90