这是在C中使用MPI的一小段较大的代码。我不明白为什么输出是这样的。代码:
int *work=malloc(2*sizeof(int));
work = get_borders(32);
/* Send it to each rank */
printf("Master sendingn w1 %d w2 %d to slave %dn",work[0],work[1],rank);
fflush(stdout);
MPI_Send(&work, /* message buffer */
2, /* one data item */
MPI_INT, /* data item is an integer */
rank, /* destination process rank */
10, /* user chosen message tag */
MPI_COMM_WORLD);
printf("Check back values...n w1 %d w2 %d for slave %dn",work[0],work[1],rank);
fflush(stdout);
以上代码的输出:
Master sending w1 0 w2 32 to slave 1 Check back values... w1
2293552 w2 28079928 for slave 1
问题是0和32的值是正确的,但我不明白为什么会有那么长的数字。最糟糕的是,这些随机数在Recv函数的另一侧被接收。我一点也不明白——你能解释一下吗?
Recv代码添加
`while (1) {
int wor[2];
/* Receive a message from the master */
MPI_Recv (wor, 2, MPI_INT, 0, MPI_ANY_TAG, MPI_COMM_WORLD, &status);
printf("Slave %d recieving from master w1 %d w2 %dn",rank,wor[0],wor[1]);`
您的问题是,在MPI_SEND
和MPI_RECV
调用中,您将数据类型定义为MPI_INT
,这解释了它作为整数工作的原因。您需要将其更改为MPI_DOUBLE
才能使用双
通常这会显示数据类型问题您发送的数据超过32位,开始显示不正确的数据(如2293552和28079928)为了避免此类问题,请改用双数据类型我通常在mpi中使用double来避免数据类型问题