gpt4 book ai didi

bash - Fortran execute_command_line 运行时错误,取决于内存消耗

转载 作者:行者123 更新时间:2023-11-29 09:04:49 33 4
gpt4 key购买 nike

尝试使用 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

输出强度:
Assets :0
统计数据:124
cmsg:提供给 EXECUTE_COMMAND_LINE 的命令无效

输出 gfortran:
房地产:-520880432
国家统计局:1
cmsg:无法获取命令语言解释器的终止状态

问题是:只要数组大小足够小,程序就可以正常运行。对我来说,阈值大约是所用物理内存的一半(如果您想尝试代码,请调整“fieldsize”的值)。如果数组大于该数组,则会发生错误。如果数组较小,则代码执行无误并创建目录。我用来测试的机器都有 2 个物理 CPU 和 128GB-256GB 的 RAM。
我做错了什么?

操作系统:Linux、Opensuse 42.3
外壳:庆典
文件系统:Ext4

编辑:该问题并非“execute_command_line()”独有。尝试对“call system()”做同样的事情,我得到了类似的行为。如果原始方法因运行时错误而失败,则不会创建新目录。在可用 RAM 降至 48GB 的​​较小/较旧的双插槽机器上进行的其他测试产生了相同的结果。有些失败较早,有些需要程序几乎占用整个物理内存才能失败。不幸的是,我现在没有要测试的单路机器。

最佳答案

因此,EXECUTE_COMMAND_LINE 以及 SYSTEM 内在函数在 Linux 上的实现方式是,进程首先调用 fork() 系统调用,这会创建进程的克隆。然后子进程将调用 exec(),用要执行的新进程替换该进程。

因此,即使第二个 fork 进程在被新的 exec()ed 进程替换之前存在时间非常短,系统仍然需要足够的虚拟内存来用于原始进程和 fork 的子进程。在 Linux 上,如果您具有 super 用户访问权限,则可以使用各种“过度使用”旋钮调整限制(作为物理内存的函数)。

如果可能,解决此问题的一种方法是在分配大量内存之前或释放内存之后调用 EXECUTE_COMMAND_LINE。

关于bash - Fortran execute_command_line 运行时错误,取决于内存消耗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55120720/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com