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

Do I need Pardiso_64? iparm(18) reports negative value

rdees
Beginner
344 Views

I am attempting to solve a large complex, symmetric matrix using PARDISO.  The matrix has approximately 1,000,000 equations, and 91,000,000 non-zeros.  I suspect that during Pardiso's factorization stage, the number of non-zeroes in the factors exceed the 32-bit integer size limit (i.e. 2^31).  I suspect this because pardiso returns a very large negative number for iparm(18), after the factorization stage.

So ... here's the questions.

1) If the number of factors in L or U, needed during the factorization stage is greater than 2^31, am I REQUIRED ot use pardiso_64, set all the integers coming into pardiso to integer*32, and, recompiled with ILP64 libraries?

2) Pardiso solves this system of equations, and, gives answers that look reasonable.  Can I trust these answers, even though iparm(18) is reported as a negative number?

I am using MKL version 11.2 on a LINUX system.  I'm current linking with LP64 libraries, and, all my integers are integer*4

0 Kudos
2 Replies
Alexander_K_Intel2
344 Views

Hi,

You are correct - internal number of L factors exceed 2^31. As result when pardiso convert this number to small int you obtain negative number in iparm(18). However if pardiso doesn't report error on each phase then it passed correctly and there is not necessity to recompile code with different interface MKL library.

Thanks,

Alex

0 Kudos
rdees
Beginner
344 Views

Alex,

Thank you for your answer.  I have done a bit more homework.  I solved this system of equations using 3 phases.  After each phase, Pardiso returns no error message (i.e. ierror=0).  Because I set msglevel = 1, I am able to look at the number of required L and U factors.  In this printout, Pardiso tells me that it needed 2,925,015,045 factors. This value is larger than the 2^31 32-bit limit.  In order to address these factors properly, PARDISO would have needed to use an integer*8 variable.  I have defined all the integer variables going into Pardiso as integer*4, I have only linked with the LP64 libraries (not ILP64), and, I'm only calling pardiso, not pardiso_64.

Does Pardiso somehow, "know" that integer*8 addressing is needed, and, adjust it's integer declaration accordingly? 

The answers to my system of equeations look correct, and, I believe that the answer to my previous question, that you provided is correct; I'm just wondering how PARDISO was able to do it.

Bob

0 Kudos
Reply