MPI 几个重要的的API

MPI_Allreduce:

在之前的积分计算中,我们的方法是将最终结果汇聚到0号进程中,但是如何让每一个进程都能保存最终的结果呢?

MPI 提供了这样的一个函数MPI_Allreduce.

2017-01-25 22-40-09 的屏幕截图

这个操作与MPI_reduce 相同,只是少了dest_process 参数,因为所有的进程都能接受到这个结果。

 

广播:

字面意思,在一个集和通信中,如果属于一个进程的数据被发送到通信子中所有的进程,这样的集和通信就叫做广播。

MPI 提供这样的一个广播函数。

2017-01-25 22-45-17 的屏幕截图

简单来说,进程号为source_proc 的进程将data_p 所引用的内存内容发送给了通信子COMM中的所有进程。

例如一个修改的GET_input.
#include<stdio.h>
#include<mpi.h>


void Get_void(){

    int my_rank;
    int comm_sz;
    double * a_p;
    double * b_p;
    int *    n_p;

    if(my_rank == 0){
        scanf("%lf %lf %d\n",a_p,b_p,n_p);
    }
    MPI_Bcast(a_p,1,MPI_DOUBLE,0,MPI_COMM_WORLD);
    MPI_Bcast(b_p,1,MPI_DOUBLE,0,MPI_COMM_WORLD);
    MPI_Bcast(n_p,1,MPI_INT,0,MPI_COMM_WORLD);



}
数据划分方法: 块划分,循环划分,块-循环划分。 散射: 散射也就是数据分发,所以有这样的一个函数,0号进程读入整个向量,但只将分量发送给需要分量的其他进程。 2017-01-25 23-01-57 的屏幕截图 如果通信子包含comm_sz个进程,那么此API将会把send_buf_p 所引用的数据分成comm_sz 份,第一份是0号进程,第二分给1号进程,其他以此类推。但是这种分发方式只适用于块划分的方法。 关于聚焦: MPI_gather 函数将向量的所有分量都收集到0号进程上。 2017-01-25 23-12-49 的屏幕截图 在0号进程中,由send_buf_p所引用的内存区的数据存储在recv_buf_p 的第一个块中,在1号进程中,由send_buf_p所引用的内存区数据存储在recv_buf_p 的第二个块里,以此类推。 全局聚焦函数: 将一个向量通知到所有的进程。 2017-01-25 23-20-11 的屏幕截图  

查看原文:http://zmrlinux.com/2017/01/25/mpi-%e5%87%a0%e4%b8%aa%e9%87%8d%e8%a6%81%e7%9a%84%e7%9a%84api/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值