计算要分配的内存量时发生整数溢出

时间:2019-07-18 01:30:45

标签: fortran x86-64 gfortran

我正在尝试处理存储为常规X,Y和Z坐标网格的空间数据集,每个位置都有多个存储属性的字段。但是,在分配用于存储数据的数组时,它将引发错误。

当前在Win10上使用gcc gfortran版本8.1.0(i686-posix-dwarf-rev0,由MinGW-W64项目构建)。

我尝试了不同的机器(以防万一我遇到硬件限制),并查看了各种编译器选项,但没有设法影响结果。

这是一个简化的示例,其中包含当前要处理的数据集的实际限制:

      program test_array

      implicit none

      real*8, allocatable :: test(:,:,:,:)

      integer*4 x,y,z,vars

      x=382
      y=390
      z=362
      vars=15

      print *, "Total bytes: ", x*y*z*vars*8

      allocate(test(x,y,z,vars))

      print *, "Allocated"

      deallocate(test)

      print *, "Deallocated"

      end program test_array

程序可以正常编译,但是在执行时返回以下错误:

 Total bytes:    -2118243392
Fortran runtime error: Integer overflow when calculating the amount of memory to allocate

Error termination. Backtrace:

Could not print backtrace: libbacktrace could not find executable to open
#0  0x41ad93
#1  0x413fee
#2  0x411d50
#3  0x401807
#4  0x4019dd
#5  0x40138a

很明显,我超出了32位整数限制,但是由于我使用的是x64系统,并且(据我所知)编译器是64位版本,所以我不明白为什么m达到32位限制。因此,我研究了编译器开关,将所有整数强制为INTEGER * 8无效。

是否有可能绕过此限制?如果是,怎么办?

问题已解决!

在搜索各种安装DIR时,我遇到了另外三个都包含gfortran.exe版本的安装。不用说,这些文件优先于最近安装的MinGW编译器套件来调用。一旦删除了这些冗余版本,测试程序和生产工具就可以毫无问题地进行编译和执行(该特定型号的内存分配高达6.5 Gb)。

非常感谢那些发表评论并帮助我指出正确方向的人。

1 个答案:

答案 0 :(得分:1)

上述问题是由于gfortran.exe编译器的多个实例作为其他软件包(例如Strawberry Perl)的一部分安装的,并通过直接调用正确的编译器以演示64位编译器产生了正常工作的程序而得以解决。 / p>

为编译器发现-v开关,可以显示安装路径以及其他环境变量和版本信息。从这里,我可以找到不需要的EXE并删除它们,并在必要时删除它们已过期的安装包。

使用64位编译器处理的结果模型的验证确认程序可以按预期工作。