MPI_Gatherv函数的应用实例

本文通过实际可运行的代码示例,详细介绍了MPI_Gatherv函数的使用方法及其在并行计算中的应用,展示了如何有效地进行非均匀数据收集操作。
摘要由CSDN通过智能技术生成

一下所有代码都是可以运行,执行成功的。

/************************************    
// 程序功能: MPI_Gatherv函数的测试          
// 作 成 者:Erick.Wang     
// 作成日期:2016/12/13       
// 程序说明:
************************************/

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

#pragma comment(lib,"mpi.lib")
#pragma message("**** MPI_Gatherv *******")
/***********************************************************************
int MPI_Gatherv(void* sendbuf, int sendcount, MPI_Datatype sendtype, 
           void* recvbuf, int *recvcounts, int *displs, 
              MPI_Datatype recvtype, int root, MPI_Comm comm)
    IN     sendbuf      发送消息缓冲区的起始地址(可变)
    IN     sendcount    发送消息缓冲区中的数据个数(整型)
    IN     sendtype     发送消息缓冲区中的数据类型(句柄)
    OUT    recvbuf      接收消息缓冲区的起始地址(可变,仅对于根进程)
    IN     recvcounts   整型数组(长度为组的大小), 其值为从每个进程接收的数据个数(仅对于根进程)
    IN     displs       整数数组,每个入口i表示相对于recvbuf的位移,
    此位移处存放着从进程i中接收的输入数据(仅对于根进程)
    IN     recvtype     接收消息缓冲区中数据类型(仅对于根进程)(句柄)
    IN     root         接收进程的序列号(句柄)
    IN     comm         通信子(句柄)

    它可以从不同的进程接收不同数量的数据
***********************************************************************/
int main(int argc,char* argv[])
{
#if 1
    int nprocs,rank;

    MPI_Init(&argc,&argv);
    MPI_Comm_rank(MPI_COMM_WORLD,&rank);
    MPI_Comm_size(MPI_COMM_WORLD,&nprocs);
    /***********************************************************************
        每个进程向根进程发送100个整型数,但在接收端设置每个集合(100个数据)的步长,
        用MPI_Gatherv函数和displs参数来实现,假设步长≥100
    ***********************************************************************/ 
    const int n = 100;
    int sendBuf[n],*recvBuf;
    int *displs,stride,*recvCount; //stride:步长
    //数据初始化
    for (int i=0; i<n; i++){
        sendBuf[i] = i;
    }

    //设置步长、偏移量、接收数据量
    stride = n;
    displs    = (int *)malloc(sizeof(int)*nprocs); //一个进程一个偏移
    recvCount = (int *)malloc(sizeof(int)*nprocs); //一个进程一个接收数据量
    for (int i=
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值