【问题标题】:How to terminate MPI program which has forked another processes如何终止已分叉另一个进程的 MPI 程序
【发布时间】:2012-06-14 01:05:03
【问题描述】:

我需要编写一个 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 程序只启动一些其他应用程序,但不应该等待任何事情。

谢谢, 问候, 机器人。

【问题讨论】:

  • 您是否考虑过使用forkexecvewaitpid 系统调用(因此避免使用system 库函数),并使用例如与您的*LongWait 进程通信pipe-s 也许和poll 一起?
  • 是的,我也尝试过 fork&execl 。如果创建正常的进程,则父进程按预期退出。但是在这里,使用 MPI,MPI 父进程在“Longwait”和“AnotherLongWait”都被杀死之前不会退出。
  • 只要您的LongWait 正在运行,您就需要 MPI 父进程持续存在。之前不能拨打MPI_Finalize
  • 你能解释一下吗?因为在这种情况下,LongWait 进程是独立的,并且独立进程不依赖于任何东西,例如任何 MPI 调用。我使用 MPI 程序只是为了触发应用程序启动其他任何东西。
  • @RoboAlex:MPI 的常用方法是通信器中的所有进程都执行相同的程序。 MPI 运行时系统负责启动所有涉及的进程并建立进程间通信机制,这些都是使用 MPI 例程完成的。如果您想管理执行不同程序的进程,最好不要使用 MPI。这里不是教你基本 MPI 编程的地方,网上有很多教程如:computing.llnl.gov/tutorials/mpi

标签: c linux mpi openmpi


【解决方案1】:

延迟的原因是 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&amp;"); 生成此程序,则必须等待它首先完成,然后mpirun/mpiexec 也将完成。

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

 #include <unistd.h>

 int main (void)
 {
     int i;

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

如果您像以前一样生成此程序,mpirun/mpiexec 可执行文件将在 MPI 程序退出后不久完成,无需等待。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-12
    • 2017-05-03
    • 1970-01-01
    • 1970-01-01
    • 2012-04-19
    • 2016-11-29
    • 2018-07-13
    • 1970-01-01
    相关资源
    最近更新 更多