【问题标题】:Intel Fortran Compiler with large file size具有大文件大小的英特尔 Fortran 编译器
【发布时间】:2012-12-18 15:57:12
【问题描述】:

我有一大段用 Fortran 77 编写的遗留代码。我正在编译它并使用英特尔 Fortran 编译器(版本 11?)运行它。我最近遇到了一个问题,输出文件的大小接近 2GB,并且输出停止写入磁盘。

我四处寻找这是否是 Fortran 77 标准的一部分,或者我只是缺少编译器标志或其他东西,但没有找到任何指向我的问题的东西。

更改写语句不是一种选择,因为遗留代码大约有几十万行。最坏的情况是每隔几天我就会进入并将输出的早期部分截断到不同的文件中,但我宁愿不必这样做。

【问题讨论】:

  • 成功的 Fortran 标准几乎不承认文件(或计算机)的存在,更不用说对它们设置限制了。标准指出,与环境交互的这类事情是特定于实现的。我不知道我大量使用的英特尔编译器对输出文件大小设置了限制。您对 2GB 上限的规范让我怀疑这是一个 o/s 限制;您是否在 32 位 Windows 系统上运行?
  • 我在 64 位 Scientific Linux 6.3 上运行,这是一个 RedHat 克隆。我将检查我的文件系统类型,看看这是否是问题所在。编辑:我所有的分区都是 ext4,所以这也不应该是问题。
  • 始终使用标签fortran 并且仅在必要时添加版本以区分您的问题是具体的。例如,您不能使用 Fortran 2008,而只能使用 Fortran 90。

标签: fortran fortran77 intel-fortran


【解决方案1】:

这种行为最可能的原因是使用的内存模型。在 64 位模式下,内存模式分为三种,以使用的寻址模式区分:

  • small 模型 - RIP 相关的寻址用于一切,从调用函数到访问数据。 RIP 是 x64 的 64 位指令指针寄存器(EIP 的 64 位扩展),但相对地址只能是带符号的 32 位数字(并且有一些限制阻止使用全有符号整数范围),因此组合代码 + 静态数据大小限制为大约 2 GiB。
  • medium 模型 - 程序代码限制为 2 GiB,因此与 RIP 相关的函数调用,但数据符号分为两种类型。小数据符号是与前 2 GiB 中的代码相匹配的符号,它们使用与小模型中相同的RIP-relative 方法进行寻址。使用寄存器寻址访问大数据符号,将符号的绝对地址加载到寄存器中,这比较慢,但对可寻址内存没有限制。
  • large 模型 - 所有符号都使用绝对寻址访问。对代码或数据大小没有限制。

大多数可以针对 x64 的编译器,包括ifort,都接受--mcmodel=model 选项,该选项允许一个人控制所使用的内存模型。默认型号为small。目标文件的大小意味着有大量的初始化静态数据,可能是一些非常大的初始化数组(想想DATABLOCK DATA 语句)或许多更小的数组(我怀疑即使是 100 万条代码语句也会生成2 GiB 的指令代码)。使用--mcmodel=medium--mcmodel=large 编译应该可以解决大目标文件大小的问题。

请注意,将使用不同内存模型的目标代码链接在一起会导致灾难 - 整个应用程序应该使用相同的内存模型进行编译。

【讨论】:

    猜你喜欢
    • 2021-04-29
    • 2015-09-24
    • 2016-04-26
    • 2017-03-06
    • 2010-12-04
    • 2017-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多