Intel® oneAPI Math Kernel Library
Ask questions and share information with other developers who use Intel® Math Kernel Library.

different results between mkl_dcscmv and gemv

shaopeng_z_
Beginner
475 Views

In Intel® MKL mkl_dcscmv and gemv produce different result .

At first,I use the mkl_dcscmv to compute K*X=ANS ,where matrix K(2280,2280) converts to the sparse format CSC (COPPTR,ROWIND,VALUES or ROWIND,VALUES,pointer_B,pointer_E)  as follows:

program CSC_MATRIX_VECTOR
implicit none
integer::i,j
integer,parameter::nRows=2280

integer,parameter::nNonzero=25395

integer,allocatable::COPPTR(:),ROWIND(:),pointer_B(:),pointer_E(:)
double precision,allocatable::VALUES(:)
double precision,allocatable::X(:),ANS(:)
double precision::alpha,beta
character(6):: matdescra


allocate(COPPTR(nRows+1))
open(unit=10,file='COPPTR.txt')
read(10,*)COPPTR
close(10,status="keep")

allocate(ROWIND(nNonzero))
open(unit=10,file='ROWIND.txt')
read(10,*)ROWIND
close(10,status="keep")

allocate(VALUES(nNonzero))
open(unit=10,file='VALUES.txt')
read(10,*)VALUES
close(10,status="keep")

allocate(X(nRows))
allocate(ANS(nRows))

open(unit=10,file='X.txt')
read(10,*)X
close(10,status="keep")


alpha=1.0
beta=0.0
matdescra='SLNF'

allocate(pointer_B(nRows))
allocate(pointer_E(nRows))

do i=1,nRows
pointer_B(i)=COPPTR(i)
pointer_E(i)=COPPTR(i+1)
end do

call mkl_dcscmv('N', nRows, nRows, alpha, matdescra, VALUES, ROWIND, pointer_B,
pointer_E,X, beta, ANS)

open(unit=10,file='ANS.txt')
write(10,'(D24.16)')ANS
end

result::

ANS(CSC).txt

Secondly,I use gemv to compute K*X=ANS,as follows:

include 'blas.f90'
program FULL_MATRIX_VECTOR
use MKL95_BLAS
use f95_precision
implicit none
integer::i,j
integer,parameter::nRows=2280
double precision,allocatable::K(:,:),X(:),ANS(:)
double precision::alpha,beta

allocate(K(nRows,nRows))
open(unit=10,file='K.txt')
read(10,*)((K(i,j),j=1,nRows),i=1,nRows)
close(10,status="keep")

allocate(X(nRows))
open(unit=10,file='X.txt')
read(10,*)X
close(10,status="keep")

allocate(ANS(nRows))

alpha=1.0
beta=0.0

call gemv(K, X, ANS,alpha ,beta ,'N')

open(unit=10,file='ANS.txt')
write(10,'(D24.16)')ANS
end

the result is

ANS(full).txt

 Some elements in the results  are quite different,I don't understand why the mkl_dcscmv and gemv cannot produce the same accuracy.

Thanks for your help.

0 Kudos
3 Replies
mecej4
Honored Contributor III
475 Views
Some elements in the results are quite different,I don't understand why
The result vectors that you gave (ansfull.txt,anscsc.txt) have elements as large as 1.6 E4, but the largest difference between the two is 3.7 E-6. On what basis do you say that the results are "quite different"? How much precision do you have in the input matrix and vector, and is a variation of 3.7 E-6 between the two results quite reasonable in that perspective?
0 Kudos
shaopeng_z_
Beginner
475 Views
I have double precision ,15 or16 significant digits are accurate. I think the order of magnitude may be 1.0E-10 at least. Why the two methods(mkl_dcscmv and gemv) in the same MKL libary produce different results?
0 Kudos
mecej4
Honored Contributor III
475 Views
I have double precision ,15 or16 significant digits are accurate. I think the order of magnitude may be 1.0E-10 at least.
How did you come to this conclusion? Things may work out in that fashion for some matrices, and not so for others. You did not show the input file K.txt, which. presumably, contains the same coefficients as in the compressed matrix, augmented by zero elements. We have to establish that the two K matrices are mathematically identical before we compare the two results for K.x.
0 Kudos
Reply