MPI_Allreduce: 在之前的积分计算中,我们的方法是将最终结果汇聚到0号进程中,但是如何让每一个进程都能保存最终的结果呢? MPI 提供了这样的一个函数MPI_Allreduce. 这个操作与MPI_reduce 相同,只是少了dest_process 参数,因为所有的进程都能接受到这个结果。 广播: 字面意思,在一个集和通信中,如果属于一个进程的数据被发送到通信子中所有的进程,这样的集和通信就叫做广播。 MPI 提供这样的一个广播函数。 简单来说,进程号为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号进程读入整个向量,但只将分量发送给需要分量的其他进程。 如果通信子包含comm_sz个进程,那么此API将会把send_buf_p 所引用的数据分成comm_sz 份,第一份是0号进程,第二分给1号进程,其他以此类推。但是这种分发方式只适用于块划分的方法。 关于聚焦: MPI_gather 函数将向量的所有分量都收集到0号进程上。 在0号进程中,由send_buf_p所引用的内存区的数据存储在recv_buf_p 的第一个块中,在1号进程中,由send_buf_p所引用的内存区数据存储在recv_buf_p 的第二个块里,以此类推。 全局聚焦函数: 将一个向量通知到所有的进程。
查看原文: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/
MPI 几个重要的的API
最新推荐文章于 2024-07-09 06:00:00 发布