Fortran 90中双精度的最大阵列大小是多少?

时间:2013-11-05 03:58:42

标签: arrays fortran fortran90

对不起,如果这不是正确的地方来做这个问题,这不是关于编程而是技术问题。 我需要使用双倍精度的大尺寸2D矢量阵列,其中1000万个近似。但是,在其他程序中,我在处理这种数组时遇到了内存问题。我的问题是,如果双精度数组的大小有某种限制。

我在Linux工作,英特尔两核,32位。 感谢

2 个答案:

答案 0 :(得分:4)

好的,我将解释为什么字节数有限,而不仅仅是元素数。在数组索引期间,必须计算元素的地址。当然它必须适合intptr_t C变量。此外,数组的大小(以字节为单位)必须符合size_t C变量。这些在现代机器上的32位和64位程序上都是32位或64位。同样也适用于程序可寻址的虚拟内存!还有OS和CPU可寻址的内存,即使程序是32位也可以是64位。

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

最后,我在32位模式的英特尔Fortran中进行了一项实验,其中包含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

输出符合预期:

       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.

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

答案 1 :(得分:3)

Fortran语言标准没有定义程序可以(尝试)声明或分配的数组大小的限制。在实践中,您可能会发现编译器将数组中的元素总数限制为2^31-12^63-1,具体取决于您的默认整数大小是32位还是64位。您可能会发现数组的任何维度的最大大小也限制为相同的值。

实际上,您声明的阵列的最大大小将受到计算机上可用RAM的限制。由于双精度值占用8个字节,因此您可以相对轻松地计算出您可能能够使用的数组的最大边界。与您似乎想要使用的数据量相比,数组所需的任何存储开销都很小。

回应VladimirF的评论

  • 我的意思是,仍然是指元素的数量,而不是字节数。它是确定访问数组元素所需的最大索引值的元素数。
  • 可能有些编译器对单个数组中使用的字节数施加了限制,但这不是我要说的。
  • Fortran数组当然可以从0索引,实际上可以从范围内的任何正整数或负整数索引,但这对程序员来说真的只是一种便利。