在PGI Fortran中分配大数组
我试图在Fortran中分配一个实数组finn_var(459299,27,24,nspec)。nspec=24正常工作,而nspec=25不正常。分配过程没有错误消息,但print命令print为空而不是零值。如果使用数组,将出现“分段错误”错误消息。测试程序是在PGI Fortran中分配大数组,fortran,Fortran,我试图在Fortran中分配一个实数组finn_var(459299,27,24,nspec)。nspec=24正常工作,而nspec=25不正常。分配过程没有错误消息,但print命令print为空而不是零值。如果使用数组,将出现“分段错误”错误消息。测试程序是 program test implicit none integer :: nx, ny, nez, nt, nspec integer
program test
implicit none
integer :: nx, ny, nez, nt, nspec
integer :: allocation_status
real , allocatable :: finn_var(:,:,:,:,:)
nx = 459
ny = 299
nez = 27
nt = 24
nspec = 24
allocate( finn_var(nx, ny, nez, nt, nspec), stat = allocation_status )
if (allocation_status > 0) then
print*, "Allocation error for finn_var"
stop
end if
print*, finn_var
end
不应该是内存问题。我毫无问题地分配了双精度finn_var(459299,27,24,24)。那么原因是什么呢
我在linux服务器上使用pgf90。cat/proc/meminfo命令:
MemTotal: 396191724 kB
MemFree: 66065188 kB
Buffers: 402388 kB
Cached: 274584600 kB
SwapCached: 0 kB
Active: 131679328 kB
Inactive: 191625200 kB
HighTotal: 0 kB
HighFree: 0 kB
LowTotal: 396191724 kB
LowFree: 66065188 kB
SwapTotal: 20971484 kB
SwapFree: 20971180 kB
Dirty: 605508 kB
Writeback: 0 kB
AnonPages: 48317148 kB
Mapped: 123328 kB
Slab: 6612824 kB
PageTables: 132920 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
CommitLimit: 219067344 kB
Committed_AS: 53206972 kB
VmallocTotal: 34359738367 kB
VmallocUsed: 275624 kB
VmallocChunk: 34359462559 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
Hugepagesize: 2048 kB
unlimit-a命令:
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 3153920
max locked memory (kbytes, -l) 32
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 3153920
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
我是用pgf90编译的。但如果我是由gfortran编译的,就没有问题了 您的问题很可能是内存问题 您的数组需要每个nspec的
459*299*27*24*4B
(假设默认real
需要4B
内存)。对于nspec==24
,这导致大约7.95GiB
的内存需求,而nspec==25
需要大约8.28GiB
我猜,您的物理内存被限制为8GiB,或者一些
ulimit
限制了此过程允许的内存量。不一定是内存不足。阵列的大小为223 304 200
。这可能接近最大32位整数2147 483 648
看起来编译器在内部使用的元素计数溢出。对malloc
的内部调用请求的内存不足,因此任何读取最后部分元素的尝试都会失败
这是编译器在其默认设置中的一个限制。通过使用选项-Mlarge\u arrays
,可以将其设置为使用64位寻址
请参见此处的在Mac上使用gfortran 5.2可以很好地工作。使用‑Mlarge_arrays pgf90编译器标志可以解决此问题。这一段是关于静态数组的。答案可能在编译器开关中,但在mcmodel中。最后,实际上是-Mlarge_arays。但是,从该页面上看,不清楚哪个页面处理了不同的问题(在数据段中拟合静态数据)。我上面提到的手册更清楚地描述了它的功能。