Dear All,
I am getting a generic error when I try to call the magma_dysgvd from a fortran code.
Here`s a snippet of my code:
! DSYGVD Example Program Text
! MAGMA INTERFACE
module magmafor
interface dsygvdmagma
subroutine dsygvdDev (ITYPE, JOBZ, UPLO, N, A, LDA, B, LDB, W, WORK, &
LWORK,IWORK, LIWORK, INFO) bind (c, name = ‘magma_dsygvd’)
use iso_c_binding
integer(c_int), value :: ITYPE, N, LDA, LDB, LWORK, LIWORK, INFO
character(kind = c_char), value :: JOBZ, UPLO
double precision(c_double), device, allocatable :: A(:,:), B(:,:), W(:), WORK(:)
! double precision(c_double), device, dimension (:) :: W(N), WORK(LWORK)
integer(c_int), device, ALLOCATABLE :: IWORK(:)
end subroutine dsygvdDev
end interface
end module magmafor
program main
use magmafor
INTEGER NIN, NOUT
PARAMETER (NIN=5,NOUT=6)
INTEGER NB, NMAX
PARAMETER (NB=64,NMAX=10)
INTEGER LDA, LDB, LIWORK, LWORK, error
PARAMETER (LDA=NMAX,LDB=NMAX,LIWORK=3+5NMAX,&
LWORK=1+(6+2NMAX)*NMAX)
DOUBLE PRECISION, allocatable :: A(:,:), B(:,:), &
W(:), WORK(:)
double precision, device, allocatable :: dA(:,:), dB(:,:), &
dW(:), dWORK(:)
INTEGER IWORK(LIWORK)
integer, device, allocatable :: dIWORK(:)
WRITE (NOUT,) ‘DSYGVD Example Program Results’
WRITE (NOUT,)
! Skip heading in data file
READ (NIN,)
READ (NIN,) N
IF (N.LE.NMAX) THEN
!
allocate (A(LDA,NMAX),B(LDA,NMAX), W(NMAX), WORK(LWORK), stat=error)
if(stat1.ne.0) then
print*,‘error: couldn`t alloc memory’
end if
! Read the upper triangular parts of the matrices A and B
READ (NIN,) ((A(I,J),J=I,N),I=1,N)
READ (NIN,) ((B(I,J),J=I,N),I=1,N)
allocate (dA(LDA,NMAX), dB(LDA,NMAX), dW(NMAX), dWORK(LWORK))
allocate (dIWORK(LIWROK))
dA = A
dB = B
dW = W
dWORK = WORK
! Magma call
call dsygvdmagma(1,‘V’,‘U’,N,dA,LDA,dB,dW,dWORK,LWORK,dIWORK,LIWORK,INFO)
!
! Solve the generalized symmetric eigenvalue problem
! ABx = lambdax (ITYPE = 2)
!
! CALL DSYGVD(2,‘Vectors’,‘Upper’,N,A,LDA,B,LDB,W,WORK,LWORK, &
! IWORK,LIWORK,INFO)
LWOPT = WORK(1)
LIWOPT = IWORK(1)
IF (INFO.EQ.0) THEN
!
W = dW
A = dA
! Print solution
!
WRITE (NOUT,) ‘Eigenvalues’
WRITE (NOUT,99999) (W(J),J=1,N)
WRITE (NOUT,*) ‘Eigenvectors’
WRITE (NOUT,99999) ((A(I,J),J=1,N),I=1,N)
END IF
! Print workspace information
!
IF (LWORK.LT.LWOPT) THEN
WRITE (NOUT,)
WRITE (NOUT,99995) 'Optimum workspace required = ', LWOPT, &
'Workspace provided = ', LWORK
END IF
IF (LIWORK.LT.LIWOPT) THEN
WRITE (NOUT,)
WRITE (NOUT,99995) 'Integer workspace required = ', LIWOPT, &
'Integer workspace provided = ', LIWORK
END IF
ELSE
WRITE (NOUT,*) ‘NMAX too small’
END IF
!
99999 FORMAT (3X,(6F11.4))
99998 FORMAT (4X,1P,6E11.1)
99997 FORMAT (1X,A,I4,A)
99996 FORMAT (1X,A,I4)
99995 FORMAT (1X,A,I5,/1X,A,I5)
deallocate(A)
deallocate(B)
deallocate(W,WORK)
deallocate(dA)
deallocate(dB)
deallocate(dW)
deallocate(dWORK)
deallocate(dIWORK)
end program
I compiled with:
dsygvdmagma: dsygvdmagma.f90
pgf90 -Mcuda -c $<
pgf90 -Mcuda -o $@ $@.o -L/sw/keeneland/magma/1.1/centos5.5_gnu4.4/magma_1.1.0/lib -R/sw/keeneland/magma/1.1/centos5.5_gnu4.4/magma_1.1.0/lib -lmagma -lmagmablas -lmagma -lcublas -llapack -lblas -lm
I am following the methodology given in this article: