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

Integer overflow when calculating the amount of memory to allocate

我正在尝试处理存储为常规 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

程序编译正常,但在执行时returns出现以下错误:

 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 位版本,我不明白为什么我达到了 32 位的限制。因此,我研究了编译器开关以将所有整数强制为 INTEGER*8 但无济于事。

是否有可能绕过这个限制,如果可以,如何绕过?

问题已解决!

在我的各种安装 DIR 上搜索时,我发现了其他三个安装,它们都包含 gfortran.exe 的一个版本。不用说,这些被优先调用到最近安装的 MinGW 编译器套件。删除这些冗余版本后,测试程序和生产工具都可以毫无问题地编译和执行(此特定型号的内存分配高达 6.5 Gb 左右)。

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

上述问题是由于 gfortran.exe 编译器的多个实例作为其他软件包(例如 Strawberry Perl)的一部分安装的,并通过直接调用正确的编译器来解决,以演示 64 位编译器生成的工作计划。

发现编译器的 -v 开关允许安装路径与其他环境变量和版本信息一起显示。从这里我可以追踪不需要的 EXE 并删除它们,如果有必要,还可以删除它们过时的安装包。

使用 64 位编译器对生成的模型进行验证,确认程序按预期运行。