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