MPI Send Recv 实现两种方式的树形结构

方式1:

每次寻找自己的partner,规定my_rank较小的接收,较大的发送。
// Function:   Global_sum
// Purpose:    Implement a global sum using tree-structured communication
// Notes:
// 1.  comm_sz must be a power of 2
// 2.  The return value is only valid on process 0
int Global_sum(int my_int, int my_rank, int comm_sz, MPI_Comm comm)
{
   // exp:np=4: 
   // @
   // 0  *                       bitmask=4
   // 0(2)  #      2(0)    #     bitmask=2
   // 0(1)  1(0)   2(3)   3(2)   bitmask=1
   int partner, recvtemp;
   int my_sum = my_int;
   unsigned bitmask = 1;
   
   while (bitmask < comm_sz) {
      partner = my_rank ^ bitmask;

      if (my_rank < partner) {
         MPI_Recv(&recvtemp, 1, MPI_INT, partner, 2, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
         my_sum += recvtemp;
      } else {
         MPI_Send(&my_sum, 1, MPI_INT, partner, 2, MPI_COMM_WORLD);
         return 0; //发送任务完成,该进程结束执行
      }
      bitmask *= 2;
   }
   return my_sum;
}

方式2:

每次划分2大组,分为发送方和接收方,最终发送至P0
// Function:   Global_sum
// Purpose:    Implement a global sum using tree-structured communication
// Notes:
// 1.  comm_sz must be a power of 2
// 2.  The return value is only valid on process 0
int Global_sum(int my_int, int my_rank, int comm_sz, MPI_Comm comm)
{
   // exp np=4: 
   // @
   // *  *  |
   // #  #  |  #   #
   // 0  1  |  2   3
   // recv     send
   int dest, src;
   int recvtemp;
   int cur_comm_sz;
   int my_sum = my_int;

   cur_comm_sz = comm_sz;
   while (cur_comm_sz > 1 && my_rank < cur_comm_sz)
   {
      if (my_rank >= cur_comm_sz / 2) { //发送方
         dest = my_rank - cur_comm_sz / 2;
         MPI_Send(&my_sum, 1, MPI_INT, dest, 2, MPI_COMM_WORLD);
         return 0;  //发送完成就结束
      }
      else {
         src = my_rank + cur_comm_sz / 2;
         MPI_Recv(&recvtemp, 1, MPI_INT, src, 2, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
         my_sum += recvtemp;
      }
      cur_comm_sz /= 2;
   }
   return my_sum;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值