blas error and crash when doing ldivide/rdivide of a scalar by a vector
John W. Eaton
jwe at bevo.che.wisc.edu
Sun Jan 13 11:52:50 CST 2008
On 13-Jan-2008, Ben Abbott wrote:
| Looking over code at Netlib, http://www.netlib.org/lapack/double/dgelsd.f
| , the 10th parameter is RANK, which is an output.
The error is in parameter 10 of DGEBRD, not DGELSD.
| If I shrink lwork to 1000, then I get a similar (unrelated) error,
| referring to "lwork". This appears to confirm that lapack is
| complaining about "rank".
|
| Parameter 12 to routine DGELSD was incorrect
| Mac OS BLAS parameter error in DGELSD, parameter #0, (unavailable), is 0
It complains about that because it thinks LWORK is too small.
| I've also tried g95, which gave the same result.
It's a bug in Lapack, not the compiler.
| Can someone familiar with how Octave does its calculation comment on
| what this may indicate?
I took your example program and simplified it to be just:
program test
integer lwork, lda, ldb
parameter (lwork = 10000, liwork = 11, m = 1, n = 750)
integer m, n, nrhs, rank, iwork(liwork), info
double precision s, a(m,n), b(n), rcond, work(lwork)
integer j
nrhs = 1
do j = 1, n
a(1,j) = 1.0
enddo
b(1) = 1.0
call dgelsd (m, n, nrhs, a, m, b, n, s, rcond, rank,
$ work, -1, iwork, info)
print *, 'requested work size: ', work(1)
call dgelsd (m, n, nrhs, a, m, b, n, s, rcond, rank,
$ work, lwork, iwork, info)
end
In Octave, we use a call with lwork = -1 to get DGELSD to tell us what
work size to use, then we allocate space for WORK, then call DGELSD to
do the real work. When I run the program above liked to ATLAS on my
system, it says
$ g77 foo.f -llapack
$ ./a.out
117.
** On entry to DGEBRD parameter number 10 had an illegal value
so apparently it thinks WORK should be 117 elements. But using that
value (by changing lwork to be 117 in the PARAMETER statement) causes
the
** On entry to DGEBRD parameter number 10 had an illegal value
error.
Linking this program with the reference LAPACK code that is
distributed with Octave gives a different result for the expected work
size:
$ g77 *.f -lblas
$ ./a.out
741.
However, using that value in the PARAMETER statement results in this
error:
** On entry to DGELSD parameter number 12 had an illegal value
It seems odd to me that DGELSD won't accept the value of LWORK that it
requests. I have not tried debugging this any further to see
precisely what is going on.
We can't just use a "big" value for LWORK in Octave, since the
required size is problem dependent. We need to compute the necessary
size. There is a formula in the comments in dgelsd.f, but it is
somewhat complex, so we use the query method.
Since Octave seems to be calling DGELSD correctly to get the work
array size, but the returned value seems wrong, then I think the bug
is in LAPACK and should be fixed there.
It might also be good to check for the same bug in ZGELSD.
jwe
More information about the Bug-octave
mailing list