gpt4 book ai didi

如果存在对 MPI_Initialized 的调用,Fortran 程序将卡住

转载 作者:行者123 更新时间:2023-12-04 08:56:28 25 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Function call stopping/hanging when containing a write-statement, but only when linking with certain libraries during compilation

(1 个回答)


1年前关闭。




以下 Fortran 程序在调用 print_test 时卡住.

program test_prg
implicit none
integer :: mpi_enabled, ierr

call MPI_Initialized(mpi_enabled, ierr)
print *, print_test()

contains

function print_test() result(res)
real :: res
res = 0
print *, 'HELLO'
end function
end program
调用 print_test甚至可以在调用 MPI_Initialized 之前只要调用 MPI_Initialized 仍然会卡住和 print *, print_test()存在于程序中的某处。如果 MPI_Initialized 也可以重现相同的问题替换为 MPI_Init ,但如果我将其删除,则不会。如果我删除 print *, 'HELLO' ,然后它工作。如果我调用 print_test在单独的行上,然后打印结果,然后它就可以工作了。使用 gfortran 编译时观察到该问题9.3.0(通过 mpifort)。使用 ifort 编译时,相同的程序可以正常运行。 . MPICH 版本是 3.3.2。
这是一个 gfortran漏洞?有谁知道如何解决这个问题?

最佳答案

有人向我指出,这个问题与递归 IO 有关,这显然是标准不允许的。简而言之,如果一个函数打印到一个单元,则不能在与同一单元关联的打印语句的 IO 列表中调用它。必须将函数的返回值分配给一个变量,然后打印该变量,或者打印到另一个单元。不幸的是,不遵守此规则会导致运行时卡住而没有任何解释,而不是编译时错误。已经提出并回答了完全相同的问题,例如:
Function call stopping/hanging when containing a write-statement, but only when linking with certain libraries during compilation

Print to standard output from a function defined in an Fortran module

关于如果存在对 MPI_Initialized 的调用,Fortran 程序将卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63803176/

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