MPI学习-规约函数MPI_Allreduce

全局规约函数MPI_Allreduce:
将所有的发送信息进行同一个操作,所有进程均接收信息;
相当于先做MPI_Reduce,然后再做MPI_Scatter。

语法规则:

int MPI_Alleduce(
void *input_data, /*指向发送消息的内存块的指针 */
void *output_data, /*指向接收(输出)消息的内存块的指针 */
int count,/*数据量*/
MPI_Datatype datatype,/*数据类型*/
MPI_Op operator,/*规约操作*/
MPI_Comm comm);/*通信器,指定通信范围*/

举例:

#include "stdafx.h"
#include 
#include 
#include 

#define N 3

int main(int argc, char *argv[])
{
    int i, myrank, nprocs;
    int *send_buffer=new int[N];
    int *recv_buffer = new int[N];

    MPI_Init(&argc, &argv);
    MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
    MPI_Comm_size(MPI_COMM_WORLD, &nprocs);

    for (i = 0; i < N; i++)
    {
        send_buffer[i] = myrank;
    }

    MPI_Allreduce(send_buffer, recv_buffer, N, MPI_INT, MPI_MAX,
        MPI_COMM_WORLD);

    for (i = 0; i < N; i++)
    {
        printf("myrank = %d, recv_buffer[%d] = %d\n", myrank, i,
            recv_buffer[i]);

    }

    MPI_Finalize();
    return 0;
}

进程总数为4的时候的输出:
MPI学习-规约函数MPI_Allreduce_第1张图片

注意:

send_buffer与recv_buffer 的datatype、datasize相同。

你可能感兴趣的:(C++,并行计算)