cygwin OMP 核心转储

cygwin OMP Core Dump

我一直在尝试使用带有 gfortran XXXXX -fomp 的 cygwin 接口并行化用 FORTRAN90 编写并编译/运行 的优化算法。

该算法通过子例程调用的有限差分计算梯度和 hessian 矩阵。该子例程非常大,每次都涉及 ~2 mb 矩阵的操作。出于讨论的目的,我将使用 "call srtin()" 作为子例程调用的示例。

如果我在编译过程中没有使用任何 OMP 代码,如果我在编译过程中使用 -fomp 选项,程序就会失败(代码编译顺利)。使用 gfortran 定期编译和执行不会导致任何问题。但是,在我添加 -fomp 选项的那一刻,如果存在对 srtin() 的单个调用,则生成的可执行文件会导致分段错误。

我在该站点上了解到 omp 的一个常见问题是堆栈大小问题。我推断(可能是错误的)主线程堆栈大小问题是错误的,因为我还没有包含任何会创建任何从属线程的代码。在典型的 linux 计算机上,我的理解是,我会使用“ulimit -s XXX”将此堆栈大小重置为足够高的值,以便不再发生错误。我已经通过我的 cygwin 界面试过了,但错误仍然存​​在。我也曾尝试使用 peflags 命令为此可执行文件设置更高的堆栈内存,但没有成功。我也增加了 OMP_STACKSIZE 环境变量但没有成功。

有人有什么建议吗?

在 GCC 中启用 OpenMP 会禁用大型数组在堆上的自动放置。因此,即使代码中没有 OpenMP 构造,它也可能使您的程序崩溃。 Windows 与 ulimit -s 不等价,因为主线程的堆栈大小是从可执行文件的 PE header 读取的。 OMP_STACKSIZE 控制工作线程的堆栈大小,不影响主线程之一。

按照@tim18 的建议使用-Wl,--stack,some_big_value,而不是使用peflags 编辑PE header。 some_big_value 以字节为单位。有关详细信息,请参阅 here