gpt4 book ai didi

c++ - 阻止执行,直到通过 MPI_Comm_spawn 调用的 child 完成

转载 作者:行者123 更新时间:2023-11-30 01:58:01 25 4
gpt4 key购买 nike

我正在修改一个现有的应用程序,我想生成一个动态创建的 bash 脚本。我创建了一个简单的包装例程,它将 bash 脚本的名称作为参数。在包装器中,脚本由 MPI_Comm_spawn 生成。紧接着,包装器调用 MPI_Finalize,它在脚本完成之前执行:

#include "mpi.h"
#include <stdlib.h>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
char *script = argv[1];
int maxProcs = 2, myRank;
MPI_Comm childComm;
int spawnError[maxProcs];

// Initialize
argv[1] = NULL;
MPI_Init(&argc, &argv);

// Rank of parent process
MPI_Comm_rank(MPI_COMM_WORLD, &myRank);

// Spawn application
MPI_Comm_spawn(script, MPI_ARGV_NULL, maxProcs, MPI_INFO_NULL, myRank, MPI_COMM_SELF, &childComm, spawnError);

// Finalize
MPI_Finalize();

return EXIT_SUCCESS;
}

如果我插入

    sleep(10);

就在

之前
    MPI_Finalize ();

一切正常。现在我的问题是是否可以在 bash 脚本完成之前阻止包装器中的执行?另外,最好能获得脚本的返回值。不幸的是,不能为脚本创建另一个包装器,它与父包装器通信并通过系统调用执行 bash 脚本,因为我需要从脚本中访问 MPI 环境变量。我希望,我已经把事情说清楚了。任何帮助将不胜感激!

最佳答案

如果您可以控制 bash 脚本的内容,即如果您可以在生成之前将某些内容放入其中,那么一个非常粗略的选择是编写一个包含单个 MPI_Barrier 的特殊 MPI 程序。行:

#include <mpi.h>

int main (int argc, char **argv)
{
MPI_Comm parent;

MPI_Init(&argc, &argv);

// Obtain an intercommunicator to the parent MPI job
MPI_Comm_get_parent(&parent);

// Check if this process is a spawned one and if so enter the barrier
if (parent != MPI_COMM_NULL)
MPI_Barrier(parent);

MPI_Finalize();

return 0;
}

像使用与主 MPI 程序使用的 相同 MPI 分布 的任何其他 MPI 程序一样编译该程序,并将其称为 waiter 之类的名称.然后设置一个EXIT陷阱在你的 bash 脚本的开头:

#!/bin/bash
trap "/path/to/waiter $*" EXIT
...
# End of the script file

同样修改主程序为:

// Spawn application    
MPI_Comm_spawn(script, MPI_ARGV_NULL, maxProcs, MPI_INFO_NULL, myRank, MPI_COMM_SELF, &childComm, spawnError);

// Wait for the waiters to enter the barrier
MPI_Barrier(childComm);

// Finalize
MPI_Finalize();

重要的是 waiter被称为waiter $*在陷阱内部,因此它可以接收 bash 脚本将接收的所有命令行参数,因为一些旧的 MPI 实现将额外的参数附加到生成的可执行文件,以便为其提供父连接信息。符合 MPI-2 的实现通常通过环境提供此信息以支持 MPI_Init(NULL, NULL) .

它的工作方式非常简单:trap命令指示 shell 执行 waiter每当脚本退出时。 waiter它本身只是简单地与父 MPI 作业建立一个互通器并在屏障上等待。一旦所有生成的脚本都完成,它们都会启动等待进程作为退出陷阱的一部分,障碍将被解除。

如果您无法修改脚本,则只需创建一个调用实际脚本的包装器脚本并将服务员放入包装器中即可。

经过测试并可与 Open MPI 和 Intel MPI 配合使用。

关于c++ - 阻止执行,直到通过 MPI_Comm_spawn 调用的 child 完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17950762/

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