MPI FORTRAN代码随机失败

时间:2012-05-16 21:35:48

标签: fortran mpi

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

2 个答案:

答案 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))

出于某些未知原因。