集合通信对比点对点通信来说,确实要方便许多,基本上不需要考虑各个进程该怎么发送,该怎么接收的问题,只要是使用一个通信子,函数接口自己就完成了。从进程的角度考虑,集合通信在分配任务量的时候更加平均,使各个进程的工作量更加相同,减少让一个进程死干活,其他进程在旁边看的情况。下面还是先上完整代码:
#include<bits/stdc++.h>
#include<mpi.h>
using namespace std;
const int maxn=10;
//计算x,y两个数组对应位的和,存入第三个数组z
bool Parallel_vector_sum(
double local_x[], //加数组
double local_y[], //被加数组
double local_z[], //存储和的数组
int local_n //加的个数
)
{
for(int local_i=0;local_i<local_n;local_i++){
local_z[local_i] = local_x[local_i]+local_y[local_i];
}
return true;
}
//从键盘读取数组
bool Read_vector(
double local_a[], //存储数据的数组,OUT
int local_n, //每个进程需要分配的数量
int n, //读取的总个数
string vec_name, //数组的名字
int my_rank, //进程号
MPI_Comm comm //通信子
)
{
double* a = NULL;
if(my_rank==0){
//输入数组
a = new double[n];
cout<<"Enter the vector "<<vec_name<<