- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在修改一个现有的应用程序,我想生成一个动态创建的 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/
有人可以解释一下为什么即使我将进程数设置为大于 1,下面的代码中也只会创建两个进程子进程。每个 MPI_Comm_spawn 可以使用下面的代码创建两个子进程,在使用 mpirun 创建的每个进程的代
上下文: 整个问题可以概括为我正在尝试复制调用system(或fork)的行为,但在 mpi 环境中。 (事实证明,你不能并行调用system。)这意味着我有一个程序在许多节点上运行,每个节点上有一个
我有两个程序。产生执行一些计算的“ worker ”的“主人”,我希望主人从 worker 那里得到结果并存储总和。我正在尝试使用 MPI_Reduce 从 worker 那里收集结果,而 worke
我有一个父进程和一个矩阵,我想为每一行创建一个子进程并向其发送相应的进程行。 父进程代码: int tag = 0; MPI_Status status; int random(int n) {
我正在编写代码来理解MPI_Comm_spawn。我在互联网上找到了一些例子,所有编译和执行都成功,但是当我输入以下语句时: mpirun -np 2 ./program 我收到一个错误。那么,MPI
Amaey 帮我解决了这个问题。 我试图了解用于生成进程的 MPI_Comm_spawn 函数,因为我正在努力将项目从 PVM 迁移到 MPI .我找到了一个很好的示例程序 here .所以我决定稍微
我在我的 linux 机器上安装了 Rmpi,它在 R 中成功加载。我的机器上有两个版本的 MPICH,我(相信)已经安装了最新版本的 Rmpi。我还必须更新我的 LD_LIBRARY_PAT
假设我的程序(我们称它为 prog_A)作为单个 MPI 进程启动。后来我希望程序 prog_A 使用 MPI_Comm_spawn 生成 n MPI 进程(我们称它们为 prog_B)我传递给 pr
我正在修改一个现有的应用程序,我想生成一个动态创建的 bash 脚本。我创建了一个简单的包装例程,它将 bash 脚本的名称作为参数。在包装器中,脚本由 MPI_Comm_spawn 生成。紧接着,包
我有一个生成一个 worker 的主应用程序,该 worker 本身生成两个 slave。从属应用程序将其输出写入标准输出。我的想法是将 stdout 绑定(bind)到工作应用程序中的不同流,以便能
我正在尝试使用 Torque 的 (5.1.1) qsub 命令启动多个 OpenMPI进程,每个节点一个进程,并让每个进程启动一个使用 MPI_Comm_spawn() 在其自己的 本地 节点上处理
我正在尝试使用 MPI_Comm_Spawn 运行一个 mpi 程序。我生成 1 个工作程序,然后在两个程序中调用 MPI_reduce,以添加一些结果。出于某种原因,应用程序在 MPI_Comm_s
我是一名优秀的程序员,十分优秀!