我正在尝试使用Octave和Julia来解决具有大方形系统矩阵的随机线性系统。因为Octave和Julia的语法非常相似,所以我在Octave shell和Julia shell中运行以下代码:
N = 5000;
A = rand(N, N);
b = rand(N, 1);
x = A\b;
r = norm(A*x - b)/norm(b)
Octave在1e-12附近返回r。另一方面,Julia返回错误:
ERROR: stack overflow
in getrf! at linalg/lapack.jl:342
in LU at linalg/factorization.jl:134
in \ at linalg/dense.jl:518
反斜杠操作符在Julia中适用于较小的系统(例如10 x 10),但50 x 50系统已经出错。据我所知,Octave和Julia都使用BLAS和LAPACK,所以我很困惑为什么Julia无法执行这项任务。有人可以告诉我如何解决这个问题吗?
系统信息
修改
现在OpenBLAS 0.2.7已经解决了问题。重新编译Julia时,请确保Julia使用系统版本的OpenBLAS> = 0.2.7,或者Julia内部编译自己的OpenBLAS版本> = 0.2.7。
答案 0 :(得分:4)
正如我在问题(https://github.com/JuliaLang/julia/issues/3630)中提到的,这很可能与https://github.com/xianyi/OpenBLAS/issues/221中讨论的openblas线程错误相同。
openblas develop分支上有一个暂定的修复,它设置了更大的堆栈大小。
目前,请blas_set_num_threads(1)
。
答案 1 :(得分:1)
现在新版本的OpenBLAS:0.2.7已经出来了,我已经重新编译了Julia。不幸的是,由于Julia仍然使用OpenBLAS 0.2.6,这并不算什么。但是,在编译Julia时可以使用系统版本的OpenBLAS,而不是让Julia下载版本并自行编译。这样我让Julia使用0.2.7而不是0.2.6现在我遇到的问题就解决了。不再有堆栈溢出。