使用Julia解决大型系统时堆栈溢出

时间:2013-07-04 22:49:58

标签: matlab octave lapack blas julia

我正在尝试使用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无法执行这项任务。有人可以告诉我如何解决这个问题吗?

系统信息

  • Linux Mint 13 KDE,64位
  • 从PPA安装LLVM 3.2和Clang 3.2: ppa:kxstudio-team/builds
  • 编译来自源头的Julia 0.2.0-2429.rb0a9ea79

修改

现在OpenBLAS 0.2.7已经解决了问题。重新编译Julia时,请确保Julia使用系统版本的OpenBLAS> = 0.2.7,或者Julia内部编译自己的OpenBLAS版本> = 0.2.7。

2 个答案:

答案 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现在我遇到的问题就解决了。不再有堆栈溢出。