抱歉,如果这不是正确的地方提问,请见谅。这不是关于编程的问题,而是一个技术问题。 我需要使用双精度的巨大二维向量数组进行工作,大约有1000万个。但是,在其他程序中,我在处理此类数组时遇到了内存问题。我的问题是双精度数组大小是否有某种限制。
我在Linux上工作,使用Intel双核,32位。 谢谢
intptr_t
。此外,字节数组的大小必须适合于C变量size_t
。这些都是现代计算机上32位和64位程序上的32位或64位。同样也适用于程序可寻址的虚拟内存!以及操作系统和CPU可寻址的内存,尽管它们可能是64位的,即使程序是32位的。
这是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
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
,具体取决于默认整数大小是32位还是64位。您可能会发现数组的任何维度的最大大小也受到相同值的限制。0
开始索引,事实上,可以从范围内的任何正整数或负整数开始索引,但这真的只是方便程序员的一种方式。
ulimit
。 - M. S. B.