计算要分配的内存量时整数溢出
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 位编译器对生成的模型进行验证,确认程序按预期运行。
我正在尝试处理存储为常规 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 位编译器对生成的模型进行验证,确认程序按预期运行。