2

いくつかの問題があります。単純な MPI_Send/MPI_Recv プログラムでは、送信しようとしているメッセージのタイプを知っていると想定されていますが、受信側では、受信するデータのタイプがわかりません。

だから私は次のように最初の試みを試みます:

    #include "mpi.h"
    #include <stdlib.h>
    #include <stdio.h>

    int main(int args, char** argv){
            int rank, size;
            MPI_Status status;
            MPI_Init(&args,&argv);
            MPI_Comm_rank(MPI_COMM_WORLD,&rank);
            MPI_Comm_size(MPI_COMM_WORLD,&size);

            if(rank==0){
                    int x = 10;
                    MPI_Send(&x,4,MPI_BYTE,1,0,MPI_COMM_WORLD);
            }
            if(rank==1){
                    void* datax;
                    int count = sizeof(int);
                    datax = malloc(count);
                    MPI_Recv(datax,count,MPI_BYTE,0,0,MPI_COMM_WORLD,&status);
                    //Now check if the value is received correctly
                    int z = (int) datax;
                    printf("RCV: %d \n",z);
            }

            MPI_Finalize();
            return 0;
    }

プログラムは正しくコンパイルされ、実行されますが、受信した値は正しい値 (この場合は 10) ではなく、メモリのガベージ値です。

何か提案はありますか?

ありがとう、

4

1 に答える 1

4

あなたのコメントはプログラミングの間違いに対処していますが、MPI で不明な型 (さらには不明なサイズ) のデータを送受信するためのはるかに優れた方法があります。

異なるメッセージ タイプを区別する一般的な方法の 1 つは、タイプごとに異なるタグ番号を使用することです。コードでは、呼び出しでタグ番号 0 を使用していますMPI_Send。メッセージのタイプを説明するタグ番号を使用しMPI_Probe 、通話の前に使用MPI_Recvして、受信しようとしているメッセージのタイプを見つけます。たとえば、コードは次のように変更できます。

if (rank == 0) {
    MPI_Send(data_buf, data_size, MPI_BYTE, 1, tag_that_describes_message_type, MPI_COMM_WORLD)
} else if (rank == 1) {
    MPI_Status status;
    // Probe for a message coming from rank 0 with any tag.
    MPI_Probe(0, MPI_ANY_TAG, MPI_COMM_WORLD, &status);
    // Find out what type of message is ready to be received by accessing the MPI_TAG variable in the status struct
    if (status.MPI_TAG == 0) {
        // Receive messages of this type. Maybe you sent an array of ints?
        MPI_Recv(...)
    } else if (status.MPI_TAG == 1) {
        // Receive messages of this type. Maybe you sent an array of floats? Handle it here.
        MPI_Recv(...)
    } else if ...

MPI_Probeまた、メッセージを受信する前にメッセージのサイズを確認するためにも使用できます。これにより、ほぼすべてのタイプのメッセージを動的に受信できます。MPI_Probeこの目的で使用するためのより良い説明と図については、このチュートリアルにアクセスしてください。

さまざまな種類のデータを送信する必要がある場合 (タグ番号で列挙するには多すぎる)、メッセージをGoogle Protocol Bufferにパックし、それを s の配列として受け取りMPI_BYTE(例のように)、解凍します。受け取る側で。プロトコル バッファの AC 実装はこちらです。

于 2012-11-28T02:32:40.640 に答える