cygwin OMP核心转储

时间:2017-07-11 23:00:24

标签: fortran cygwin openmp gfortran dump

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

该算法通过与子程序调用的有限差异来计算梯度和粗糙矩阵。子程序非常大,每次都需要操作~2 mb的矩阵。出于讨论的目的,我将使用“call srtin()”作为子例程调用的示例。

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

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

有没有人有任何建议?

1 个答案:

答案 0 :(得分:0)

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

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