Я пытаюсь создать звездообразную топологию с использованием MPI_Comm_split, но, похоже, у меня есть и проблема, когда я пытаюсь установить ссылки, связанные со всеми процессами. Ожидается, что процессы будут связаны с p0 MPI_COMM_WORLD. Проблема в том, я получаю сбой в линииДизайн виртуальной топологии MPI
error=MPI_Intercomm_create( MPI_COMM_WORLD, 0, NEW_COMM, 0 ,create_tag, &INTERCOMM);
Ошибка является: MPI_ERR_COMM: invalid communicator
.
У меня есть и идея причины, хотя я не знаю, как это исправить. Кажется, это связано с вызовом нулевого процесса, который не принадлежит новому коммуникатору (NEW_COMM). Я попытался поставить оператор if, чтобы остановить выполнение этой строки, если process = 0, но это снова не удается с его коллективного вызова.
Любые предложения будут оценены.
#include <iostream>
#include "mpi.h"
using namespace std;
int main(){
MPI_Comm NEW_COMM , INTERCOMM;
MPI_Init(NULL,NULL);
int world_rank , world_size,new_size, error;
error = MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
error = MPI_Comm_size(MPI_COMM_WORLD,&world_size);
int color = MPI_UNDEFINED;
if (world_rank > 0)
color = world_rank ;
error = MPI_Comm_split(MPI_COMM_WORLD, color , world_rank, &NEW_COMM);
int new_rank;
if (world_rank > 0) {
error = MPI_Comm_rank(NEW_COMM , &new_rank);
error = MPI_Comm_size(NEW_COMM, &new_size);
}
int create_tag = 99;
error=MPI_Intercomm_create( MPI_COMM_WORLD, 0, NEW_COMM, 0 ,create_tag, &INTERCOMM);
if (world_rank > 0)
cout<<" My Rank in WORLD = "<< world_rank <<" New rank = "<<new_rank << " size of NEWCOMM = "<<new_size <<endl;
else
cout<<" Am centre "<<endl;
MPI_Finalize();
return 0;
}
Я мог ошибаться, но я считаю, что 'MPI_Intercomm_create' принимает в качестве входных данных два _intracommicators_. Как и вы, вы даете ему MPI_COMM_WORLD и NEW_COMM; один коммуникатор является подмножеством другого. Я считаю, что вы должны создать второй коммуникатор, который является только процессом 'world_rank == 0':' ROOT_COMM'. Затем вызывается 'MPI_Intercomm_create (ROOT_COMM, 0, NEW_COMM, 0, create_tag и INTERCOMM);' может работать как ожидалось. – NoseKnowsAll