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
经验分享 程序员 微信小程序 职场和发展