我开发了一个Fortran代码,其内存要求可以根据使用ifort编译的问题的大小进行扩展。在初始化问题(数组的分配等)之后,代码的主要部分通过一系列函数调用循环。
其中一个功能包括3-5个调用system()
命令。有些很简单,只复制目录,如:
call system('cp -r plot_files plot_files1)
虽然有另一个实际上调用了一个运行单独程序的mpiexec。
问题是程序“挂起”系统调用大约50%的时间,但只针对已分配数组的大问题(〜array(300000))。
挂起我的意思是当我qstat时,它仍然显示正在运行但是使用pstack,strace,cat / proc / PID / status搜索PID会显示PID不再存在。
在大量初始化之前,代码中有一个调用system()
,并且只有在分配了数组之后才会在那里失败。这让我相信这是一个内存问题,但在挂起过程中的监控显示有足够的内存可用。
[top -cbp PID before the program hangs][1]
我最初使用OpenMP进行编译,希望将来可以并行化代码。使用OpenMP,失败率约为80%。当OpenMP被取出时,失败率降至50%左右。我搜索并搜索了这个问题的可能原因并空手而归。