Hi, all:
The following code was compiled and excuting successfully while using the Win32 configuration. However, an error occurred while using the x64 configuration. The error message is “error F0000 : Internal compiler error. pgnvd job exited with nonzero status code 0”. The OS is Win 7 and the PVF version is 10.9. Did I do something wrong ?
MODULE TEST
use cudafor
use cudadevice
contains
ATTRIBUTES (GLOBAL) SUBROUTINE SUB(N, D_MA )
IMPLICIT NONE
INTEGER, VALUE :: N
!INTEGER, DEVICE :: N !<--- HOST MUST HAVE A VARIABLE DECLARED THAT WAY TOO!!
REAL*8,DEVICE:: D_MA(N,N)
CALL D_DSWAP(N, D_MA(:,5),1, D_MA(:,N-10),1)
END SUBROUTINE SUB
!
ATTRIBUTES (DEVICE) SUBROUTINE D_DSWAP(N,DX,INCX,DY,INCY)
IMPLICIT NONE
INTEGER,VALUE::N
INTEGER,VALUE:: INCX,INCY
REAL*8,DEVICE:: DX(*),DY(*)
! .. Local Scalars ..
REAL*8,DEVICE:: DTEMP
INTEGER,DEVICE:: I,IX,IY,M,MP1
! ..
! .. Intrinsic Functions ..
INTRINSIC MOD
IF (INCX.EQ.1 .AND. INCY.EQ.1) THEN
! code for both increments equal to 1
! clean-up loop
!
M = MOD(N,3)
IF (M.NE.0) THEN
DO I = 1,M
DTEMP = DX(I)
DX(I) = DY(I)
DY(I) = DTEMP
END DO
IF (N.LT.3) RETURN
END IF
MP1 = M + 1
DO I = MP1,N,3
DTEMP = DX(I)
DX(I) = DY(I)
DY(I) = DTEMP
DTEMP = DX(I+1)
DX(I+1) = DY(I+1)
DY(I+1) = DTEMP
DTEMP = DX(I+2)
DX(I+2) = DY(I+2)
DY(I+2) = DTEMP
END DO
ELSE
!
! code for unequal increments or equal increments not equal
! to 1
!
IX = 1
IY = 1
IF (INCX.LT.0) IX = (-N+1)*INCX + 1
IF (INCY.LT.0) IY = (-N+1)*INCY + 1
DO I = 1,N
DTEMP = DX(IX)
DX(IX) = DY(IY)
DY(IY) = DTEMP
IX = IX + INCX
IY = IY + INCY
END DO
END IF
END SUBROUTINE D_DSWAP
END MODULE TEST
!----------------------------------------------------------------------------
SUBROUTINE DSWAP(N,DX,INCX,DY,INCY)
INTEGER INCX,INCY,N
DOUBLE PRECISION DX(*),DY(*)
! .. Local Scalars ..
DOUBLE PRECISION DTEMP
INTEGER I,IX,IY,M,MP1
! ..
! .. Intrinsic Functions ..
INTRINSIC MOD
! ..
IF (N.LE.0) RETURN
IF (INCX.EQ.1 .AND. INCY.EQ.1) THEN
! code for both increments equal to 1
! clean-up loop
!
M = MOD(N,3)
IF (M.NE.0) THEN
DO I = 1,M
DTEMP = DX(I)
DX(I) = DY(I)
DY(I) = DTEMP
END DO
IF (N.LT.3) RETURN
END IF
MP1 = M + 1
DO I = MP1,N,3
DTEMP = DX(I)
DX(I) = DY(I)
DY(I) = DTEMP
DTEMP = DX(I+1)
DX(I+1) = DY(I+1)
DY(I+1) = DTEMP
DTEMP = DX(I+2)
DX(I+2) = DY(I+2)
DY(I+2) = DTEMP
END DO
ELSE
!
! code for unequal increments or equal increments not equal
! to 1
!
IX = 1
IY = 1
IF (INCX.LT.0) IX = (-N+1)*INCX + 1
IF (INCY.LT.0) IY = (-N+1)*INCY + 1
DO I = 1,N
DTEMP = DX(IX)
DX(IX) = DY(IY)
DY(IY) = DTEMP
IX = IX + INCX
IY = IY + INCY
END DO
END IF
RETURN
END SUBROUTINE DSWAP
!
! ConsoleApp.f90
!
! Fortran Console Application
! Generated by PGI Visual Fortran(R)
! 4/20/2012 9:03:43 PM
!
program prog
use test
implicit none
integer::i,r,N
INTEGER,DEVICE::D_N
real*8, ALLOCATABLE :: MA(:,:), MB(:,:)
real*8, DEVICE, allocatable :: D_MA(:,:)
N=9200
D_N=N
ALLOCATE(MA(N,N), MB(N,N))
do i=1, N
MA(:,i)=dble(i)
end do
print*, "MA(:,5)= ", MA(1,5)
print*, "MA(:,N-10)= ", MA(1,N-10)
ALLOCATE(D_MA(N,N))
D_MA=MA
CALL SUB<<<1>>>(N, D_MA)
MB=D_MA
print*, "MB(:,5)= ", MB(1,5)
print*, "MB(:,N-10)= ", MB(1,N-10)
DEALLOCATE(D_MA)
call DSWAP(N,MA(:,5),1,MA(:,N-10),1)
print*, "MA(:,5)= ", MA(1,5)
print*, "MA(:,N-10)= ", MA(1,N-10)
DEALLOCATE(MA,MB)
end program prog