- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi,
I am trying to convert a complex(8) dense matrix into csr sparse format using MKL specific routines. Anyhow, I encountered a problem I was able to isolate in the code attached below:
M.
I am trying to convert a complex(8) dense matrix into csr sparse format using MKL specific routines. Anyhow, I encountered a problem I was able to isolate in the code attached below:
[fortran]program dns2csr complex(8), allocatable :: Aall(:,:) integer, allocatable :: ia (:) integer, allocatable :: ja (:) complex(8), allocatable :: zval(:) real(8), allocatable :: dval(:) ! Variables needed by MKL integer :: job(1:8) integer :: info integer, parameter :: nrow = 3 integer, parameter :: ncol = 3 ! Allocate workspace allocate(Aall(1:3,1:3)) allocate(ia (1:nrow+1)) ! Initialize dns matrix Aall = cmplx(0.0d0,0.0d0) Aall(1,1) = cmplx(1.0d0,0.0d0) Aall(3,1) = cmplx(5.0d0,0.0d0) Aall(2,2) = cmplx(4.0d0,0.0d0) Aall(3,2) = cmplx(0.0d0,4.0d0) Aall(1,3) = cmplx(3.0d0,0.0d0) ! Set job job(1) = 0 ! Convert from dense to CSR format job(2) = 1 ! One-based indexing for dense job(3) = 1 ! One-based indexing for CSR job(4) = 2 ! Pass the whole dense matrix to MKL routines ! Compute ia only job(5) = 0 ! Max number of nnz job(6) = 0 ! Construct ia only allocate(ja(1),zval(1),dval(1)) call mkl_zdnscsr(job,nrow,ncol,Aall,nrow,zval,ja,ia,info) print *,ia print *,info call mkl_ddnscsr(job,nrow,ncol,real(Aall),nrow,dval,ja,ia,info) print *,ia print *,info deallocate(ia,ja,dval,zval) deallocate(Aall) end program dns2csr[/fortran]I compile this program with the command:
[bash]ifort -O0 -warn all dns2csr.f90 -lmkl_intel -lmkl_sequential -lmkl_core[/bash]Then running a.out I get the following output:
[bash]$ ./a.out 1 1 1 1 0 1 3 4 5 3 [/bash]While the correct one should have been:
[bash]$ ./a.out 1 3 4 6 3 1 3 4 5 3 [/bash]It seems that conversion from dense format to csr format works properly only with real(8) type. I wonder if the routine mkl_zdnscsr is somehow buggy or if I am doing some trivial error I am not able to spot. Is anyone able to reproduce the same behavior?
M.
1 Solution
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi Massimiliano,
Thank you for reporting this issue. The subroutine works correctly if you set both imaginary and real parts of a complex number to non-zero. It seems like the component that checks whether an entry is nonzero or not is in error. We will fix this as soon as possible.
-- Efe
Thank you for reporting this issue. The subroutine works correctly if you set both imaginary and real parts of a complex number to non-zero. It seems like the component that checks whether an entry is nonzero or not is in error. We will fix this as soon as possible.
-- Efe
Link Copied
8 Replies
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi,
According to MKL Reference Manual
but
According to MKL Reference Manual
mkl_?dnscsr
Convert a sparse matrix in dense representation to the CSR format and vice versa.
but
COMPLEX for mkl_cdnscsr
DOUBLE COMPLEX for mkl_zdnscsr
INTERFACE is as follows:
SUBROUTINE mkl_zdnscsr(job, m, n, adns, lda, acsr, ja, ia, info)
INTEGER job(8)
INTEGER m, n, lda, info
INTEGER ja(*), ia(m+1)
DOUBLE COMPLEX adns(*), acsr(*)
However, in your example complex(8) and real(8)are used for mkl_zdnscsr function.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi Victor,
and many thanks for your reply!
Nonetheless I think you misunderstood my post a little. I used complex(8) (syntax equivalent to a complex*16 declaration, at least on my machine) in the calling mkl_zdnscsr, while real(8) (syntax equivalent to a real*8 declaration, at least on my machine) was used in the calling to mkl_ddnscsr.
My point was to say that the same piece of code works if I am using double precision matrix, while it is not if I am using double complex matrix. Of course when I work with complex(8)/real(8) I call the z/d version of mkl_Xdnscsr.
Any suggestion on what to do? Are you able to reproduce this problem?
Many thanks again,
Massimiliano
and many thanks for your reply!
Nonetheless I think you misunderstood my post a little. I used complex(8) (syntax equivalent to a complex*16 declaration, at least on my machine) in the calling mkl_zdnscsr, while real(8) (syntax equivalent to a real*8 declaration, at least on my machine) was used in the calling to mkl_ddnscsr.
My point was to say that the same piece of code works if I am using double precision matrix, while it is not if I am using double complex matrix. Of course when I work with complex(8)/real(8) I call the z/d version of mkl_Xdnscsr.
Any suggestion on what to do? Are you able to reproduce this problem?
Many thanks again,
Massimiliano
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Massimiliano,
yes, it looks like the bug. Please let us the time we will investigate and back to you shortly.
--Gennady
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi Massimiliano,
Thank you for reporting this issue. The subroutine works correctly if you set both imaginary and real parts of a complex number to non-zero. It seems like the component that checks whether an entry is nonzero or not is in error. We will fix this as soon as possible.
-- Efe
Thank you for reporting this issue. The subroutine works correctly if you set both imaginary and real parts of a complex number to non-zero. It seems like the component that checks whether an entry is nonzero or not is in error. We will fix this as soon as possible.
-- Efe
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi,
many thanks for the quick response! I'll look forward to the fixed version (and will use other means to convert the complex matrix in the meanwhile :-) )
Massimiliano
many thanks for the quick response! I'll look forward to the fixed version (and will use other means to convert the complex matrix in the meanwhile :-) )
Massimiliano
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
HiMassimiliano, thanks for the problem you raised.This issue has been submitted to our internal development tracking database for further investigation, we will inform you once a new update becomes available.
Here is a bug tracking number for your reference: 200209064.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Massimiliano,
could you please check how it works with the latest 10.3 update 4 which was released yesterday and let us know if you will see the same behavior?
--Gennady
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I have just tried MKL 10.3 Update 4.
The output now is:
Massimiliano
The output now is:
[bash]1 3 4 6 0 1 3 4 5 0 [/bash]which I think is fine. Many thanks for updating me on the issue!
Massimiliano
Reply
Topic Options
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page