Fortran 90 中双精度的最大数组大小是多少?

Joe*_*man 4 arrays fortran fortran90

抱歉,如果这不是做这个问题的正确位置,这不是关于编程的问题,而是一个技术问题。我需要处理大量双精度二维向量数组,大约有 1000 万个。但是,在其他程序中,我在处理这种数组时遇到了内存问题。我的问题是双精度数组大小是否有某种限制。

我在 Linux 上工作,Intel 两核,32 位。谢谢

Vla*_*r F 5

好吧,我将解释为什么字节数受到限制,而不仅仅是元素计数。在数组索引过程中,必须计算元素的地址。当然它必须适合intptr_tC 变量。此外,数组的大小(以字节为单位)必须适合size_tC 变量。这些都是现代机器上 32 位和 64 位程序上的 32 位或 64 位。这同样适用于程序可寻址的虚拟内存!还有操作系统和 CPU 可寻址的内存,尽管即使程序是 32 位,它们也可以是 64 位。

这就是 32 位程序和操作系统无法寻址超过 4 GB 内存的根本原因。即使您可以使用比所选 CPU 字大小宽的 Fortran 变量以某种方式计算地址,CPU 也无法访问它。

最后我在 Intel Fortran 中以 32 位模式进行了一个实验,其中数组具有 32 字节元素:

complex(16), allocatable :: a(:)
 do i=1,100
   allocate(a(2**i))
   a(size(a)) = 1
   deallocate(a)
   write(*,*) i
 end do
end

ifort arraysize.f90 -m32 -check -traceback -g
Run Code Online (Sandbox Code Playgroud)

输出如预期:

       1
       2
       3
       4
       5
       6
       7
       8
       9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
    forrtl: severe (179): Cannot allocate array - overflow on array size calculation.
Run Code Online (Sandbox Code Playgroud)

正如预期的那样,数组的大小(以字节为单位)溢出,并且程序在索引变量溢出之前就崩溃了。这不是编译器特定的功能,但有一个根本原因。