資源簡(jiǎn)介
矩陣相乘并行程序設(shè)計(jì)與實(shí)現(xiàn),可以實(shí)現(xiàn)多個(gè)線程,基于MPI平臺(tái)

代碼片段和文件信息
#include?“stdio.h“
#include?“stdlib.h“
#include?“mpi.h“
#define?intsize?sizeof(int)
#define?floatsize?sizeof(float)
#define?charsize?sizeof(char)
#define?A(xy)?A[x*K+y]
#define?B(xy)?B[x*N+y]
#define?C(xy)?C[x*N+y]
#define?a(xy)?a[x*K+y]
#define?b(xy)?b[x*n+y]
#define?buffer(xy)?buffer[x*n+y]?/*?此宏用來簡(jiǎn)化對(duì)標(biāo)號(hào)為奇數(shù)的處理器內(nèi)的緩沖空間的訪問?*/
#define?c(lxy)?c[x*N+y+l*n]
float?*a*b*c*buffer;
int?s;
float?*A*B*C;????????????/*?A[MK]B[PN].正確的情況下K應(yīng)該等于P否則無法進(jìn)行矩陣相乘?*/
int?MNKP?;
int?mn;
int?myid;
int?p;?????????????????????/*?保存工作站集群中處理器數(shù)目,也即通信子大小?*/
FILE?*dataFile;????????????/*?用于讀取輸入文件內(nèi)容和將計(jì)算結(jié)果輸出到結(jié)果文件的臨時(shí)文件指針?*/
MPI_Status?status;
double?time1;
double?starttimeendtime;
/*
?*?函數(shù)名:?readData
?*?功能:??此函數(shù)被rankID為0的進(jìn)程調(diào)用,負(fù)責(zé)從dataIn.txt文件中讀入
?*?????????A[MK]B[PN]兩個(gè)相乘矩陣的數(shù)據(jù),并為結(jié)果矩陣C[MN]分配空間。
?*?????????其中C[NN]=A[MK]*B[PN]
?*?輸入:??無
?*?返回值:無
?*/
void?readData()
{
????int?ij;
????starttime?=?MPI_Wtime();
????dataFile=fopen(“dataIn.txt““r“);
????fscanf(dataFile“%d%d“?&M?&K);??????????????/*?讀取矩陣A的行,列數(shù)MK?*/
????A=(float?*)malloc(floatsize*M*K);?????????????/*?為矩陣A分配空間?*/
????for(i?=?0;?i?????{
????????for(j?=?0;?j?????????{
????????????fscanf(dataFile“%f“?A+i*K+j);
????????}
????}
????fscanf(dataFile“%d%d“?&P?&N);??????????????/*?讀取矩陣B的行,列數(shù)PN?*/
????if?(K!=P)?????????????????????????????????????/*?K應(yīng)該等于P否則矩陣無法相乘?*/
????{
????????printf(“the?input?is?wrong\n“);
????????exit(1);
????}
????B=(float?*)malloc(floatsize*K*N);?????????????/*?為矩陣B分配空間?*/
????for(i?=?0;?i?????{
????????for(j?=?0;?j?????????{
????????????fscanf(dataFile“%f“?B+i*N+j);
????????}
????}
????fclose(dataFile);
????printf(“Input?of?file?\“dataIn.txt\“\n“);
????printf(“%d\t?%d\n“M?K);?????????????????????/*?輸出A矩陣的維數(shù)?*/
????for(i=0;i ????{
????????for(j=0;j ????????printf(“\n“);
????}
????printf(“%d\t?%d\n“K?N);?????????????????????/*?輸出B矩陣的維數(shù)?*/
????for(i=0;i ????{
????????for(j=0;j ????????printf(“\n“);
????}
????C=(float?*)malloc(floatsize*M*N);?????????????/*?為結(jié)果矩陣C[MN]分配空間?*/
}
/*
?*?函數(shù)名:?gcd
?*?功能:??此函數(shù)用來返回兩個(gè)整數(shù)的不大于group_size的最大公因子
?*?輸入:??MN:要求最大公因數(shù)的兩個(gè)整數(shù)
?*?????????group_size所求公因子必須小于此參數(shù),此參數(shù)代表用戶指定的通信子大小
?*?返回值:M和N的不大于group_size的最大公因子
?*/
int?gcd(int?Mint?Nint?group_size)
{
????int?i;
????for(i=M;?i>0;?i--)
????{
????????if((M%i==0)&&(N%i==0)&&(i<=group_size))
????????????return?i;
????}
????return?1;
}
/*
?*?函數(shù)名:?printResult
?*?功能:此函數(shù)被rankID為0的進(jìn)程調(diào)用,用來將ABC矩陣打印輸出給用戶,
?*???????并輸出用于分發(fā)數(shù)據(jù)和并行計(jì)算的時(shí)間
?*?輸入:無
?*?返回值:無
?*/
void?printResult()
{
????int?ij;
????printf(“\nOutput?of?Matrix?C?=?AB\n“);
????for(i=0;i ????{
????????for(j=0;j ????????printf(“\n“);
????}
????endtime=MPI_Wtime();
????printf(“\
?屬性????????????大小?????日期????時(shí)間???名稱
-----------?---------??----------?-----??----
?????文件???????86693??2017-11-03?21:42??matrix\dataIn?-?副本.txt
?????文件??????381648??2017-11-03?22:01??matrix\dataIn.txt
?????文件???????86693??2017-11-03?21:42??matrix\dataIn128.txt
?????文件????????9506??2017-09-04?17:16??matrix\matrix.c
?????文件?????????675??2017-09-04?17:16??matrix\readme.txt
?????文件???????20267??2017-11-04?01:10??matrix\時(shí)間分析表.xlsx
?????目錄???????????0??2017-11-04?01:10??matrix\
評(píng)論
共有 條評(píng)論