資源描述:
《并行處理實(shí)驗(yàn)報(bào)告:用MPI實(shí)現(xiàn)的矩陣乘法的加速比分析(推薦文檔).doc》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、華中科技大學(xué)課程名稱并行處理實(shí)驗(yàn)名稱矩陣乘法的實(shí)現(xiàn)及加速比分析考生姓名李佩佩考生學(xué)號(hào)M系、年級(jí)計(jì)算機(jī)軟件與理論2013級(jí)類別碩士研究生考試日期2014年1月3日一.實(shí)驗(yàn)?zāi)康?)學(xué)會(huì)如何使用集群2)掌握怎么用并行或分布式的方式編程3)掌握如何以并行的角度分析一個(gè)特定的問題二.實(shí)驗(yàn)環(huán)境1)硬件環(huán)境:4核CPU、2GB內(nèi)存計(jì)算機(jī);2)軟件環(huán)境:WindowsXP、MPICH2、VS2010、XmanagerEnterprise3;3)集群登錄方式:通過遠(yuǎn)程桌面連接211.69.198.2,用戶名:pppusr,密碼:AE2Q3P0。三.實(shí)驗(yàn)內(nèi)容1.實(shí)驗(yàn)代碼編寫四個(gè).c文件,分
2、別為DenseMulMatrixMPI.c、DenseMulMatrixSerial.c、SparseMulMatrixMPI.c和SparseMulMatrixSerial.c,用于比較并行和串行矩陣乘法的加速比,以及稀疏矩陣和稠密矩陣的加速比。這里需要說明一下,一開始的時(shí)候我是把串、并行放在一個(gè)程序中,那么就只有兩個(gè).c文件DenseMulMatrix.c和SparseMulMatrix.c,把串行計(jì)算矩陣乘的部分放到了主進(jìn)程中,即procsID=0的進(jìn)程,但是結(jié)果發(fā)現(xiàn)執(zhí)行完串行后,再執(zhí)行并行就特別的慢。另外,對(duì)于稀疏矩陣的處理方面可能不太好,在生成稀疏矩陣的過程中
3、非0元素位置的生成做到了隨機(jī)化,但是在進(jìn)行稀疏矩陣乘法時(shí)沒有對(duì)矩陣壓縮,所以跟稠密矩陣乘法在計(jì)算時(shí)間上沒多大區(qū)別。方陣A和B的初始值是利用rand()和srand()函數(shù)隨機(jī)生成的。根據(jù)稀疏矩陣和稠密矩陣的定義,對(duì)于稀疏矩陣和稠密矩陣的初始化方法InitMatrix(int*M,int*N,intlen)會(huì)有所不同。這里需要說明一下,一開始對(duì)于矩陣A和B的初始化是兩次調(diào)用InitMatrix(int*M,intlen),生成A和B矩陣,但是隨后我發(fā)現(xiàn),由于兩次調(diào)用方法InitMatrix的時(shí)間間隔非常短,又由于srand()函數(shù)的特點(diǎn),導(dǎo)致生成的矩陣A和B完全一樣;然后
4、,我就在兩次調(diào)用之間加入了語句“Sleep(1000);”,加入頭文件“#include”,這樣生成的A、B矩陣就不一樣了,但很快問題又出現(xiàn)了,在Xshell中不能識(shí)別頭文件“#include”。所以,最后決定用下面的方法生成矩陣A和B,B是A的轉(zhuǎn)置。//稠密矩陣的生成方法voidInitMatrix(int*M,int*N,intlen){srand((unsigned)time(NULL));for(i=0;i5、6、進(jìn)程數(shù)procsNum,對(duì)于串行計(jì)算,只需要np=1;輸出:程序的執(zhí)行時(shí)間。在WindowsXP下使用MicrosoftVisualStudio2010編程,由于稀疏矩陣和稠密矩陣的代碼只是初始化部分不同,所以以稠密矩陣乘法為例,列出并行和串行的源代碼。并行計(jì)算的矩陣乘法源代碼:DenseMulMatrixMPI.c#include#include#include#include#defineLength1000int*A,*B,*C,*buffer,*ans;inttemp,i,j,k;intproc
7、sID,procsNum,line;doublestartTime,endTime,totalTime;voidInitMatrix(int*M,int*N,intlen);//實(shí)現(xiàn)部分見上面voiddel(){free(A);free(B);free(C);free(buffer);free(ans);}intmain(intargc,char*argv[]){MPI_Statusstatus;MPI_Init(&argc,&argv);MPI_Comm_rank(MPI_COMM_WORLD,&procsID);//獲取當(dāng)前進(jìn)程號(hào)MP