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

标签 linux bash fortran mpi openmp

我有一个问题,我之前曾尝试询问过,但没有深入了解并找到了新信息,希望得到更多帮助。该代码是混合 MPI/OPENMP 代码,当尝试跨多个节点运行时会因段错误而崩溃(尽管它仅在一个节点上执行时才有效,因为生成主进程的进程)。问题中有静态数组,我发现如果静态数组“太大”会导致段错误,但如果它们“很小”则一切正常。我还将代码转换为动态内存分配作为测试,这解决了问题......无论大小(即使是在静态世界中失败的更大的大小),代码运行到完成都很好。不过,此解决方案不是长期解决方案,因为测试代码只是……测试代码,还有一个更大的代码表现出相同的行为,将其更改为动态不是一种选择。我需要确定导致静态数组段错误情况的原因。

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

在我的 .bashrc 文件中,我有“ulimit -s unlimited”、“export OMP_STACKSIZE=4g”和“export KMP_STACKSIZE=4G"因为我使用的是 ifort 编译器。我相信这一定是一个相对简单的修复,但我无法做到。

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

最佳答案

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

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

关于linux - FORTRAN 内存利用率 - 静态与动态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8620448/

相关文章:

linux - 每次文件达到特定大小时使文件无效的 Shell 脚本

bash - 从 bash 脚本运行 mpi 作业,批处理模式

c++ - 使用 g++ 从 g++ 和 gfortran 链接 .o 文件时出现 "__gfortran_pow_c8_i4"错误

visual-studio-2013 - 如何更改 Abaqus 求解器可执行文件名

function - 函数输入进行求和运算的求和问题

linux - 在 Linux 上将 hwclock 设置为 UTC

c++ - 装饰库中的函数

bash - 我可以告诉 Make 忽略环境变量吗?

bash - 我们如何在 bash 中匹配字符串中的后缀?

c - 使用同时加载另一个共享库的 JNI 加载动态 C 共享库