MPI入门学习-MPI_Gather and MPI_Allgather
非常有好的入门介绍:, 建议快速浏览!
如果我们需要在不同进程间完成数据的聚集操作,有如下两种可以选择,然后我理解的区别是:MPI_Allgatherv传递的数组个数可以不一样,可以自己设置每个进程中的数量(即偏移量);MPI_Allgather传递的数组长度都一样。 具体使用可以分别参照下面的两篇博客:
下面放一个MPI_Allgather的例子(每个work发送3个数据):
/**
* 全收集函数示例, 每个进程都拥有收集结果,
* 相当于以每个进程作为根进程对同样的数据执行一次收集操作.
*/
// #include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <mpi.h>
#define N 3
int
main(int argc, char *argv[])
{
int i, myrank, nprocs;
int *send_buffer;
int *recv_buffer;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
MPI_Comm_size(MPI_COMM_WORLD, &nprocs);
send_buffer = new int[N];
for (i = 0; i < N; i++)
send_buffer[i] = myrank*10 + i;
// 在每个进程上, recv_buffer的大小为所有进程的send_buffer大小之和.
recv_buffer =new int[nprocs * N];
MPI_Allgather(send_buffer, N, MPI_INT,
recv_buffer, N, MPI_INT, MPI_COMM_WORLD);
for (i = 0; i < nprocs * N; i++)
fprintf(stderr, "myrank = %d, recv_buffer[%d] = %d
", myrank, i, recv_buffer[i]);
fprintf(stderr, "
");
delete[]recv_buffer;
delete[]send_buffer;
MPI_Finalize();
return 0;
}
linux下运行命令(文件名:test3.cc): 编译:mpicxx -g -Wall -o test3.o test3.cc 运行:mpirun -n 4 ./test3.o 效果如下:
myrank = 0, recv_buffer[0] = 0 myrank = 0, recv_buffer[1] = 1 myrank = 0, recv_buffer[2] = 2 myrank = 0, recv_buffer[3] = 10 myrank = 0, recv_buffer[4] = 11 myrank = 0, recv_buffer[5] = 12 myrank = 0, recv_buffer[6] = 20 myrank = 0, recv_buffer[7] = 21 myrank = 0, recv_buffer[8] = 22 myrank = 0, recv_buffer[9] = 30 myrank = 0, recv_buffer[10] = 31 myrank = 0, recv_buffer[11] = 32 myrank = 1, recv_buffer[0] = 0 myrank = 1, recv_buffer[1] = 1 myrank = 1, recv_buffer[2] = 2 myrank = 1, recv_buffer[3] = 10 myrank = 1, recv_buffer[4] = 11 myrank = 1, recv_buffer[5] = 12 myrank = 1, recv_buffer[6] = 20 myrank = 1, recv_buffer[7] = 21 myrank = 1, recv_buffer[8] = 22 myrank = 1, recv_buffer[9] = 30 myrank = 1, recv_buffer[10] = 31 myrank = 1, recv_buffer[11] = 32 myrank = 2, recv_buffer[0] = 0 myrank = 2, recv_buffer[1] = 1 myrank = 2, recv_buffer[2] = 2 myrank = 2, recv_buffer[3] = 10 myrank = 2, recv_buffer[4] = 11 myrank = 2, recv_buffer[5] = 12 myrank = 2, recv_buffer[6] = 20 myrank = 2, recv_buffer[7] = 21 myrank = 2, recv_buffer[8] = 22 myrank = 2, recv_buffer[9] = 30 myrank = 2, recv_buffer[10] = 31 myrank = 2, recv_buffer[11] = 32 myrank = 3, recv_buffer[0] = 0 myrank = 3, recv_buffer[1] = 1 myrank = 3, recv_buffer[2] = 2 myrank = 3, recv_buffer[3] = 10 myrank = 3, recv_buffer[4] = 11 myrank = 3, recv_buffer[5] = 12 myrank = 3, recv_buffer[6] = 20 myrank = 3, recv_buffer[7] = 21 myrank = 3, recv_buffer[8] = 22 myrank = 3, recv_buffer[9] = 30 myrank = 3, recv_buffer[10] = 31 myrank = 3, recv_buffer[11] = 32
