在上面一篇文章中,有一个利用梯形积分求面积的程序, 在程序中,线程0用来接受每一个小小梯形的面积然后在将所有梯形求和,很明显, 当数据传到线程0时,其他线程就停止了工作,这样造成所有求和都是由线程0来进行的。 为了让尽量多的线程进行工作,可以利用归约的思想:
因为对于大小不一样的树形结构来说,编写一个最佳的程序是很困难的。所以可以直接利用MPI 的库函数. MPI_Reduce , 在MPI_Reduce中,所有的进程都需要通信,所以称这样的通信函数为集合通信函数。 MPI_Send和MPI_Recv为点对点通信。
//API:
int MPI_Reduce(void* input_data_p,void*output_data_p, int count,MPI_Datatype datatype,MPI_Op operator, int dest_process,MPI_Comm comm);
// operator可以有:求最大值 MPI_MAX 最小值 求累加和 累乘积 逻辑操作
// 求和语句
MPI_Reduce(&local_int,&total_int,1,MPI_DOUBLE,MPI_SUM,0,MPI_COMM_WORLD);
//另外有时候需要将得到的结果放入所有的线程中
MPI_Allreduce(void* input_data_p,void*o