mpi学习日志(10):mpi4py实现简单并行矩阵乘法 |
您所在的位置:网站首页 › cannon算法的mpi程序 › mpi学习日志(10):mpi4py实现简单并行矩阵乘法 |
除了之前利用gather求π之外,我们就没有写过mpi程序的实例. 今天我们就尝试用mpi去写一个简单的并行矩阵乘法,虽说是并行,但不是使用经典的分治去处理,而只是简单地每个进程计算一个格子的值.
计算的式子是这样的,3*2的矩阵A乘上2*3的矩阵B,得到3*3的矩阵C. 这样的话,我们就需要9个进程去计算每个格子的值. 问题分析: 我们假设一开始只有进程0拥有矩阵A和B的数据,也就是说进程0要把数据分发到各个进程. 但我们知道,每个格子并不需要整个矩阵,它只需要某行或某列即可. 具体来说,第i行第j列的格子,需要矩阵A的第i行和矩阵B的第j列. 按照这样分发的话,我们需要设计复杂的分发过程,而不是直接让进程0广播出去. 算法设计: 我们可以使用Split,按行把进程分割成3个新的通信组,又按列分割成3个新通信组. 这样的话,每个进程都有3个通信子,全局通信子,行通信子,列通信子. 我们注意到,行通信组里的进程需要相同的行,列通信组里的进程需要相同的列. 那么,只要我们行首和列首拥有对应的行和列,它就可以直接广播这个行和列. 怎么让行首和列首获得相应的行和列?很简单,用散播就行. 我们让进程0在第0列散播A的行,让进程0在第0行散播B的列,就行了! 而对于结果,直接用gather收集起来.最后进程 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |