对不起,如果这不是正确的地方做这个问题,这不是关于编程,而是一个技术问题。 我需要以双精度处理巨大尺寸的二维矢量阵列,其中约1000万个是近似的。但是,在其他程序中,我遇到了处理这种数组的内存问题。我的问题是,如果有双精度的数组大小的某种限制。Fortran 90中双精度最大的数组大小是多少?
我在Linux上工作,英特尔的两个核心,32位。 谢谢
对不起,如果这不是正确的地方做这个问题,这不是关于编程,而是一个技术问题。 我需要以双精度处理巨大尺寸的二维矢量阵列,其中约1000万个是近似的。但是,在其他程序中,我遇到了处理这种数组的内存问题。我的问题是,如果有双精度的数组大小的某种限制。Fortran 90中双精度最大的数组大小是多少?
我在Linux上工作,英特尔的两个核心,32位。 谢谢
Fortran语言标准没有定义程序可以(尝试)声明或分配的数组大小的限制。在实践中,您可能会发现编译器会将数组中元素的总数限制为2^31-1
或2^63-1
,具体取决于您的默认整数大小是32位还是64位。您可能会发现数组的任何维度的最大大小也限制为相同的值。
在实践中,您可以声明的最大数组大小将受计算机上可用RAM限制。由于双精度值占用8个字节,因此计算您可能能够使用的数组的最大范围相对容易。与您想要使用的数据量相比,阵列所需的任何存储开销都很小。
针对VladimirF的评论
0
索引,实际上可以从范围内的任何正整数或负整数索引,但这对程序员来说确实是一个方便。我认为字节数必须是2^31-1或2^63-1,而不是元素数。 –
或更少,因为数组不能有地址0 –
我的内存有2.5 GB,因此,我将不得不与具有大小我说,如果我的RAM仅专用于执行我的计划工作阵列工作没有问题。但是它发生了,程序停止了一个消息错误,如“错误内存存储开销”或类似的东西。那么,我在执行期间是否关闭了FORTRAN的其他程序? – JoeCoolman
好吧,我将解释为什么字节数是有限的,不仅仅是元素数量。在数组索引期间,元素的地址必须被计算。当然,它必须符合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.
如所预期的大小数组以字节溢出,并且程序在索引变量溢出之前很久就崩溃了。这不是一个编译器特有的功能,但这有一个根本原因。
你的例子完全清楚弗拉基米尔 – JoeCoolman
您可能需要增加进程的内存限制。见'ulimit'。 –