【发布时间】: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 程序只启动一些其他应用程序,但不应该等待任何事情。
谢谢, 问候, 机器人。
【问题讨论】:
-
您是否考虑过使用
fork、execve和waitpid系统调用(因此避免使用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