Cannon矩阵乘法的MPI实现和性能分析.doc

  1. 1、本文档共8页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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)

xuefei111 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档