[Ipopt] Maybe an error in the MKL version of the Pardiso interface?

Damien damien at khubla.com
Mon May 26 10:18:23 EDT 2014


Stefan,

I've been using Intel MKL for 7 years and never seen that 3-parameter 
initialisation call in the docs.  There are none so blind as those who 
will not see...

Your patch works, but you left a "d" off of the second define in:

"#if ! defined(HAVE_PARDISO_OLDINTERFACE) && ! define(HAVE_PARDISO_MKL)"

Cheers,

Damien

On 2014-05-26 4:08 AM, Stefan Vigerske wrote:
> Hi,
>
> There is a pardisoinit function in MKL Pardiso, but it takes only 3 
> arguments (as the old pardiso interface), not 6:
>   https://software.intel.com/en-us/node/470286
>
> So, can you try whether calling the pardisoinit function with 3 
> arguments works for you, too?
> This would be the patch:
>
> Index: IpPardisoSolverInterface.cpp
> ===================================================================
> --- IpPardisoSolverInterface.cpp    (revision 2485)
> +++ IpPardisoSolverInterface.cpp    (working copy)
> @@ -62,7 +62,7 @@
>  /* Prototypes for Pardiso's subroutines */
>  extern "C"
>  {
> -#ifdef HAVE_PARDISO_OLDINTERFACE
> +#if defined(HAVE_PARDISO_OLDINTERFACE) || defined(HAVE_PARDISO_MKL)
>    void PARDISOINIT_FUNC(void* PT, const ipfint* MTYPE, ipfint* IPARM);
>  #else
>    // The following is a fix to allow linking with Pardiso library 
> under Windows
> @@ -400,7 +400,7 @@
>      // Call Pardiso's initialization routine
>      IPARM_[0] = 0;  // Tell it to fill IPARM with default values(?)
>
> -#ifndef HAVE_PARDISO_OLDINTERFACE
> +#if ! defined(HAVE_PARDISO_OLDINTERFACE) && ! define(HAVE_PARDISO_MKL)
>      ipfint ERROR = 0;
>      ipfint SOLVER = 0; // initialize only direct solver
>
>
> Thanks,
> Stefan
>
>
> On 05/25/2014 09:52 PM, Damien wrote:
>> Hi Folks,
>>
>> I'm in the process of porting our Ipopt build over to Intel's MKL
>> Pardiso.  I started getting crashes because the PT_ and IPARM_ arrays
>> weren't being initialised.  I think there's an error in the code that
>> sets up the solver if it's the MKL version (in
>> IpPardisoSolverInterface.cpp)  There's a call to PARDISOINIT_FUNC around
>> lines 400 - 405, which is defined earlier in the file with the comment:
>>
>> // The following is a fix to allow linking with Pardiso library under
>> Windows
>>
>> In the Intel MKL version of PARDISO there isn't a 6-parameter PARDISO
>> call that's described in the docs.  It passes in the linker though, so
>> it must be exposed by the MKL library (possibly by mistake?). If you
>> call it though it takes out everything.  In the Intel version the
>> initialisation is just performed as part of the first PARDISO call
>> (typically PHASE = 11).
>>
>> This can be fixed by wrapping the the call to PARDISOINIT_FUNC in a
>> #ifdef HAVE_PARDISO_MKL check and initialising the PT_ and IPARM_ 
>> arrays:
>>
>>      // Call Pardiso's initialization routine
>>      IPARM_[0] = 0;  // Tell it to fill IPARM with default values(?)
>> #ifdef HAVE_PARDISO_MKL  //MKL check
>>      for (int i = 0; i < 64; i++)
>>      {
>>         IPARM_[i] = 0;
>>         PT_[i] = 0;
>>      }
>> #else
>> #ifndef HAVE_PARDISO_OLDINTERFACE
>>      ipfint ERROR = 0;
>>      ipfint SOLVER = 0; // initialize only direct solver
>>
>>      PARDISOINIT_FUNC(PT_, &MTYPE_, &SOLVER, IPARM_, DPARM_, &ERROR);
>> #else
>>      PARDISOINIT_FUNC(PT_, &MTYPE_, IPARM_);
>> #endif
>>
>> #endif  //end MKL check
>>
>> This runs happily on my machine in 32 and 64-bit.  Do you want this as a
>> patch (or have I messed something else up in the compile with defines,
>> and this shouldn't be necessary?)
>>
>> Cheers,
>>
>> Damien
>>
>>
>>
>>
>>
>>
>>
>>
>> _______________________________________________
>> Ipopt mailing list
>> Ipopt at list.coin-or.org
>> http://list.coin-or.org/mailman/listinfo/ipopt
>>
>



More information about the Ipopt mailing list