我一直在尝试并行化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环境变量但没有成功。
有没有人有任何建议?
答案 0 :(得分:0)
在GCC中启用OpenMP会禁用堆上大型数组的自动放置。因此,即使代码中没有OpenMP结构,它也可能使程序崩溃。 Windows没有等效的ulimit -s
,因为从可执行文件的PE头读取主线程的堆栈大小。 OMP_STACKSIZE
控制工作线程的堆栈大小,不会影响主线程之一。
使用@ tim18建议的-Wl,--stack,some_big_value
,而不是使用peflags
编辑PE标头。 some_big_value
以字节为单位。有关详细信息,请参阅here。