C++ 多次调用MPI_Comm_Spawn

C++ 多次调用MPI_Comm_Spawn,c++,c,mpi,C++,C,Mpi,我们正在编写一个使用迭代法(牛顿法)解决非线性问题的代码。不管怎么说,问题在于,由于重划分、自适应等原因,我们无法事先知道从一个迭代到另一个迭代需要多少MPI过程,而且迭代次数相当多 因此,我们希望在每次迭代中使用MPI_Comm_Spawn来创建所需的MPI流程,收集结果并“销毁”子流程。我们知道,由于信息的收集,这限制了代码的可伸缩性,但是,我们被要求这样做:) 我使用intel MPI和Visual Studio express 2013在我的笔记本电脑(在windows 7/64位上)上

我们正在编写一个使用迭代法(牛顿法)解决非线性问题的代码。不管怎么说,问题在于,由于重划分、自适应等原因,我们无法事先知道从一个迭代到另一个迭代需要多少MPI过程,而且迭代次数相当多

因此,我们希望在每次迭代中使用MPI_Comm_Spawn来创建所需的MPI流程,收集结果并“销毁”子流程。我们知道,由于信息的收集,这限制了代码的可伸缩性,但是,我们被要求这样做:)

我使用intel MPI和Visual Studio express 2013在我的笔记本电脑(在windows 7/64位上)上进行了两次MPI通信繁殖测试。我试过这些简单的代码

//StackMain
#include <iostream>
#include <mpi.h>
#include<vector>
int main(int argc, char *argv[])
{
    int ierr = MPI_Init(&argc,& argv);
    for (int i = 0; i < 10000; i++)
    {
        std::cout << "Loop number "<< i << std::endl;
        MPI_Comm children;
        std::vector<int> err(4);
        ierr = MPI_Comm_spawn("StackWorkers.exe", NULL, 4, MPI_INFO_NULL, 0, MPI_COMM_WORLD, &children, &err[0]);
        MPI_Barrier(children);
        MPI_Comm_disconnect(&children);
    }
    ierr = MPI_Finalize(); 
    return 0;
}
这似乎有效,但我确实有一些问题

1-程序在迭代4096期间冻结,如果我重新启动程序,这个数字不会改变。若在每次迭代中我启动2次4过程,那个么它将在第2048次迭代时停止。。。 这是操作系统的限制吗

2-当我查看程序中“mpiexec”占用的内存时,它会不断增长(从不下降)。你知道为什么吗?我想,当子进程完成他们的工作时,他们会释放他们使用的内存

3-是否应断开/释放儿童通讯器?如果是,MPI_Disconnect(…)必须同时在派生进程和派生进程上调用?还是只生孩子


非常感谢

不幸的是,我不知道答案,因为我以前从未使用过
MPI\u Comm\u spawn
。然而,我认为问题2和问题1是相互关联的。如果您的内存不断增长,很有可能达到笔记本电脑的极限(在应用程序中,程序无法再分配内存并冻结)。每次都应该在for循环的同一次迭代中达到这个限制。谢谢你的回答。对不起,我不够精确:内存在“冻结”时达到大约170Mo(只有程序冻结,而不是计算机)。因此,我认为我的笔记本电脑(16Go)内存没有达到任何限制。很高兴在
MPI\u SPAWN
上看到一个问题。我也没用过这么多,但在linux上用你的代码(Ubuntu 12.04,gcc 5.2.0,MPICH版本3.1,
MPI_UNIVERSE_SIZE=1681915913
),没有明显的内存增加,而且
valgrind
报告没有泄漏。您的示例看起来类似于最小示例()。也许升级mpi版本?这对我们来说是个好消息,谢谢!我要检查/升级我的MPI版本。。。
//StackWorkers
#include <mpi.h>
int main(int argc, char *argv[])
{
    int ierr = MPI_Init(&argc,& argv);
    MPI_Comm parent;
    ierr = MPI_Comm_get_parent(&parent);
    MPI_Barrier(parent);
    ierr = MPI_Finalize();
    return 0;
}
mpiexec -np 1 StackMain.exe