Bugzilla – Bug 705
Incorrect Choleskly (LLT) return code when MKL is enabled
Last modified: 2015-06-05 14:00:44 UTC
When MKL is enabled, LLT returns the wrong error/success code. This appears to be due to misinterpretation of the return code of an internal function:
For both MKL and non-MKL mode, LLT_Traits::inplace_decomposition() returns the value llt_inplace<...>::blocked(m) == -1.
The non-MKL llt_inplace<...>::blocked returns -1 on success and another number >=0 (?) on failure.
However, the MKL llt_inplace<...>::blocked calls mkl_llt::potrf, which returns Success (0) and NumericalIssue (1).
I think the fix is that mkl_llt::potrf should instead return -1 on success and some other number on failure.
In my tests, changing the line "info = (info==0) ? Success : NumericalIssue;" to "info = (info==0) ? -1 : 1;" in the file Eigen/src/Cholesky/LLT_MKL.h fixes the problem. However, I'm not sure what the meaning of a failure return code is, so I'm not sure if 1 is the best value to return on error.
The return value seems to be the index where the decomposition failed. It looks as if this is ignored at the moment, so your fix should be ok.
I'm wondering, has anyone ever successfully ran the unit tests with MKL enabled?
We do use Eigen with MKL (good deal I think), and I confirm this bug.
I think the fix of richard is good.
Thanks for your work!
(llt_inplace::blocked also returns the first failing row/column)