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

Arrays Fortran 90中双精度的最大数组大小是多少?,arrays,fortran,fortran90,Arrays,Fortran,Fortran90,对不起,如果这不是回答这个问题的正确地方,这不是关于编程的问题,而是一个技术问题。 我需要处理两倍精度的巨大2D向量阵列,大约1000万个。但是,在其他程序中,我在处理这种数组时遇到了内存问题。我的问题是,双精度的数组大小是否有某种限制 我在Linux、Intel双核、32位系统中工作。 多亏了Fortran语言标准没有对程序可以(尝试)声明或分配的数组大小进行限制。实际上,您可能会发现编译器将数组中的元素总数限制为2^31-1或2^63-1,这取决于默认的整数大小是32位还是64位。您可能会发

对不起,如果这不是回答这个问题的正确地方,这不是关于编程的问题,而是一个技术问题。 我需要处理两倍精度的巨大2D向量阵列,大约1000万个。但是,在其他程序中,我在处理这种数组时遇到了内存问题。我的问题是,双精度的数组大小是否有某种限制

我在Linux、Intel双核、32位系统中工作。
多亏了Fortran语言标准没有对程序可以(尝试)声明或分配的数组大小进行限制。实际上,您可能会发现编译器将数组中的元素总数限制为
2^31-1
2^63-1
,这取决于默认的整数大小是32位还是64位。您可能会发现,数组任何维度的最大大小也被限制为相同的值

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

针对弗拉基米尔夫的评论

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

    • 好的,我将解释为什么字节数是有限的,而不仅仅是元素计数。在数组索引期间,必须计算元素的地址。当然,它必须适合
      intptr\t
      C变量。此外,以字节为单位的数组大小必须适合
      size\u t
      C变量。这些都是现代机器上32位和64位上的32位或64位程序。可通过程序寻址的虚拟内存也是如此!还有可由操作系统和CPU寻址的内存,尽管它们可以是64位的,即使程序是32位的

      这就是32位程序和操作系统不能寻址超过4GB内存的根本原因。即使您可以使用比所选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
      
      产出如预期:

             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.
      

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

      我认为字节数必须是2^31-1或2^63-1,而不是元素数。或更少,因为阵列不能有地址0。我的RAM有2.5 Gb,所以如果我的RAM只用于执行我的程序,那么我使用具有我所说大小的阵列不会有问题。但有一种情况发生了,即程序停止时出现了“故障存储器存储开销”之类的消息错误。那么,我在执行过程中是否关闭了FORTRAN程序以外的任何其他程序?您受到RAM数量减去程序大小和分页文件大小的限制。您的程序也需要加载到内存中,因此程序越大,用于存储数据的空间就越小;也就是说,除非你覆盖它。我还没有调查现代编译器/链接器是否可以处理覆盖,因为它们大多数都是在OSs上运行的,并带有动态页面分配。我所说的地址0当然是指空指针,而不是零数组索引。您可能需要增加进程内存限制。请参见
      ulimit