一下所有代码都是可以运行,执行成功的。
/************************************
// 程序功能: 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=