我有一个问题,我曾试图询问过,但没有走远,并找到了新的信息,我希望得到更多的帮助.代码是一个混合的MPI / OPENMP代码,当尝试跨多个节点运行时会崩溃并出现分段错误(尽管如果它只在一个节点上执行,它就是主进程产生的那个节点).问题中有静态数组,我发现如果静态数组“太大”会导致seg错误,但如果它们“小”则一切运行正常.我还将代码转换为动态内存分配作为测试,这解决了问题……无论大小(即使在静态世界中失败的大型代码),代码也可以很好地完成.这个解决方案不是一个长期的解决方案,因为测试代码只是……一个测试代码,有一个更大的代码表现出相同的行为并且将其更改为动态不是一个选项.我需要确定导致静态数组seg故障情况的原因.
基本上,静态分配和动态分配内存的处理方式有何区别?什么(超出我试过的东西)我应该试着超越这个?我认为这个问题与系统设置有关,可能只是在通过MPICH2传递作业时违反,但在登录节点时不是问题(因此它在我当前登录的节点上运行正常).
在我的.bashrc文件中,我有“ulimit -s unlimited”,“export OMP_STACKSIZE = 4g”和“export KMP_STACKSIZE = 4G”,因为我正在使用ifort编译器.我相信这一定是一个相对简单的修复方法,但我无法通过它来实现.
如果需要违反程序源代码我可以发送出去,但我认为这里给出的描述涵盖了问题,请告诉我.
解决方法:
静态分配的东西出现在堆栈上,而动态在堆上.这就是为什么小静态数组工作正常而较大的静态数组不工作的原因.
由于您使用的是ifort编译器,您可以尝试使用-heap-arrays进行编译,但这只会在堆上放置动态分配的数组(ifort是唯一的,因为“临时”可分配数组可能会进入堆栈,就像在子程序).
要检查的另一件事是MPI作业实际上是让你设置堆栈大小.尝试运行mpirun -n< numprocs> ulimit -s它应该显示所有无限制,否则它不尊重你的bashrc.
您可以尝试使用bash脚本(myScript.sh),例如:
#!/bin/bash
ulimit -s unlimited
./myProg
然后将运行:
mpiexec -n <numprocs> myScript.sh