[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