- 1、本文档共8页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
#include stdio.h
#include mpi.h
#include math.h
#include stdlib.h
#include time.h
#include memory.h
MPI_Status status;
double **A, **B, **C; //C=A*B
double *a,*b,*c; //各个进程的缓冲区
int n; //矩阵的行列数
int np; //每个进程控制的小矩阵的行列数
int p,rank; //进程个个数、当前进程的编号,笛卡尔进程编号
double *tempa, *tempb;
void ProduceABC(); //在根处理器中生成矩阵AB初始化矩阵C
void PrintABC();//输出结果
void ScatterAB();// 分发矩阵AB中的元素到各个进程中
void MainProcess(); //cannon算法的主过程
void collectC(); //收集结果矩阵C
void Mutiply(); //矩阵相乘
void Printab();
void Printc();
int main(int argc, char *argv[])
{
int i;
double starttime,endtime;
MPI_Init(argc, argv);
MPI_Comm_size(MPI_COMM_WORLD, p);
MPI_Comm_rank(MPI_COMM_WORLD, rank);
if(rank == 0)
{
printf(请输入矩阵的行列数n= );
fflush(stdout);
scanf_s(%d, n);
printf(\n);
}
MPI_Bcast(n, 1, MPI_DOUBLE, 0, MPI_COMM_WORLD);
// n = atoi(argv[1]);
np = n/(int)sqrt(p);
a = (double*)malloc(np*np*sizeof(double));
b = (double*)malloc(np*np*sizeof(double));
c = (double*)malloc(np*np*sizeof(double));
memset(c, 0, np*np*sizeof(double));
tempa = (double*)malloc(np*np*sizeof(double));
tempb = (double*)malloc(np*np*sizeof(double));
if(rank == 0)
{
//在根处理器中为矩阵ABC分配空间
A = (double**)malloc(n*sizeof(double*));
B = (double**)malloc(n*sizeof(double*));
C = (double**)malloc(n*sizeof(double*));
for(i = 0; i n; i++)
{
A[i] = (double*)malloc(n*sizeof(double));
B[i] = (double*)malloc(n*sizeof(double));
C[i] = (double*)malloc(n*sizeof(double));
}
ProduceABC(); //在根处理器中随机生成矩阵AB,初始化矩阵C
ScatterAB();// 分发矩阵AB中的元素到各个进程中
}
else
{
MPI_Recv(a, np*np, MPI_DOUBLE, 0, 1, MPI_COMM_WORLD, status);
MPI_Recv(b, np*np, MPI_DOUBLE, 0, 2, MPI_COMM_WORLD, status);
}
starttime=MPI_Wtime(); //开始时间
MainProcess(); //cannon算法的主过程
if(rank == 0)
{
collectC(); //收集结果矩阵C
PrintABC(); //输出结果
endtime=MPI_Wtime();
printf(time used: %lf\n,endtime - starttime);
for(i = 0; i n; i++)
{
free(A[i]);
free(B[i]);
free(C[i]);
}
free(A);
free(B);
free(C);
}
else
{
文档评论(0)