首页 > 解决方案 > MPI_send 和 MPI_recv 多次

问题描述

我正在尝试使用点对点例程(MPI_send 和 MPI_recv)实现一个简单版本的 MPI_reduce。我只想模拟[0,1,2]使用 SUM 操作将数组减少到根。这是我的代码:

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


void my_reduce(void* send_data,void* recv_data,int count, MPI_Datatype datatype,MPI_Op op,int root,MPI_Comm communicator){
  int world_rank;
  MPI_Comm_rank(communicator, &world_rank);
  int world_size;
  MPI_Comm_size(communicator, &world_size);

  int tmp=*((int*)recv_data);
    printf("current recv_data is %d\n",*(int*)recv_data);
  if(world_rank==root){
    MPI_Recv(recv_data,count,datatype,root,0,communicator,MPI_STATUS_IGNORE);
    tmp+=*((int*)recv_data);
    *((int*)recv_data)=tmp;
    printf("the value after reduce is now is %d\n",*((int*)recv_data));
  }else{
      MPI_Send(send_data,count,datatype,root,0,communicator);
      printf("now sending %d to root\n",*((int*)send_data));
  }
}

int main(int argc, char** argv) {
  MPI_Init(NULL, NULL);

  int world_rank;
  MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
    int data[3]={0,1,2};
    int dest;
    dest=0;

    if(world_rank==1){

        my_reduce(&data[1],&dest,1,MPI_INT,MPI_SUM,0,MPI_COMM_WORLD);
    }
    if(world_rank==0){

        my_reduce(&data[0],&dest,1,MPI_INT,MPI_SUM,0,MPI_COMM_WORLD);
    } 

    if(world_rank==2){

        my_reduce(&data[2],&dest,1,MPI_INT,MPI_SUM,0,MPI_COMM_WORLD);       
    }
    if(world_rank==0){

        my_reduce(&data[0],&dest,1,MPI_INT,MPI_SUM,0,MPI_COMM_WORLD);
    }   
  MPI_Finalize();
  printf("value of destination after reduce is %d\n",(dest));
  return 0;
}

我对如何从发送接收多个时间感到困惑。在此示例中,root 从第二个和第三个进程接收 2 次。我的代码给出了错误的输出:

current recv_data is 0
now sending 1 to root
current recv_data is 0
current recv_data is 0
now sending 2 to root

如果我在一个分支中添加两个 MPI_recv,即:

    if(world_rank==0){
        my_reduce(&data[0],&dest,1,MPI_INT,MPI_SUM,0,MPI_COMM_WORLD);
        my_reduce(&data[0],&dest,1,MPI_INT,MPI_SUM,0,MPI_COMM_WORLD);
    } 

它仍然是错误的。你能就如何纠正这个问题提供一些建议吗?

标签: cparallel-processingmpi

解决方案


推荐阅读