Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux FORTRAN内存利用率-静态与动态_Linux_Bash_Fortran_Mpi_Openmp - Fatal编程技术网

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

Linux FORTRAN内存利用率-静态与动态,linux,bash,fortran,mpi,openmp,Linux,Bash,Fortran,Mpi,Openmp,我有一个问题,我以前试图问,但没有走远,并找到了新的信息,我希望得到更多的帮助。该代码是一种混合的MPI/OPENMP代码,当尝试在多个节点上运行时,由于分段错误而崩溃(尽管如果它仅在一个节点上执行,即主进程产生的节点上执行,则该代码仍然有效)。问题中存在静态阵列,我发现如果静态阵列“太大”,则会导致seg故障,但如果它们“太小”,则一切正常。作为测试,我还将代码转换为动态内存分配,这解决了问题。。。无论大小(即使是在静态世界中失败的较大的代码),代码都可以正常运行到完成。这个解决方案不是长期的

我有一个问题,我以前试图问,但没有走远,并找到了新的信息,我希望得到更多的帮助。该代码是一种混合的
MPI
/
OPENMP
代码,当尝试在多个节点上运行时,由于分段错误而崩溃(尽管如果它仅在一个节点上执行,即主进程产生的节点上执行,则该代码仍然有效)。问题中存在静态阵列,我发现如果静态阵列“太大”,则会导致seg故障,但如果它们“太小”,则一切正常。作为测试,我还将代码转换为动态内存分配,这解决了问题。。。无论大小(即使是在静态世界中失败的较大的代码),代码都可以正常运行到完成。这个解决方案不是长期的,因为测试代码只是。。。作为测试代码,有一个更大的代码表现出相同的行为,将其更改为动态不是一个选项。我需要确定导致静态阵列seg故障的原因

基本上,静态分配和动态分配内存的处理方式有什么区别?除了我尝试过的事情之外,我还应该尝试什么来克服这个问题?我认为问题与系统设置有关,可能只有当作业通过MPICH2时才发生冲突,但在登录到节点时不是问题(因此它在我当前登录的节点上运行良好)

在我的
.bashrc
文件中,我有“
ulimit-s unlimited
”、“
export-OMP\u STACKSIZE=4g
”和“
export-KMP\u STACKSIZE=4g
”,因为我使用的是ifort编译器。我相信这一定是一个相对简单的解决方案,但我无法做到


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

静态分配的东西出现在堆栈上,而动态分配的东西出现在堆上。这就是为什么小型静态阵列可以正常工作,而大型阵列则不能

由于您使用的是ifort编译器,因此可以尝试使用
-堆数组进行编译,但这只会将动态分配的数组放在堆上(ifort的独特之处在于,“临时”可分配数组可能会放在堆栈上,就像在子程序中分配的数组一样)

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

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

然后将与以下各项一起运行:

mpiexec -n <numprocs> myScript.sh
mpiexec-n myScript.sh

你找到了答案。问题在于,通过mpiexec调用时,shell值和.bashrc文件不会被转发/执行。4个节点的堆栈大小为“unlimited,819281928192”,第一个是我登录的节点。下一个问题是。。。如何解决这个问题?我可以通过mpiexec调用传递“ulimit-s unlimited”,但不知道语法。更好的是,我是否应该在集群的管理方面对此进行更改?(我必须将命令“ulimit-s”添加到一个文件中,并使该文件成为可执行文件,然后通过mpiexec传递该文件以使其工作)。我试图“投票”你的答案,但我没有足够的声誉或其他东西。抱歉。请注意,我必须使用可执行文件方法,因为发送“mpiexec-np 4-machinefile machines ulimit-s”失败,并且出现错误,我尝试的其他方法都是使用各种引号。我不知道如何在一个命令中发送所有内容而不导致错误。如何提交作业?qfiles还是手动?如果通过qfile,只需将
ulimit-s unlimited
放入qfile。否则,您的另一个选择是编写一个简单的批处理脚本,使用
mpiexec
运行该脚本,设置堆栈大小,然后执行exe。答案中有一个例子。如果你能在管理端更改它,那至少会起作用。但不受限制的堆栈大小也有缺点,特别是在多用户系统上。但是,如果保证只有你一个人在一个节点上运行,那么如果你把它吃光了,无限的堆栈大小就不会影响其他人的工作。
mpiexec -n <numprocs> myScript.sh