在PGI Fortran

时间:2015-08-24 04:09:31

标签: fortran

我正在尝试在Fortran中分配一个真正的数组finn_var(459,299,27,24,nspec)。 nspec = 24工作正常,而nspec = 25则没有。分配过程没有错误消息,但打印命令打印为空而不是零值。如果您使用该阵列,将出现“分段错误”错误消息。测试程序是

  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(459,299,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编译,那就没问题了。

2 个答案:

答案 0 :(得分:3)

内存不足。数组的大小为2 223 304 200。这可疑地接近最大32位整数2 147 483 648

看起来编译器内部使用的元素数会溢出。对malloc的内部调用请求的内存不足,然后尝试读取最后的某些元素失败。

默认设置是编译器的限制。可以使用选项‑Mlarge_arrays将其设置为使用64位寻址。

请参阅http://www.pgroup.com/products/freepgi/freepgi_ref/ch05.html#ArryIndex

答案 1 :(得分:2)

您的问题很可能是内存问题。

每个459*299*27*24 * 4B数组需求nspec(假设默认real需要4B内存)。对于nspec == 24,这会导致内存需求大约为7.95GiB,而nspec == 25需要大约8.28GiB

我猜,您的物理内存仅限于8GiB或某些ulimit限制了此过程允许的内存量。