我在 MPI 进程之间有一个类似于模式通信的管道。其中进程作为管道阶段相互发送消息。以下示例显示了以这种模式进行通信的三个进程。
#include "mpi.h"
#include <stdlib.h>
#include <stdio.h>
//declare stage function
void* testcall(void* d);
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 k;
int x[3] = {10,11,12};
void* data = malloc(sizeof(int));
for( k=0 ; k< 3;k++){
data = &x[k];
MPI_Send(data,4,MPI_BYTE,1,0,MPI_COMM_WORLD);
}
}
if(rank==1){
void* rcv = malloc(sizeof(int));
void* snd = malloc(sizeof(int));
int k;
for( k=0 ; k< 3;k++){
MPI_Recv(rcv,4,MPI_BYTE,0,0,MPI_COMM_WORLD,&status);
snd = testcall(rcv);
int z = *(int *) snd;
printf("RCV 1: %d \n",z);
MPI_Send(&snd,4,MPI_BYTE,2,0,MPI_COMM_WORLD);
}
}
if(rank==2){
void* rcv2 = malloc(sizeof(int));
void* snd2 = malloc(sizeof(int));
int k;
for( k=0 ; k< 3;k++){
MPI_Recv(rcv2,4,MPI_BYTE,1,0,MPI_COMM_WORLD,&status);
snd2 = testcall(rcv2);
int z = *(int *) snd2;
printf("RCV 2: %d \n",z);
}
}
MPI_Finalize();
return 0;
}
void* testcall(void* d){
int z = *(int *) d;
int k = z * 2;
void* rslt = malloc(sizeof(int));
rslt = &k;
return rslt;
}
输出:
RCV1:20
RCV1:22
RCV1:24
车牌号:2136566600
车牌号:2136566600
车牌号:2136566600
我的代码有一个问题。从进程 0 发送到进程 1 成功,并在我打印时给我正确的信息。
虽然从进程 1 发送到进程 2 似乎成功,但是当我尝试打印时它只是一个意外数字(如上面的输出所示)。
我不明白为什么这两个发送行为不同。(两者都在发送一个由 void 指针指向的值。为什么第二次发送是错误的)??
请帮忙。