微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

FORTRAN内存利用率 – 静态与dynamic

我有一个问题,我以前试图问,但没有得到很多,并已发现新的信息,希望有更大的帮助。 这个代码一个混合的MPI / OPENMP代码,当试图跨越多个节点运行时(尽pipe它只在一个节点上执行,而且是主进程从其中生成的),它会崩溃。 有问题的静态数组,我发现,如果静态数组“太大”,会导致seg故障,但如果他们是“小”,一切运行良好。 我也将代码转换为dynamic内存分配作为一个testing,这就解决了这个问题…无论大小(即使是在静态世界中失败的较大的那个),代码也可以完成。 这个解决scheme不是长期的,因为testing代码只是一个testing代码,有一个更大的代码performance出相同的行为,并将其更改为dynamic不是一个选项。 我需要确定是什么导致静态arraysseg故障的情况。

基本上,静态分配和dynamic分配的内存是如何处理的? 我应该试着去超越这个吗? 我相信这个问题与系统设置有关,可能只有在作业通过MPICH2时才会违反,但在login节点时不会出现问题(因此为什么它在当前login的节点上运行正常)。

在我的.bashrc文件中,因为我使用了ifort编译器,所以我有“ ulimit -s unlimited ”,“ export OMP_STACKSIZE=4g ”和“ export KMP_STACKSIZE=4G ”。 我相信这肯定是一个相对简单的解决办法,但是我不能来。

如果违规的程序源代码是需要的,我可以发送出去,但我认为这里给出的描述涵盖了这个问题,只是让我知道。

使用? 与sed

Bash命令只移动一些文件

打字过程中的Bashinputvalidation

如何使用单个命令行在第三个字段中显示最高值

Bash数组中的负下标

bash – 如何匹配在循环中使用的文件

streamredirect的顺序和操作系统的细节

Bash输出发生在提示符之后,而不是之前,这意味着我必须手动按回车

如何使用getopts选项没有参数在bash结束

运行期望代码时发送错误

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

由于您使用的是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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐