![](/img/trans.png)
[英]problem sending multiple non-blocking messages with MPI_Isend and receiving with MPI_Recv in C
[英]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.