【发布时间】:2019-03-12 11:46:18
【问题描述】:
我在尝试使用 Fortran 中的 execute_command_line 内部函数创建目录时遇到运行时错误。 Ifort (18.0.3 20180410) 和 gfortran (4.8.5) 都会出现该错误。 这是一个最小的例子,无论我使用什么编译标志都会失败:
PROGRAM directory_test
IMPLICIT NONE
INTEGER :: cstat, estat, i, j
CHARACTER(LEN=100) :: cmsg
REAL, DIMENSION(:,:), ALLOCATABLE :: field
INTEGER, PARAMETER :: fieldsize = 80000
allocate(field(fieldsize,fieldsize))
do j=1, fieldsize
do i=1, fieldsize
field(i,j) = real(i+j)
end do
end do
call execute_command_line('mkdir -p newdir', WAIT=.true., EXITSTAT=estat, CMDSTAT=cstat, CMDMSG=cmsg)
write(*,*) 'estat: ', estat
write(*,*) 'cstat: ', cstat
write(*,*) 'cmsg: ', cmsg
END PROGRAM directory_test
输出ifort:
状态:0
cstat: 124
cmsg:提供给 EXECUTE_COMMAND_LINE 的命令无效
输出 gfortran:
统计:-520880432
cstat: 1
cmsg:无法获取命令语言解释器的终止状态
关键是:只要数组足够小,程序就可以正常运行。对我来说,阈值大约是使用的物理内存的一半(如果您想尝试代码,请调整“fieldsize”的值)。如果数组大于那个值,就会发生错误。如果数组较小,则代码执行时不会出错并创建目录。
我用来测试的机器都有 2 个物理 CPU 和 128GB-256GB 的 RAM。
我做错了什么?
操作系统:Linux、Opensuse 42.3
外壳:bash
文件系统:Ext4
编辑:这个问题不是“execute_command_line()”独有的。尝试对“调用系统()”做同样的事情,我得到了类似的行为。如果原始方法因运行时错误而失败,则不会创建新目录。 在可用 RAM 低至 48GB 的较小/较旧双插槽机器上进行的其他测试产生了相同的结果。有些失败较早,有些几乎需要程序占用的整个物理内存才能失败。不幸的是,我现在没有要测试的单插槽机器。
【问题讨论】:
-
我碰巧有相同的操作系统版本。我执行了代码并成功创建了目录。但在执行过程中,它使用了我 32GB 内存的大约 75%。只是
cmsg包含垃圾,这并不奇怪,因为estat和cstat都是0。它在gfortran 4.8.5 和ifort 16 中都成功了。在这台机器上我无法测试更大的尺寸。 -
我可以确认 30GB 阵列的相同行为。当我在 ifort 中尝试运行时检查时,它 segfauletd,GCC 中的地址清理程序内存不足。我有足够的交换空间用于发送其他程序。
标签: bash fortran runtime-error