Hi,
OpenACC array syntax such as A = B + C as shown below does not give correct results, instead I have to use
A(:,:) = B(:,:) + C(:,:) to get correct results. Why is that ?
I also have other issues with fortran arrays in which a seeminly innocent operation to split a block of matrix operations into two kernels gives different results …
program test
IMPLICIT NONE
INTEGER, PARAMETER :: fp = SELECTED_REAL_KIND(6)
INTEGER, PARAMETER :: MAX_N_ANGLES = 128
REAL(fp), ALLOCATABLE, DIMENSION(:,:) :: A, B, C
INTEGER :: k
ALLOCATE(A(MAX_N_ANGLES,MAX_N_ANGLES), &
B(MAX_N_ANGLES,MAX_N_ANGLES), &
C(MAX_N_ANGLES,MAX_N_ANGLES))
CALL RANDOM_NUMBER(A)
CALL RANDOM_NUMBER(B)
CALL RANDOM_NUMBER(C)
!$acc enter data copyin(A,B,C)
!$acc kernels present(A,B,C)
CALL myMATMUL(A,B,C)
A = B + C
!A(:,:) = B(:,:) + C(:,:)
!$acc end kernels
!$acc update self(A,B,C)
print*, A(1:12,1)
print*, B(1:12,1)
print*, C(1:12,1)
CONTAINS
SUBROUTINE myMATMUL(A, B, C)
!$acc routine gang
REAL(fp), INTENT(IN), DIMENSION(1:MAX_N_ANGLES,1:MAX_N_ANGLES) :: A, B
REAL(fp), INTENT(OUT), DIMENSION(1:MAX_N_ANGLES,1:MAX_N_ANGLES) :: C
REAL(fp) :: acc
INTEGER :: I, J, K
!$acc loop collapse(2)
DO I = 1, MAX_N_ANGLES
DO J = 1, MAX_N_ANGLES
acc = 0
!$acc loop seq
DO K = 1, MAX_N_ANGLES
acc = acc + A(I,K) * B(K,J)
END DO
C(I,J) = acc
END DO
END DO
END SUBROUTINE myMATMUL
end program test