6

我正在尝试使用 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 版本。

4

2 回答 2

6

正如我在问题 ( https://github.com/JuliaLang/julia/issues/3630 ) 中提到的,这很可能与https://github.com/xianyi/OpenBLAS/issues/中讨论的 openblas 线程错误相同221 .

openblas 开发分支上有一个暂定修复,它设置了更大的堆栈大小。

现在,做blas_set_num_threads(1).

于 2013-07-05T06:30:05.507 回答
1

现在新版本的 OpenBLAS: 0.2.7 已经发布,我重新编译了 Julia。不幸的是,这没有任何意义,因为 Julia 仍然使用 OpenBLAS 0.2.6。但是,可以在编译 Julia 时使用 OpenBLAS 的系统版本,而不是让 Julia 下载版本并自行编译。这样我让 Julia 使用 0.2.7 而不是 0.2.6,现在我遇到的问题已经解决了。没有更多的堆栈溢出。

于 2013-07-22T09:33:31.007 回答