Lapack: ./EIG/xeigtstz 中的段错误

创建于 2019-04-19  ·  11评论  ·  资料来源: Reference-LAPACK/lapack

你好,

这是 Lapack 3.8.0。

使用 lapack 3.8.0 和最近的 gfortran 在 xeigtstz 中发生段错误:

./EIG/xeigtstz < nep.in > znep.out 2>&1
/bin/sh: Zeile 1: 9026 Speicherzugriffsfehler (Speicherabzug geschrieben) ./EIG/xeigtstz < nep.in > znep.out 2>&1

当堆栈限制从默认的 8192 kb 提高到 81920 kb(
我尝试的第一个值)。

Build System Testing

所有11条评论

gfortran9 在(除其他外)TESTING/EIG/zhet21.f 第 304 行标记越界访问(在从 1 到 N-1 运行的 J 上执行循环,访问数组元素 U(1, J-1 ) ...哎哟)。 不确定这是否是此问题的实际和唯一原因,但...
编辑:我的观察是无关的(实际上我错过了你已经为它打开了#333)xeigtstz 尝试在堆栈上为 NEP 测试分配大约 10MB,如https://github.com/xianyi/OpenBLAS/中所述

设置ulimit -s 16384而不是默认的 8192 也为我解决了这个问题

同样的问题在这里#85。

这个问题的首选解决方案是增加堆栈限制,但由于这是一个测试,堆分配不是更好的解决方案吗?

我相信由于“递归”选项(线程安全所必需),最终在堆栈上的可分配数组,但我还没有设法找到一个可行的解决方案。

@weslleyspereira将尝试仅编译 zchkee.f 而不使用 -frecursive 选项。 所以所有文件(特别是 liblapack.a)都将使用 -frecursive 选项进行编译,但 zchkee.f 将在没有 -frecursive 选项的情况下进行编译。 我们认为/希望这会奏效。 我们将进行测试。 我认为用 -frecursive 编译 LAPACK 很重要。 现在 zchkee.f 可以在没有的情况下编译。 那会很好的。 CMake 和 make 看起来会更丑一些。 我认为我们早就应该推出一个新的测试套件了,所以我们建议我们现在把它做得很丑,并专注于一个新的测试套件。

只要我不使用 OpenMP 就为我工作,但不幸的是后者暗示 -frecursive
(可以在 Makefile 中使用 filter_out 从 FFLAGS 中去除 frecursive/Mrecursive,所以没有太多新的丑陋)

只要我不使用 OpenMP 就为我工作,但不幸的是后者暗示 -frecursive

啊。 是的,这是一个潜在的问题。

(可以在 Makefile 中使用 filter_out 从 FFLAGS 中去除 frecursive/Mrecursive,所以没有太多新的丑陋)

啊,好主意。 不知道 Makefile 中的 filter_out 是如何工作的。 更糟糕的是调查。 谢谢你的提示。

TESTING/EIG/Makefile,在include ../../make.inc之后添加

FFLAGS := $(filter-out -frecursive -Mrecursive,$(FFLAGS))
FFLAGS_DRV := $(filter-out -frecursive -Mrecursive,$(FFLAGS_DRV))
LDFLAGS := $(filter-out -frecursive -Mrecursive,$(LDFLAGS))

对于 cmake 它会是这样的
string(REGEX REPLACE "-(fM)recursive" "" FFLAGS ${FFLAGS})
(未经测试)

谢谢@martin-frbg! 我现在测试一下

此页面是否有帮助?
0 / 5 - 0 等级