MPI,通过其中一个过程生成一个孩子
MPI, spawning a child by one of the processes
我正在用Open MPI进行并行编程。我试图实现的是启动一个具有两个进程的应用程序(这可以通过 mpirun -n 2 实现...),并使这两个进程的第一个进程生成自身的另一个实例。下面是 c++ 中的草图:
// mpi_spawn_cpp2.cc
#include "mpi.h"
#include <iostream>
using namespace std;
int main( int argc, char *argv[] )
{
int rank, size;
int errcode;
MPI::Intercomm intercomm;
MPI::Init( argc, argv );
rank = MPI::COMM_WORLD.Get_rank();
size = MPI::COMM_WORLD.Get_size();
cout << "world size: " << size << endl;
if (rank == 0) {
intercomm = MPI::COMM_WORLD.Spawn("./mpi_spawn_cpp2", MPI::ARGV_NULL, 1, MPI::INFO_NULL, 0, &errcode);
cout << "intercomm size: " << intercomm.Get_size() << endl;
}
MPI::Finalize();
return 0;
}
尽管它编译完美,但上述代码的问题在于它似乎没有从 Spawn 函数返回,这意味着该过程实际上没有生成。上面的代码有什么问题,应该纠正什么才能使其工作?
非常感谢您的帮助。
MPI_Comm_spawn
在内部通信器上是集体的,但你只从等级 0 调用它,这就是它挂起的原因。试试这个:
intercomm = MPI::COMM_WORLD.Spawn("./mpi_spawn_cpp2", MPI::ARGV_NULL, 1, MPI::INFO_NULL, 0, &errcode);
if (rank == 0) {
cout << "intercomm size: " << intercomm.Get_size() << endl;
}
一句忠告。由于这是您在 MPI 中的第一步,因此我建议您改为学习 C 绑定。C++绑定在当前的 MPI 标准版本 2.2 中已弃用,并将从即将发布的版本 3.0 中完全删除。
相关文章:
- 如何将矩阵的行随机复制到内存中的另一个矩阵的过程并行化?
- 下一个云桌面客户端构建过程
- cmake在构建过程中使用另一个工具检测标志
- 如何拒绝一个叫做的过程以写入继承的控制台窗口
- boost :: filesystem :: verver()无法访问文件,因为另一个过程正在使用该文件
- 如何检测和与Linux下的另一个过程进行通信
- 如何将数据发送到另一个过程(仅在C 语言级别上)
- 尝试从另一个过程读取32位整数时,ReadProcessMemory崩溃了
- 如何创建一个新过程,而没有从管理模式运行的MFC应用程序中的管理特权
- 如何使用C/C 系统调用来获取Linux过程中一个过程的当前大小
- 尝试分叉一个过程,第一个命令有效,但第二总是给出错误
- 如何在另一个过程内存中扫描INT值
- 在此过程中的纸牌游戏程序.不知道为什么我会得到一个随机数-858993460
- 如何从另一个过程的Callstack地址检索函数名称
- 使用process_vm_readv从另一个过程中修改整数值
- 我可以编程设置ENV使用BAT,然后发出一个过程
- 开始一个过程,而不是作为一个孩子
- MPI,通过其中一个过程生成一个孩子
- 我正试图将一个过程的结果写入一个文本文件,我遇到的问题是列的对齐问题
- 我怎么能得到一个过程到核心映射在C