c - 如何终止 fork 另一个进程的 MPI 程序

标签 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 程序只启动一些其他应用程序而不应该等待任何事情。

谢谢, 问候, 机器人。

最佳答案

延迟的原因是 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;
 }

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

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

关于c - 如何终止 fork 另一个进程的 MPI 程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10974803/

相关文章:

c - fgets 和 chdir 在 C 中一起表现得很奇怪

c++ - 在不同优化级别访问 gcc/g++ 中的局部变量和全局变量的速度

Linux系统在VMware关闭前调用 "poweroff"后等待90秒

c - libpcap 数据包大小

parallel-processing - 在进程之间平均重新分配数据的函数/算法

c++ - 如何查找与包含相关的问题 - 可视化包含树

c - 我的代码中有错误?(使用函数和指针对数组进行排序)

linux - 如何为每个用户设置 cron 作业

c++ - 将 MPI_Bcast 用于

c++ - MPI_Gather()、MPI_Scatter()中发送计数和接收计数有什么区别?