2013-11-05 91 views
3

对不起,如果这不是正确的地方做这个问题,这不是关于编程,而是一个技术问题。 我需要以双精度处理巨大尺寸的二维矢量阵列,其中约1000万个是近似的。但是,在其他程序中,我遇到了处理这种数组的内存问题。我的问题是,如果有双精度的数组大小的某种限制。Fortran 90中双精度最大的数组大小是多少?

我在Linux上工作,英特尔的两个核心,32位。 谢谢

+0

您可能需要增加进程的内存限制。见'ulimit'。 –

回答

3

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

在实践中,您可以声明的最大数组大小将受计算机上可用RAM限制。由于双精度值占用8个字节,因此计算您可能能够使用的数组的最大范围相对容易。与您想要使用的数据量相比,阵列所需的任何存储开销都很小。

针对VladimirF的评论

  • 我的意思,仍然意味着,元素的数量,而不是字节数。它是确定访问数组元素所需的最大索引值的元素数。
  • 这可能是一些编译器对单个数组中使用的字节数进行限制,但这不是我所做的一点。
  • Fortran数组当然可以从0索引,实际上可以从范围内的任何正整数或负整数索引,但这对程序员来说确实是一个方便。
+0

我认为字节数必须是2^31-1或2^63-1,而不是元素数。 –

+0

或更少,因为数组不能有地址0 –

+0

我的内存有2.5 GB,因此,我将不得不与具有大小我说,如果我的RAM仅专用于执行我的计划工作阵列工作没有问题。但是它发生了,程序停止了一个消息错误,如“错误内存存储开销”或类似的东西。那么,我在执行期间是否关闭了FORTRAN的其他程序? – JoeCoolman

3

好吧,我将解释为什么字节数是有限的,不仅仅是元素数量。在数组索引期间,元素的地址必须被计算。当然,它必须符合intptr_t C变量。此外,以字节为单位的数组大小必须适合于一个size_t C变量。这些在现代机器上的32位和64位程序上都是32位或64位。虚拟内存也可以通过程序寻址!而且可以通过操作系统和CPU访问内存,但即使程序是32位,它们也可以是64位。

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

最后,我狂在英特尔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. 

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

+0

你的例子完全清楚弗拉基米尔 – JoeCoolman

相关问题