基于MPI的矩阵相乘并行计算的一种探究
2019-11-03张亮赵妍
张亮 赵妍
摘要:研究了矩阵相乘的并行算法,基于MPI消息传递库采用C语言实现了该算法,讲解了矩阵并行乘法中的矩阵划分方法和消息传递方法。
关键词:并行计算;MPI;矩阵相乘;消息传递
中图分类号:TP31 文献标识码:A
文章编号:1009-3044(2019)23-0281-02
开放科学(资源服务)标识码(OSID):
MPI-based Parallel Computation of the Multiple of matrixs
ZHANG Liang, ZHAO Yan
(Ningxia Financial Vocational and Technical College, Ningxia 750021, China)
Abstract: Parallel Computation of the multiple of matrixs was studied, based on MPI and C Language the algorithm was realized. Partition of matrix and message passing in the algorithm was addressed.
Key words: Parallel Computation; MPI; Multiple of matrixs; Message Passing
1 引言
并行計算又叫高性能计算,在许多领域的都发挥着积极的巨大的作用,如物理、化学、材料等科学中分子尺度的模拟,天文学和地球科学中银河系的演化,,天气预报,地球数值模拟,全球长期气候变化的模型等[1]。这些研究都对计算机的运算速度提出了很高的要求,也只有高性能的并行计算才能满足这些要求。在并行计算中,集群系统以廉价高效等优点颇受人们青睐,是当今的主流。并行处理的软件支持环境包括基于OpenMP和MPI(Message Passing Interface)的各种环境。OpenMP主要用于共享式计算环境,而MPI则主要用于分布式计算环境[1]。本文实现了基于MPI的矩阵乘法运算。
2 算法描述
设有L×M矩阵A和M×N矩阵B相乘,得到结果为L×N的矩阵C。记矩阵A、B、C的第i行第j列的元素为Aij(i=0……L,j=0……M),Bij(i=0……M,j=0……N),Cij(i=0……L,j=0……N)。则:
Cij=
可见Cij只与A和B的第i行相关,而与其他行无关,所以具有并行计算的可行性。
假设有n个进程并行计算,则把矩阵A按行分成n个M/n行的小矩阵,每个小矩阵与B进行矩阵乘法,得到n个M/n行,N列的矩阵,将这些矩阵合并到一起就得到最终的结果。
3 算法实现
根据上面的算法,在VC6中用MPI的C语言实现为如下的程序:
#include "mpi.h"
#include
#include
#define l 4/*第一个矩阵的行*/
#define m 3/*第一个矩阵的列,第二个矩阵的行*/
#define n 2/*第二个矩阵的列*/
main(int argc,char *argv[])
{
int a[l][m]={{2,3,5},{4,5,7},{6,3,6},{1,6,7}};
int b[m][n]={{2,4},{3,6},{8,5}};
int c[l][n]={0};/*保存最终结果*/
int d[l][n]={0};/*各个分进程保存中间结果*/
int numproces,id,i,j,k,p,q,s,t,x,y;
MPI_Status status;
MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD,&numproces);
MPI_Comm_rank(MPI_COMM_WORLD,&id);
printf("Process %d :\n",id);
if(id>0)
{/*numproces个进程,l行,每个进程l/numproces行,
从(id-1)*l/numproces行到id*l/numproces行*/
for(x=0,i=(id-1)*l/numproces;i { for(y=0,j=0;j { for(k=0;k { d[x][y]=d[x][y]+a[i][k]*b[k][j];/*d[][]保存该进程计算结果*/ } printf("d[%d][%d]=%d\t",x,y,d[x][y]);