ifort: MKL function DSYEVR is not working

ifort: MKL function DSYEVR is not working

Hi, I am new using MKL and using a lapack subroutine, I get a run-time-error  related to incorrect parameter on entry to function.  I have compiled in these formsifort -L/opt/intel/composer_xe_2011_sp1.10.319/mkl/lib/intel64/lib/ -I/opt/intel/composer_xe_2011_sp1.10.319/mkl/include/intel64/ilp64/ -lmkl_intel_ilp64 -lmkl_intel_thread -lmkl_core -liomp5 -lpthread -lmkl_sequential -CB -openmp *.f90 -o x_exeand alsoifort -CB -openmp -c *.f90ifort -L/opt/intel/composer_xe_2011_sp1.10.319/mkl/lib/intel64/lib/libmkl_intel_lp64.a -I/opt/intel/composer_xe_2011_sp1.10.319/mkl/include/intel64/ilp64/ -lmkl_intel_ilp64 -lmkl_intel_thread -lmkl_core -liomp5 -lpthread -lmkl_sequential -CB -openmp *.o -o x_exeIn both cases I recieve the error MKL ERROR: Parameter 15 was incorrect on entry to DSYEVRforrtl: severe (174): SIGSEGV, segmentation fault occurredImage              PC                Routine            Line        Source             x_exe              000000000043765D  Unknown               Unknown  Unknownx_exe              0000000000436DFE  Unknown               Unknown  Unknownx_exe              000000000040BFD8  Unknown               Unknown  Unknownx_exe              0000000000406AA1  Unknown               Unknown  Unknownx_exe              0000000000405BCB  Unknown               Unknown  Unknownx_exe              0000000000403FAC  Unknown               Unknown  Unknownlibc.so.6          00007F4AF0805C4D  Unknown               Unknown  Unknownx_exe              0000000000403EA9  Unknown               Unknown  UnknownBut the parameter 15 is ldz which, as I found in MKL manual, should be integer. From MKL Manual>> ldz INTEGER. The leading dimension of the output array z.>> Constraints:>> ldz ≥ 1 if jobz = 'N';>> ldz < max(1, n) if jobz = 'V'. Subroutine where I call dsyevr:subroutine diag_from_lapack(n,a,f,novec)use nrtypeimplicit none integer, intent(in) :: n real(dp), intent(inout) :: a(n,n), f(n) logical, intent(in) :: novec integer :: lda, il, iu, ldz, lwork, iwork(1), liwork, m, isuppz(2*n), info real(dp) :: work(1), vl, vu, abstol, w(n), z(n,n) character :: jobz, range_eigval, uplo! Input Parameters jobz = 'V'; if(novec) jobz = 'N' range_eigval = 'A' uplo = 'U' !n = nmatrix !a = Hcopy(n,n) lda = n vl = 0.0d0 vu = 100.0d0 il = 1 iu = n abstol = 1.0d-8 ldz = n-1 !work(1) lwork = -1 !iwork(1) liwork = -1! Output Parameters !m !w(n) !eigenvalues !z(n,n) !eigenvectors !isuppz(2*n) call dsyevr(jobz,range_eigval,uplo,n,a,lda,vl,vu,il,iu,abstol,m,w,z,ldz,isuppz,work,lwork,iwork,liwork,info) ! ! write the eigenvectors on the input matrix and the eigenvalues on the forces array f(:) = w(:) a(:,:) = z(:,:)returnendcan anyone help me?

4 posts / novo 0
Último post
Para obter mais informações sobre otimizações de compiladores, consulte Aviso sobre otimizações.

Supposing that you are concerned about data types (a reasonable concern),
include 'mkl_lapack.fi'
or
use lapack
would enable the compiiler to check those.
You must also pay attention to values.  You have set leading dimension of z to n but you pass n-1 in ldz.  The reason for support of a variable is to accept a z array defined larger than necessary, which doesn't appear to be your case; the subroutine apparently sees that you gave it too small a value.
You could see the expected argument checks in the reference source.

Best Reply

1. yes, Tim is right :   ldz  == n2. please check how you link this example. You mixed lp64 and ILP64 interfaces - it is not correct3. you don't link threading and sequentianal libraries at the one linking lineplease check with Linking Adviser how to link your example properly. 

If you want a quick linking solution, using all lp64 and threaded library, -mkl should work with ifort.  As Gennady pointed out, any specific requirements should be as advised by Linking Advisor.

Deixar um comentário

Faça login para adicionar um comentário. Não é membro? Inscreva-se hoje mesmo!