FORTRAN内存利用率 - 静态与动态

时间:2011-12-23 20:43:40

标签: linux bash fortran mpi openmp

我有一个问题,我之前曾试过询问,但没有找到新的信息并且希望得到更多的帮助。代码是混合MPI / OPENMP代码,当尝试跨多个节点运行时会崩溃并出现分段错误(尽管它只在一个节点上执行时才有效,而主进程是产生于)。问题中有静态数组,我发现如果静态数组太大而且#34;它会引起seg故障,但如果它们是小的"一切顺利。我还将代码转换为动态内存分配作为测试,这解决了问题......无论大小(即使在静态世界中失败的大型代码),代码也可以很好地完成。这个解决方案不是一个长期的解决方案,因为测试代码只是......一个测试代码,有一个更大的代码表现出相同的行为并且将其更改为动态不是一个选项。我需要确定导致静态数组seg故障情况的原因。

基本上,静态分配和动态分配内存的处理方式有何区别?什么(超出我试过的东西)我应该试着超越这个?我认为这个问题与系统设置有关,可能只是在通过MPICH2传递作业时违反,但在登录节点时不是问题(因此,为什么它在我当前登录的节点上运行正常)。

在我的.bashrc文件中,我有" ulimit -s unlimited"," export OMP_STACKSIZE=4g"和" export KMP_STACKSIZE=4G"因为我使用 ifort 编译器。我认为这必须是一个相对简单的修复,但我无法通过它。

如果需要违反程序源代码,我可以将其发送出去,但我认为这里给出的描述涵盖了问题,请告诉我。

1 个答案:

答案 0 :(得分:5)

静态分配的东西出现在堆栈上,而动态在堆上。这就是为什么小静态数组工作正常而较大的静态数组不工作的原因。

由于您正在使用ifort编译器,您可以尝试使用-heap-arrays进行编译,但这只会将动态分配的数组放在堆上(ifort是唯一的,因为“临时”可分配数组可能会进入堆栈,像在子程序中分配的那些)。

要检查的另一件事是MPI作业实际上是让你设置堆栈大小。尝试运行mpirun -n <numprocs> ulimit -s,它应显示所有unlimited,否则它不会尊重您的bashrc。

您可以尝试使用bash脚本(myScript.sh),例如:

#!/bin/bash
ulimit -s unlimited
./myProg

然后将运行:

mpiexec -n <numprocs> myScript.sh