gpt4 book ai didi

c - 等到奴隶调用 MPI_finalize

转载 作者:行者123 更新时间:2023-12-02 01:27:56 24 4
gpt4 key购买 nike

我对以下代码有疑问:

大师:

#include <iostream> 
using namespace std;

#include "mpi.h"
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#define PB1 1
#define PB2 1

int main (int argc, char *argv[])
{
int np[2] = { 2, 1 }, errcodes[2];
MPI_Comm parentcomm, intercomm;
char *cmds[2] = { "./slave", "./slave" };
MPI_Info infos[2] = { MPI_INFO_NULL, MPI_INFO_NULL };
MPI_Init(NULL, NULL);

#if PB1
for(int i = 0 ; i<2 ; i++)
{
MPI_Info_create(&infos[i]);
char hostname[] = "localhost";
MPI_Info_set(infos[i], "host", hostname);
}
#endif

MPI_Comm_spawn_multiple(2, cmds, MPI_ARGVS_NULL, np, infos, 0, MPI_COMM_WORLD, &intercomm, errcodes);
printf("c Creation of the workers finished\n");

#if PB2
sleep(1);
#endif

MPI_Comm_spawn_multiple(2, cmds, MPI_ARGVS_NULL, np, infos, 0, MPI_COMM_WORLD, &intercomm, errcodes);
printf("c Creation of the workers finished\n");

MPI_Finalize();
return 0;
}

奴隶:

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

using namespace std;

int main( int argc, char *argv[])
{
int rank;
MPI_Init(0, NULL);

MPI_Comm_rank(MPI_COMM_WORLD, &rank);
printf("rank = %d\n", rank);

MPI_Finalize();
return 0;
}

我不知道为什么当我运行 mpirun -np 1 ./master 时,当我将 PB1 和 PB2 设置为 1 时,我的程序停止并显示以下消息(当我设置为他们为 0):

There are not enough slots available in the system to satisfy the 2 slots that were requested by the application: ./slave Either request fewer slots for your application, or make more slots available for use.

例如,当我将 PB2 设置为 0 时,程序运行良好。因此,我想这是因为 MPI_finalize 没有完成它的工作......

我用谷歌搜索,但我没有找到我的问题的任何答案。我尝试了各种方法:调用 MPI_comm_disconnect,添加屏障,...但没有任何效果。

我在 Ubuntu (15.10) 上工作并使用 OpenMPI 版本 1.10.2。

最佳答案

第一组 salves 上的 MPI_Finalize 将不会完成,直到在 master 上调用 MPI_FinalizeMPI_Finalize 是所有连接进程的集合。您可以通过在调用 MPI_Finalize 之前手动断开第一批 salves 与内部通信器的连接来解决这个问题。这样,奴隶实际上将完成并退出 - 为新一批奴隶释放“插槽”。不幸的是,我没有看到一种标准化的方法来真正确保奴隶在释放插槽的意义上完成,因为那将是实现定义的。 OpenMPI 在 MPI_Comm_spawn_multiple 中卡住而不是返回错误这一事实很不幸,人们可能会认为这是一个错误。无论如何,这是您可以执行的操作的草稿:

在 master 中,每次都由它的 slaves 完成:

MPI_Barrier(&intercomm); // Make sure master and slaves are somewhat synchronized
MPI_Comm_disconnect(&intercomm);
sleep(1); // This is the ugly unreliable way to give the slaves some time to shut down

奴隶:

MPI_Comm parent;
MPI_Comm_get_parent(&parent); // you should have that already
MPI_Comm_disconnect(&parent);
MPI_Finalize();

但是,您仍然需要确保 OpenMPI 知道应该为整个应用程序保留多少插槽 (universe_size)。例如,您可以使用 hostfile 来做到这一点:

localhost slots=4

然后 mpirun -np 1 ./master

现在这不太好,我认为您动态生成 MPI worker 的方法并不是 MPI 的真正目的。它可能受标准支持,但如果实现困难重重,那对您没有帮助。但是,没有足够的信息说明您打算如何与外部流程进行通信以提供更清晰、更合乎逻辑的解决方案。

最后一点:一定要检查 MPI 函数的返回码。特别是 MPI_Comm_spawn_multiple

关于c - 等到奴隶调用 MPI_finalize,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35997386/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com