网站首页  词典首页

请输入您要查询的论文:

 

标题 基于MPI的矩阵相乘并行计算的一种探究
范文

    张亮 赵妍

    

    摘要:研究了矩阵相乘的并行算法,基于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=(i=0……L,j=0……N)? ? ? ? ? (1)

    可见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]);

随便看

 

科学优质学术资源、百科知识分享平台,免费提供知识科普、生活经验分享、中外学术论文、各类范文、学术文献、教学资料、学术期刊、会议、报纸、杂志、工具书等各类资源检索、在线阅读和软件app下载服务。

 

Copyright © 2004-2023 puapp.net All Rights Reserved
更新时间:2025/3/23 5:36:06