【问题标题】:the output of my fortran code is killed , any suggestion?我的 fortran 代码的输出被杀死了,有什么建议吗?
【发布时间】:2011-04-03 13:27:08
【问题描述】:

我正在尝试在 ssh 上运行一个代码,该代码非常适合较小的网格,但是由于新的网格要大得多,我使用 ifort 命令来编译它, ifort -mcmodel=medium -i-dynamic -otest.out*.f

它符合但当我运行它时,输出是: 杀了

我知道问题出在内存中,有谁知道是否有任何方法可以运行它? 我如何理解代码中导致内存问题的位置?

谢谢 沙迪

【问题讨论】:

  • 你的意思是它只是拒绝运行?也许您请求的内存过多。试着估计你的程序需要多少内存——至少是大数组。也许从静态内存更改为使用可分配数组。 ifort 版本和操作系统是什么?
  • 英特尔文档中有一个说明,当使用 -mcmodel=medium 或 -mcmodel=large 时,必须使用 -shared-intel。

标签: linux memory-management ssh operating-system fortran


【解决方案1】:

尝试使用 valgrind。我尝试在我的 fortran 代码中找到内存泄漏,并取得了很好的成功。

http://valgrind.org/

【讨论】:

    【解决方案2】:

    从 ifort 命令行,我认为您正在 Linux 上运行。

    看到“killed”作为输出通常是 Linux 的 Out Of Memory Killer (OOM) 参与以防止即将发生的崩溃的结果(因为通常的做法是应用程序请求更多内存,然后他们需要比实际请求更多的内存当前可用 - 检查系统日志文件中的“内存不足:已终止进程 [PID] [进程名称]”)。 OOM 杀手通常非常擅长处理负责使用所有内存的应用程序,因此从您的应用程序内存使用开始。

    首先要做的是尝试估计(即使只是粗略的)您希望您的应用程序使用多少内存。一种方法是估算主要数组的大小并将它们乘以每个元素所需的位数。另一种方法是考虑您期望内存使用如何随着网格大小而增长。您可以通过实验(使用不同的网格大小运行、测量内存使用和推断)或通过一次测量和对主要阵列如何缩放的知识来研究这一点。可能是您要求比机器上更多的内存:解决此问题的方法可能是访问更大的计算机。 (或者您可以尝试找到使用更少内存的替代算法。)

    如果它们是内存泄漏,您应该会看到比预期更多的内存使用量,即使对于较小的网格尺寸也是如此。如果是这种情况,valgrind 应该会有所帮助。从静态存储转移到动态存储在这里可能无济于事 - 如果您刚刚超出堆栈上的可用空间,我预计会看到分段错误。

    【讨论】:

      猜你喜欢
      • 2018-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多