コンストラクトを使用してコミュニケーターを作成しました。次に、 MPI_Comm_Worldレベルと新しいコミュニケーターレベルのMPI_Comm_split()
両方で送受信通信を試したいと思います。2つのコミュニケータが作成されます(1つは偶数プロセスランク、もう1つは奇数ランク)。
注:偶数プロセスランクを含む新しいコミュニケーター内でのみ通信を試す必要があります(プロセスのランクは元のランクではありませんが、それらのプロセスがメモリ空間に何を持っているかについてはまだ懸念しています)
私のコードは次のとおりです、
#include<stdio.h>
#include "mpi.h"
int main(int arg, char **argv){
int rank,newrank,newrank2;
int size, newSize,newSize2;
int data;
int recv;
MPI_Comm newComm, newComm2;
MPI_Status status, newStatus;
MPI_Init(&arg,&argv);
MPI_Comm_size(MPI_COMM_WORLD,&size);
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
//sample data
data = rank * 100 + 1;
printf("my rank in the WORLD is: %d\n", rank);
fflush(stdout);
if(rank%2==0){
MPI_Comm_split(MPI_COMM_WORLD,0,rank,&newComm);
MPI_Comm_rank(newComm,&newrank);
MPI_Comm_size(newComm,&newSize);
printf("my rank in the newComm1 is : %d\n", newrank);
}else{
MPI_Comm_split(MPI_COMM_WORLD,1,rank,&newComm2);
MPI_Comm_rank(newComm2,&newrank2);
MPI_Comm_size(newComm2,&newSize2);
printf("my rank in the newComm2 is : %d\n", newrank2);
}
//Now try some communication at the newCommunicator and at the WORLD level
if(rank == 0){
//sending to process 1 wrt WOLD_Comm
MPI_Send(&data,1,MPI_INT,1,99,MPI_COMM_WORLD);
}
if(rank==1){
//Receive from process at WORLD_Comm level.
MPI_Recv(&recv,1,MPI_INT,0,99,MPI_COMM_WORLD,&status);
printf("Received at WORLD Level : %d \n\n",recv);
}
if(newSize > 2){
if(newrank == 2){
//send to process 1 wrt the newComm
MPI_Send(&data,1,MPI_INT,1,0,newComm);
}
if(newrank==1){
//Receive from process at newComm level.
MPI_Recv(&recv,1,MPI_INT,2,0,newComm,&status);
printf("Received at newComm Level : %d \n\n",recv);
}
}
MPI_Finalize();
return 0;
}
内部でデータを送受信しようとするとエラーが発生しますnew Communicator
。新しいコミュニケーターに属していないプロセス(奇数ランクのプロセス)は新しいコミュニケーターハンドル(newComm)を使用できないため、エラーは理にかなっています。
したがって、私の質問は、特定のプロセスが新しいコミュニケーターに属しているかどうかをどのように確認できるかということです。
コミュニケーションをとる前にこの警備員を置くことができるように。
ありがとう、