使用SBCL编译lapack系统时堆耗尽

时间:2019-04-28 05:32:41

标签: common-lisp heap sbcl

从f2cl库编译lapack系统时,SBCL会收到有关堆耗尽的错误消息,进入低级调试器:

Heap exhausted during garbage collection: 0 bytes available, 64 requested.
Gen  Boxed Unboxed   LgBox LgUnbox  Pin       Alloc     Waste        Trig      WP GCs Mem-age
 0       0       0       0       0    0           0         0    26843545       0   0  0.0000
 1   26205   12796       0       0    9  1277771072    213696   767547401   39001   1  1.3696
 2   14599   27405     117      18   88  1114241264 266569488     2000000   42139   0  0.8257
 3       0       0       0       0    0           0         0     2000000       0   0  0.0000
 4       0       0       0       0    0           0         0     2000000       0   0  0.0000
 5       0       0       0       0    0           0         0     2000000       0   0  0.0000
 6     449     220      64      47    0    24788848    770192     2000000     780   0  0.0000
 7       0       0       0       0    0           0         0     2000000       0   0  0.0000
           Total bytes allocated    =    2416801184
           Dynamic-space-size bytes =    2684354560
GC control variables:
   *GC-INHIBIT* = true
   *GC-PENDING* = true
   *STOP-FOR-GC-PENDING* = false
fatal error encountered in SBCL pid 31717(tid 0x7fbb53033280):
Heap exhausted, game over.

我在maxima邮件列表中找到了建议使用sbcl的--dyanamic-space-size选项增加堆大小的帖子,因此我尝试了这一点。即使我为它提供了与我的RAM(〜7.44 GB)一样多的内存,它仍然耗尽了堆,尽管经过了更长的时间。我不太确定从这里到哪里。有什么想法吗?

系统规格:Arch Linux和SBCL 1.4.16。

1 个答案:

答案 0 :(得分:3)

在编译期间可能会消耗大量内存,因为您要询问大量的调试信息。我尝试编译lapack,但也失败了。碰巧,在我的~/.sbclrc中,我有:

(sb-ext:restrict-compiler-policy 'debug 3)
(sb-ext:restrict-compiler-policy 'safety 3)

在新的SBCL中,编译器策略如下:

* (describe-compiler-policy)

  Basic qualities:
COMPILATION-SPEED = 1
DEBUG = 3
SAFETY = 3
SPACE = 1
SPEED = 1
INHIBIT-WARNINGS = 1
  Dependent qualities:
SB-C::CHECK-CONSTANT-MODIFICATION = 1 -> 3 (yes)
SB-C::TYPE-CHECK = 1 -> 3 (full)
SB-C::CHECK-TAG-EXISTENCE = 1 -> 3 (yes)
SB-C::LET-CONVERSION = 1 -> 0 (off)
SB-C:ALIEN-FUNCALL-SAVES-FP-AND-PC = 1 -> 3 (yes)
SB-C:VERIFY-ARG-COUNT = 1 -> 3 (yes)
SB-C::INSERT-DEBUG-CATCH = 1 -> 3 (yes)
SB-C::RECOGNIZE-SELF-CALLS = 1 -> 0 (no)
SB-C::FLOAT-ACCURACY = 1 -> 3 (full)
SB-C:INSERT-STEP-CONDITIONS = 1 -> 3 (full)
SB-C::COMPUTE-DEBUG-FUN = 1 -> 3 (yes)
SB-C::EVAL-STORE-SOURCE-FORM = 1 -> 3 (yes)
SB-C::PRESERVE-SINGLE-USE-DEBUG-VARIABLES = 1 -> 3 (yes)
SB-C::INSERT-ARRAY-BOUNDS-CHECKS = 1 -> 3 (yes)
SB-C::STORE-XREF-DATA = 1 -> 3 (yes)
SB-C:STORE-COVERAGE-DATA = 1 -> 0 (no)
SB-C::INSTRUMENT-CONSING = 1 -> 1 (no)
SB-C::STORE-CLOSURE-DEBUG-POINTER = 1 -> 0 (no)
SB-KERNEL:ALLOW-NON-RETURNING-TAIL-CALL = 1 -> 0 (no)

尤其是,该政策受到以下限制:

* (restrict-compiler-policy)

((SAFETY . 3) (DEBUG . 3))

这些是所需的最少调试和安全性,因此两者均至少为3。 当我删除调试限制时,使用以下行:

* (restrict-compiler-policy 'debug)
((SAFETY . 3))

...然后可以编译lapack系统,而无需更改动态空间大小。在开发时添加调试信息很好,我鼓励所有人都保留它们,因为您永远不知道何时需要调试某些东西,但是在这种情况下,最好将它们关闭。