我的主要FORTRAN MPI代码到达所有进程调用脚本的点。代码看起来像
write(syscommand,'(a131xi3)') './vscript.csh' my_mpi_proc_num
rc=system(syscommand)
现在,这部分代码循环了一百多次,脚本在所有进程上运行良好。然后,据我所知,一些进程将进入系统,然后将返回错误代码32512.然后发生一些其他事情(抱歉,我不能显示更多的代码。我的雇主不会太高兴。 ),然后调用MPI_ABORT并且所有进程都死掉。我被告知32512通常是无法找到命令时返回的错误代码。这不太可能,因为正如我已经指出的那样,在崩溃之前,脚本已经找到了数百次,没有任何东西可以移动它。
我似乎找到了一个止损措施:
write(syscommand,'(a131xi3)') './vscript.csh' my_mpi_proc_num
rc=32512
num_attempts=0
do while (num_attempts<100 .and. rc==32512)
num_attempts=num_attempts+1
rc=system(syscommand)
enddo
即。每个过程都会尝试100次以超越32512的事情。虽然我确信这是一个可怕的代码,但它正在发挥作用。
所以,任何人都知道我为什么会收到这个错误?一个想法:如果两个进程试图同时运行相同的脚本,其中一个将被踢出并被迫返回32512?感谢。
答案 0 :(得分:4)
您的编译器可能会将system
内在函数实现为对系统库提供的POSIX system(3)
函数的调用。
此调用返回一个整数,其组织如下。
bits 0-6 set -- the process was stopped
bit 7 -- core flag
bits 8-15 -- exit status of the child process
最后一行是重要的一行。
返回码32512是0x7F00,即子shell的退出状态是127.在Bourne shell和其他UNIX shell中,这意味着没有从PATH找到命令,也不是内置的shell命令(参见{{ 3}})。它也被称为“命令未找到”错误。
如果你的PATH变量可能出现任何问题,那么就可以了。您可以尝试用其绝对路径替换./vscript.csh
及其中的所有命令吗?
在某些MPI实现中,不支持从MPI进程生成进程。我们已经看到了一些OpenMPI版本的问题。如果您从OpenMPI计划中致电fork()
或system()
,您会收到警告:
MPI进程执行了涉及调用的操作 “fork()”系统调用创建子进程。目前正在开放MPI 在可能导致内存损坏的情况下运行 其他系统错误;您的MPI作业可能会挂起,崩溃或产生静音 数据损坏。使用fork()(或system()或其他调用 强烈建议不要创建子进程。
如果您绝对确定您的应用程序将成功 并且在对fork()的调用中正确存活,您可以禁用此警告 通过将mpi_warn_on_fork MCA参数设置为0.
另一方面,最新版本的OpenMPI FAQ声称
通常,如果您的应用程序调用system()或popen(),它将会 可能是安全的。
此限制并非特定于OpenMPI,并且会影响依赖OpenFabrics堆栈的每个实现。
答案 1 :(得分:0)
我遇到了同样的问题,但发现了
print *, 'myrank =', myrank, ', task_i =', task_i
call system(task_list(task_i))
比仅仅
更强大call system(task_list(task_i))
出于某些未知原因。