MPI通信运行的多个可执行
问题描述:
我实现应该运行的主 - 从算法的程序,以及主从作业将通过执行参数来确定。 例如:MPI通信运行的多个可执行
mpirun -oversubscribe -tag-output -np 1 BioNetFit2 -a load -c parabolaA_272002678.sconf : -oversubscribe -tag-output -np 4 BioNetFit2 -t particle -p 0 -a run -c parabolaA_272002678.sconf
在这种情况下,主运行这一部分:./BioNetFit2 -a load -c parabolaA_272002678.sconf
站与从站将执行此部分:./BioNetFit2 -t particle -p 0 -a run -c parabolaA_272002678.sconf
这就是我如何初始化通讯世界:
cout << "Detected BNF2mpi in Pheromones init()" << endl;
MPI_Init(NULL, NULL);
// Get the number of processes
int world_size;
MPI_Comm_size(MPI_COMM_WORLD, &world_size);
cout << "Defined mpi environment" << endl;
// Get the rank of the process
int world_rank;
MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
cout << "My rank is " << world_rank << "and I have just started." << endl;
我的问题是主机发送一条消息,从机永远不会收到消息,反之亦然。
所有的源代码可以在这里找到:https://github.com/raqueldias/testing_rep 这是一个大的程序,它是由另一人首次实施升压-MPI,我的工作就是传递函数从boost-MPI对MPI分布式消息转换。
我的第一个非常基本的问题是:如果我在第2个部分运行的程序那样的,是过程能够在默认情况下正常通信,或者我指定任何不同的配置,使他们沟通?
答
原来,挂的过程中这个问题没有什么做在的mpirun执行多个程序或多个实例的执行。
我误解了MPI_Iprobe的工作方式。这是我是如何实现它之前:
while (1) {
//std::cout << "rcv loop" << std::endl;
serializedMessage.resize(1000);
usleep(10000);
MPI_Status status;
int flag = 0;
while(!flag){
MPI_Iprobe(MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &flag, &status);
}
if (flag) {
//receive code here
}
} ...
这是制作过程中挂起。使程序正常工作的实现是:
while (1) {
//std::cout << "rcv loop" << std::endl;
serializedMessage.resize(1000);
usleep(10000);
MPI_Status status;
int flag = 0;
MPI_Iprobe(MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &flag, &status);
if (flag==1) {
//do something here
}
}
请发送发送/接收问题的部分。目前尚不清楚其原因是什么。放更多的代码,以便我们可以检查它。 –
刚刚上传了整个源代码。 – RDlady