MPI_Allgatherv函数讲解

MPI_Allgatherv函数讲解

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

/*
 * 收集所有任务的数据并将组合数据传送到所有任务
 * int MPI_Allgatherv(const void * sendbuf,int sendcount,MPI_Datatype sendtype,
 *      void * recvbuf,const int * recvcounts,const int * displs,
 *      MPI_Datatype recvtype,MPI_Comm comm) 
 *
 * sendbuf:要发送内容的起始地址
 * sendcount:要发送的数量
 * sendtype:要发送数据的类型
 * recvbuf:接收数据要存放的单元的地址
 * recvcounts:这是一个整数数组,包含从每个进程要接收的数据量,比如{0, 1} 从0号进程接收0个,从1号进程接收1个 
 * displs:这是一个整数数组,包含存放从每个进程接收的数据相对于recvbuf的偏移地址
 * recvtype:要接收的数据类型
 * comm:通信集合
 */

int main(int argc, char* argv[])
{
    int i;
    int rank, nproc;
    int isend[3], iscnt, irecv[6];
    // 从每个进程接收数据的个数
    int ircnt[3] = {1,2,3};
    // 存放数据的偏移地址
    int idisp[3] = {0,1,3};

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

    if ( rank == 0 ) 
        printf(" This program must run with 3 processes: np = 3\n");

    for(i=0; i< rank + 1; i++)
    {
        isend[i] = rank + 1;
    }

    // o号进程发送1个,1号发送两个,2号发送3个,总共6个
    iscnt = rank + 1;
    MPI_Allgatherv(isend, iscnt, MPI_INT, irecv, ircnt, idisp, MPI_INT, MPI_COMM_WORLD);

    for(i=0; i<6; i++)
        printf("My rank = %d irecv = %d\n", rank, irecv[i]);

    MPI_Finalize();
    return 0;
}

最后,欢迎大家加入MPI-OpenMP技术交流群,群号:288514428
点击链接加入群聊【MPI-OpenMP技术交流群】:https://jq.qq.com/?_wv=1027&k=5HpBfVg

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值