1

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

谢谢你,问候,机器人。

4

1 回答 1

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;
 }

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

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

于 2012-06-11T15:53:37.697 回答