gpt4 book ai didi

c - 使用 MPI_Isend 发送和接收不同类型的数据

转载 作者:太空宇宙 更新时间:2023-11-04 04:10:06 25 4
gpt4 key购买 nike

我想将不同类型的数据从一个节点发送到另一个节点。例如,我有 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;
}

receive double 0.000000

receive integer 0

最佳答案

我不确定这是否是一个答案,但我有一些观察:

显然,您启动了该程序两次,根据其级别,它是发送者还是接收者。

如果是发件人,则发送整数。然后你发送一个双倍。

如果它是一个接收器,你想要接收一个双倍的。

但是在异步通信中,你必须读取 channel 中的内容,所以 channel 中的第一个东西就是整数。读取整数后,您可以读取 double 。 (我找不到任何信息表明接收方会从流中选择一个 double ,忽略整数。)

请注意,您的 MPI_Waitall(nreq,req,status); 也会针对 rank==1 执行,但这并不重要,因为 nreq 为零。

您还应该检查 MCI 调用的返回值。

关于c - 使用 MPI_Isend 发送和接收不同类型的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58394226/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com