LAPACKE_dsyevd

LAPACKE_dsyevd()がメモリが足りないと怒る。ググっても情報がない。なぜだろうか。LAPACKE_dsyevd_work()を叩いてみるか。

LAPACKE_dsyevd()のコードを見てみると、lworklapack_int型になってるけど、これは実質int型(lapacke.hのなかで、#define lapack_int intとなっている)。つまり、現行のx86-64システムだと32bitのsigned integerだから、lworkがあまりに大きいとoverflowする。

これを踏まえて、lworkをlong型にしLAPACKE_dsyevd()を真似てLAPACKE_dsyevd_work()を直接呼んでみたら、期待通り動いた。安全かどうかわからないけれど。

以上はOpenBLASでの話。MKL2015ではコケた。

Intel MKL ERROR: Parameter 8 was incorrect on entry to DSTEDC.
Intel MKL ERROR: Parameter 12 was incorrect on entry to DORMTR.

バグかな。最新版を試す必要がありそう。