3

コンストラクトを使用してコミュニケーターを作成しました。次に、 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)を使用できないため、エラーは理にかなっています。

したがって、私の質問は、特定のプロセスが新しいコミュニケーターに属しているかどうかをどのように確認できるかということです。
コミュニケーションをとる前にこの警備員を置くことができるように。

ありがとう、

4

1 に答える 1

2

を実行しているコードを再検討しますMPI_Comm_split。私の知る限り、2つの別々の変数newCommとは必要ありませんnewComm2。を呼び出すとMPI_Comm_split、グローバルに作成されている複数のコミュニケータを考えることができます。の値ごとに1つですcolor。ただし、各プロセス呼び出しMPI_Comm_splitは、1つのコミュニケーター(それが属するコミュニケーター)への参照のみを取得します。

ifステートメントは次のMPI_Comm_splitように置き換えることができます

MPI_Comm_split(MPI_COMM_WORLD, (rank % 2 == 0), rank, &newComm);
MPI_Comm_rank(newComm, &newrank);
MPI_Comm_size(newComm, &newSize);

2つのコミュニケーターが作成されますがnewComm、異なるプロセスの異なるコミュニケーターを参照します。

奇数のプロセスがまったく通信する必要がない場合は、それらにを供給するようにすることができMPI_UNDEFINEDますcolor。これにより、次の値が取得さMPI_COMM_NULLnewCommます。

MPI_Comm_split(MPI_COMM_WORLD, (rank % 2) ? MPI_UNDEFINED : 0, rank, &newComm);

次に、コードで次のことを確認できます(newcomm == MPI_COMM_NULL)

于 2012-09-15T22:37:17.710 に答える