我一直在嘗試使用MPI_Comm_split創建一個星型拓撲,但是當我試圖建立與所有進程的鏈接時,我似乎有問題並且存在問題。這些過程也可以連接到MPI_COMM_WORLD的p0。問題是我在該行MPI虛擬拓撲設計
error=MPI_Intercomm_create( MPI_COMM_WORLD, 0, NEW_COMM, 0 ,create_tag, &INTERCOMM);
的錯誤是得到一個崩潰:MPI_ERR_COMM: invalid communicator
。
我有和原因的想法,雖然我不知道如何解決它。看起來這是由於不屬於新通信器(NEW_COMM)的處理零呼叫引起的。如果process = 0,我試圖放置一條if語句來停止執行此行,但是由於它是一次集體調用,所以這又失敗了。
任何建議,將不勝感激。
#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'需要兩個_intracommunicators_作爲輸入。現在,你正在給它MPI_COMM_WORLD和NEW_COMM;一個溝通者是另一個溝通者的一個子集。我相信你應該創建一個只有'world_rank == 0'進程的第二個通信器:'ROOT_COMM'。然後調用'MPI_Intercomm_create(ROOT_COMM,0,NEW_COMM,0,create_tag,&INTERCOMM);'可能會按預期工作。 – NoseKnowsAll