張亮 趙妍
摘要:研究了矩陣相乘的并行算法,基于MPI消息傳遞庫采用C語言實(shí)現(xiàn)了該算法,講解了矩陣并行乘法中的矩陣劃分方法和消息傳遞方法。
關(guān)鍵詞:并行計(jì)算;MPI;矩陣相乘;消息傳遞
中圖分類號:TP31? ? ? 文獻(xiàn)標(biāo)識碼:A
文章編號:1009-3044(2019)23-0281-02
開放科學(xué)(資源服務(wù))標(biāo)識碼(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 引言
并行計(jì)算又叫高性能計(jì)算,在許多領(lǐng)域的都發(fā)揮著積極的巨大的作用,如物理、化學(xué)、材料等科學(xué)中分子尺度的模擬,天文學(xué)和地球科學(xué)中銀河系的演化,,天氣預(yù)報(bào),地球數(shù)值模擬,全球長期氣候變化的模型等[1]。這些研究都對計(jì)算機(jī)的運(yùn)算速度提出了很高的要求,也只有高性能的并行計(jì)算才能滿足這些要求。在并行計(jì)算中,集群系統(tǒng)以廉價(jià)高效等優(yōu)點(diǎn)頗受人們青睞,是當(dāng)今的主流。并行處理的軟件支持環(huán)境包括基于OpenMP和MPI(Message Passing Interface)的各種環(huán)境。OpenMP主要用于共享式計(jì)算環(huán)境,而MPI則主要用于分布式計(jì)算環(huán)境[1]。本文實(shí)現(xiàn)了基于MPI的矩陣乘法運(yùn)算。
2 算法描述
設(shè)有L×M矩陣A和M×N矩陣B相乘,得到結(jié)果為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行相關(guān),而與其他行無關(guān),所以具有并行計(jì)算的可行性。
假設(shè)有n個(gè)進(jìn)程并行計(jì)算,則把矩陣A按行分成n個(gè)M/n行的小矩陣,每個(gè)小矩陣與B進(jìn)行矩陣乘法,得到n個(gè)M/n行,N列的矩陣,將這些矩陣合并到一起就得到最終的結(jié)果。
3 算法實(shí)現(xiàn)
根據(jù)上面的算法,在VC6中用MPI的C語言實(shí)現(xiàn)為如下的程序:
#include "mpi.h"
#include
#include
#define l 4/*第一個(gè)矩陣的行*/
#define m 3/*第一個(gè)矩陣的列,第二個(gè)矩陣的行*/
#define n 2/*第二個(gè)矩陣的列*/
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};/*保存最終結(jié)果*/
int d[l][n]={0};/*各個(gè)分進(jìn)程保存中間結(jié)果*/
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個(gè)進(jìn)程,l行,每個(gè)進(jìn)程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[][]保存該進(jìn)程計(jì)算結(jié)果*/ } printf("d[%d][%d]=%d\t",x,y,d[x][y]);