如何终止已分叉另一个进程的MPI程序

时间:2012-06-11 05:22:06

标签: c linux mpi openmpi

我需要编写一个MPI程序,它必须在不同的集群节点上启动几个进程。这是我的示例代码。

#include <stdio.h>
#include <mpi.h>

int main(int argc, char *argv[]) {
    int rank, size, nodenamesize;
    char nodename[100];

    MPI_Init(&argc, &argv);

    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    MPI_Comm_size(MPI_COMM_WORLD, &size);
    MPI_Get_processor_name(nodename, &nodenamesize);

    printf("Hello world! I am %d of %d running on %s\n", rank, size, nodename);

    if (rank == 0) {
        system("./Longwait&");
    } else if (rank == 1) {
        system("./AnotherLongWait&");
    }

    MPI_Finalize();
    return 0;
}

它成功启动了进程,但MPI应用程序并未自行终止。它甚至在调用MPI_Finalize()之后等待。

这段代码有什么问题?我需要做些什么才能使MPI程序只需启动其他一些应用程序,但不应等待任何事情。

谢谢你, 问候, 机器人。

1 个答案:

答案 0 :(得分:2)

延迟的原因是Open MPI用于提供I / O重定向的机制。提示:使用system("ls -l /proc/self/fd");system("lsof -c lsof");可以了解system(3)生成的子进程中打开了多少个文件描述符。这些描述符由LongwaitAnotherLongWait保持打开状态,这使得MPI运行时等待它们完成。

以下是一个简单示例,其中包含两个非常简单的Longwait示例版本:

第1版:睡1分钟

#include <unistd.h>

int main (void)
{
    sleep(60);
    return 0;
}

如果您使用system("./Longwait&");生成此程序,则必须等到mpirun / mpiexec完成后才能完成。

版本2:在睡觉前盲目关闭前20个文件描述符

 #include <unistd.h>

 int main (void)
 {
     int i;

     for (i = 0; i < 20; i++)
         close(i);
     sleep(60);
     return 0;
 }

如果你像以前一样生成这个程序,{MPI程序退出后不久就会完成mpirun / mpiexec可执行文件。

现在这是一个真正的解决方案 - 随机关闭打开的文件描述符会产生不可预测的影响。找出应该关闭哪些描述符既不容易也不便携。我通常建议不要在你的代码中做你做的事情。除了Open MPI,它还不能可靠地支持具有InfiniBand互连的系统上的进程分支(system(3)在后​​台使用fork(2)。)