簡體   English   中英

使用 MPI_Isend 發送和接收不同類型的數據

[英]Sending and Receiving different type of data using MPI_Isend

我想將不同類型的數據從單個節點發送到另一個節點。 例如,我有 2 個不同類型的數據:int 和 double。 但是,在我將它們發送出去后,即使我指定了類型,接收數據的節點也會收到錯誤的值。 從下面的示例代碼中,第二個節點接收 0.00000 和 0 值用於兩個接收。 如何解決這個問題並讓第二個節點接收正確的值,在這種情況下,double 的值應該是 1.2,int 的值應該是 5。

include <mpi.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>

/* Main function */
int main(int argc, char *argv[]) {
    int rank, numberOfProcesses;

    MPI_Init( &argc, &argv );
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    MPI_Comm_size(MPI_COMM_WORLD, &numberOfProcesses);
    MPI_Status status[5];
    MPI_Request req[5];     //request array

    int nreq = 0;
    int tag = 0;

    if (rank == 0){
        double sendDouble = 1.2;
        int sendInteger = 5;

        MPI_Isend(&sendInteger, 1, MPI_INT, 1, 100, MPI_COMM_WORLD,&req[nreq++]);
        MPI_Isend(&sendDouble, 1, MPI_DOUBLE, 1, 222, MPI_COMM_WORLD,&req[nreq++]);
    }
    MPI_Waitall(nreq,req,status);

    if (rank ==1) {
        MPI_Status status;

        double recvDouble;
        int recvInt;
        MPI_Irecv(&recvDouble,1,MPI_DOUBLE,MPI_ANY_SOURCE,MPI_ANY_TAG,MPI_COMM_WORLD,&req[nreq++]);
        MPI_Irecv(&recvInt,1,MPI_INT,MPI_ANY_SOURCE,MPI_ANY_TAG,MPI_COMM_WORLD,&req[nreq++]);

        printf("receive double %lf\n", recvDouble);
        printf("receive integer %d\n", recvInt);

    }


    MPI_Finalize();
    return 0;
}

收到雙倍 0.000000

接收 integer 0

我不確定這是否是一個答案,但我有一些觀察:

顯然,您啟動了該程序兩次,根據它的等級,它是發送者還是接收者。

如果是發件人,您發送和 integer。 然后你發送一個雙倍。

如果它是一個接收器,你想收到一個雙倍。

但是在異步通信中,您必須讀取通道中的內容,因此通道中的第一件事將是 integer。 閱讀完 integer 后,您可以閱讀雙份。 (我找不到任何信息表明接收器會從 stream 中選擇一個雙精度數,忽略 int。)

請注意,您的MPI_Waitall(nreq,req,status); 也為rank==1執行,盡管這無關緊要,因為nreq為零。

您還應該檢查 MCI 調用的返回值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM