MPI数据分发实例——向量求和的并行实现(C++)

本文通过C++介绍如何使用MPI进行并行计算,具体应用在向量求和的问题上。首先阐述向量求和的基本原理,接着讨论数据的三种基本划分方式:块划分、循环划分和块-循环划分,并重点讲解MPI的MPI_Scatter函数用于数据分发。接着实现并行化向量求和,然后利用MPI_Gather函数将计算结果收集到主进程并输出。最终提供完整代码,展示在Windows环境下用VS2019编译运行的情况。
摘要由CSDN通过智能技术生成

在实例2中,我们体会了进程之间是如何通信的

实际上,在大规模并行计算中,我们常涉及到如何将数据分发给各个进程,进程完成后又如何将数据重新聚合回来

在这个实例中,我们将体会MPI是如何高效简洁的实现数据的分发和聚集操作的

向量求和的基本原理

给定向量x (x_{0},x_{1},...,x_{n})和向量y (y_{0},y_{1},...,y_{n}),求两个向量之和z,计算过程如下:

x+y =(x_{0}+y_{0},x_{1}+y_{1},...,x_{n}+y_{n})=(z_{0},z_{1},...,z{n}) = z

对于一个串行化程序,其代码如下:

void Vector_Sum(double x[], double y[], double z[], int n){
    for(int i=0; i<n; i++){
        z[i] = x[i] + y[i];
    }
}

数据的基本划分方式

如何将上述代码并行化呢?一个简单的思路就是平分整个数组,每个进程计算相同大小的分量,最后再利用进程通信将结果送至主进程

上述问题的关键在于如何划分数据,一般情况下有三种划分方式:块划分、循环划分、块-循环划分

1. 块划分:连续划分。假设数组大小为12,有3个进程,则0号进程分到0-3号连续四个数据、1号进程分到4-7号连续四个数据、2号进程分到8-11号连续四个数据

2. 循环划分:取余划分。如上面的假设情况,将0/3/6/9这三个数据分至0号进程、将1/4/7/10这四个数据分至1号进程、将2/5/8/11这个四个数据分至2号进程

3. 块-循环划分:分块后取余划分。先将连续n个数据打包为一个块,再将块号取余;假设2个为一块,则0/1分为0号块、2/3为1号块、4/5为3号块;则0/1/6/7分至0号进程、2/3/8/9分至1号进程、3/4/10/11分至3号进程

散射函数

在MPI中,提供了第一种划分方法——块划分的实现函数MPI_Scatter,其函数原型如下所示:

int MPI_Scatter(
    void*         send_buf_p // 发送进程的消息地址
    int           send_count // 发送进程的消息大小
    MPI_Datatypee send_type  // 发送进程的数据类型
    void*         recv_buf_p // 接收进程的消息地址
    int           recv_count // 接收进程的消息大小
    MPI_Datatyp
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值