使用 SBCL 编译 lapack 系统时堆耗尽
Heap exhaustion while compiling lapack system with 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.
编译期间可能会出现高内存消耗,因为您正在询问大量调试信息。我尝试编译 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
系统工作,而不更改动态 space 大小。在开发时添加调试信息很好,我鼓励任何人始终保留它们,因为你永远不知道什么时候需要调试某些东西,但在那种情况下最好关闭它们。
只是一个简短的补充说明:这是一个非常旧的 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.
编译期间可能会出现高内存消耗,因为您正在询问大量调试信息。我尝试编译 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
系统工作,而不更改动态 space 大小。在开发时添加调试信息很好,我鼓励任何人始终保留它们,因为你永远不知道什么时候需要调试某些东西,但在那种情况下最好关闭它们。
只是一个简短的补充说明:这是一个非常旧的 SBCL 版本。如果可以的话,不妨考虑升级到最新的。