【问题标题】:Stack overflow when solving large system using Julia使用 Julia 解决大型系统时的堆栈溢出
【发布时间】:2013-07-04 22:49:58
【问题描述】:

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

【问题讨论】:

  • 你能做到吗:[L,U]=lu(A);y=L\b;x=U\y;
  • 仅适用于小型系统。直到 33 x 33 工作正常,但是 34 x 34 系统给出了类似的错误。顺便说一句,Julia [L,U] 必须替换为 (L,U)。

标签: matlab octave lapack blas julia


【解决方案1】:

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

对 openblas 开发分支有一个初步修复,它设置了更大的堆栈大小。

现在,请blas_set_num_threads(1)

【讨论】:

  • 您好,感谢您的修复。然而,在与先义的讨论中,我看到你在随机矩阵乘法中也遇到了这个问题。我对此没有意见。我的问题完全在于解决大型系统:x=A\b。但是设置 blas_set_num_threads(1) 绕过了这个问题,但我猜这会影响性能?
  • 我在 Julia 1.0.5 中试过这个,效果很好。无需更改线程或任何东西。
【解决方案2】:

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

【讨论】:

  • 鉴于这是开箱即用的,是否可以接受该解决方案?我不经常使用stackoverflow,所以我不确定这里的“关闭或接受”是什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-13
  • 1970-01-01
  • 2012-05-09
  • 2020-01-11
  • 2011-06-22
相关资源
最近更新 更多