学习笔记:MPI组通信全互换ALLTOALL

MPI_Alltoall

在使用MPI_Alltoall时,每一个进程都会向任意一个进程发送消息,每一个进程也都会接收到任意一个进程的消息。每个进程的接收缓冲区和发送缓冲区都是一个分为若干个数据块的数组。MPI_Alltoall的具体操作是:将进程i的发送缓冲区中的第j块数据发送给进程j,进程j将接收到的来自进程i的数据块放在自身接收缓冲区的第i块位置

MPI_Alltoall与MPI_AllGahter相比较,区别在于:allgather操作中,不同进程向某一进程收集到的数据是完全相同的,而在alltoall中,不同的进程向某一进程收集到的数据是不同的。在每个进程的发送缓冲区中,为每个进程都单独准备了一块数据。
MPI_Alltoall(sendbuf,sendcount,sendtype,recvnbuf,recvcount,recvtype,comm);
在下面的例子中,我设置的数据块大小为10。每个进程发送缓冲区的内容定义如下:第i个进程发送缓冲区内第j块数据中的10个数据都为i*10+j。 若alltoall操作成功,则任意进程接收缓冲区内数据的十位应为0-proc_nums,个位应全为该进程的进程号。

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

int main(int argc,char **argv)
{
   
  int proc_nums,rank;
  int block_size=10;//block_size<=10

  int *send_buff;
  int *recv_buff;

  MPI_Init(&argc,&argv);
  MPI_Comm_rank(MPI_COMM_WORLD,&rank);
  MPI_Comm_size(MPI_COMM_WORLD,&proc_nums);

  send_buff=(int *)malloc(block_size*proc_nums*sizeof(int));
  recv_buff=(int *)malloc(block_size*proc_nums*sizeof(int));

  for(int i=0;i<proc_nums;i+&#
  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值