1

我的主要 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 吗?谢谢。

4

1 回答 1

4

可能您的编译器将system内在函数实现为system(3)对系统库提供的 POSIX 函数的调用。

此调用返回一个整数,其组织如下。

 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 命令(请参阅此问题)。它也称为“找不到命令”错误。

如果有任何东西可能与您的 PATH 变量发生冲突,那就是它。您可以尝试./vscript.csh用绝对路径替换其中的所有命令吗?

在某些 MPI 实现中,不支持从 MPI 进程生成进程。我们发现某些版本的 OpenMPI 存在问题。如果您调用fork()system()从 OpenMPI 程序调用,您将收到警告:

MPI 进程执行了一个操作,该操作涉及调用“fork()”系统调用以创建子进程。Open MPI 当前在可能导致内存损坏或其他系统错误的条件下运行;您的 MPI 作业可能会挂起、崩溃或产生静默数据损坏。强烈建议不要使用 fork()(或 system() 或其他创建子进程的调用)。

如果您绝对确定您的应用程序将成功且正确地在对 fork() 的调用中幸存下来,则可以通过将 mpi_warn_on_fork MCA 参数设置为 0 来禁用此警告。

另一方面,最近版本的 OpenMPI FAQ 声称

一般来说,如果您的应用程序调用 system() 或 popen(),它可能是安全的。

此限制并非特定于 OpenMPI,它会影响依赖于 OpenFabrics 堆栈的每个实现。

于 2012-05-17T08:53:55.987 回答