1、并行计算实验二报告广东技术师范学院实验报告学院:计算机科学学院专业:计算机科学与技术班级:成绩:姓名:学号:组别:组员:实验地点:工业中心203实验日期:指导教师签名:预习情况操作情况考勤情况数据处理情况实验 (二) 项目名称: 并行程序设计 一、实验目的在一个局域网中建立能够互相通信的两台计算机,实现两台计算机并行运算。二、实验内容:1编写一个计算矩阵乘积的并行程序。统计采用不同优化选项编译该程序生成的代码的运行时间,根据程序的计算量和运行时间计算出程序的实际浮点性能(以MFLOPS为单位)和效率(实际性能/处理器峰值性能),并将结果填写在下表中(根据需要加行)。提示:用“time程序名”可
2、以得到程序的运行时间。优化选项运行时间/s性能/MFLOPS效率/% 减少矩阵初始化的循环次数 0.000978616 0.637 51.9 去掉不相关的输出 0.00102164 0.956 77.9源程序代码:#include mpi.h#include #include#include #include const int N=10, M=10,H=10,P=10;void main(int argc, char *argv) int i, j, k, t ; int aNM; /矩阵A int bMP; /矩阵B long int cNP; /结果矩阵 int ArraySize4;
3、/矩阵的行数和列数 int myid, rank, numprocs, namelen; double mypi, pi; double startwtime, endwtime; char processor_nameMPI_MAX_PROCESSOR_NAME; MPI_Init(&argc, &argv); MPI_Comm_size(MPI_COMM_WORLD, &numprocs); MPI_Comm_rank(MPI_COMM_WORLD, &myid); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Get_processor_name(p
4、rocessor_name, &namelen); ArraySize0=N;ArraySize1=M;ArraySize2=H;ArraySize3=P; ofstream sinput; sinput.open(sinput.txt); /新建一个sinput.txt /*/使用的代码/* for(i = 0; i ArraySize0; i+) for(j = 0; j ArraySize1; j+) sinput rand() % 100 ; coutendl; coutendl; for(i = 0; i ArraySize2; i+) for(j = 0; j ArraySize3
5、; j+) sinput rand() % 100 ; */* coutProcess:myid 主机名:processor_nameendl; if(myid = 0) t = 10000; startwtime = MPI_Wtime(); if(rank = 0) /* ifstream in(sinput.txt); / coutArraySize0; / ArraySize0=N; / coutArraySize1; / ArraySize1=M; / coutArraySize2; / ArraySize2=H; / coutArraySize3; / ArraySize3=P;
6、/* /* if(ArraySize0N|ArraySize1M) coutM|ArraySize3P) cout你输入的矩阵b过大!; exit(0); */ if(ArraySize1!=ArraySize2) cout你输入的两个矩阵不可以相乘!n; exit(0); /* /* for(i = 0; i ArraySize0; i+) for(j = 0; j ArraySize3; j+) cij=0; /初始化矩阵c */ /* srand(unsigned)time( NULL ); /初始化随机数生成器 cout随机生成a矩阵:ArraySize0行,ArraySize1列n;
7、 for(i = 0; i ArraySize0; i+) for(j = 0; j aij; aij=rand() % 100; / 是生成 0 到 100 之间的随机数,做矩阵a的元素 coutaij ; /输出矩阵a coutendl; /* cout随机生成b矩阵:ArraySize2行,ArraySize3列n; for(i = 0; i ArraySize2; i+) for(j = 0; j bij; bij=rand() % 100; / 生成 0 到 100 之间的随机数,做矩阵b的元素 coutbij ; /输出矩阵b coutendl; /* /i-j-k优化算法/* f
8、or(i = 0; i ArraySize0; i+) for(j = 0; j ArraySize3; j+=numprocs) /k+ for(k = 0; k ArraySize1; k+) cij = cij + aik * bkj; /计算 */ /* /* /j-k-i优化算法 for(j = 0; j ArraySize3; j+) for(k = 0; k ArraySize1; k+=numprocs) /k+ for(i = 0; i ArraySize0; i+) cij =0; cij = cij + aik * bkj; /计算 /* /对矩阵b转置可以节省存储空间/
9、* for(i=0;iNUM;i+) for(j=0;ji;j+) temp=Bij; Bij=Bji; Bji=temp; */ MPI_Reduce(&mypi, &pi, 1, MPI_DOUBLE, MPI_SUM, 0,MPI_COMM_WORLD); if(rank = 0) cout矩阵a与矩阵b的乘积为:ArraySize0行,ArraySize3列endl; if(numprocs - 1) for(i = 0; i ArraySize0; i+) for(j = 0; j ArraySize3; j+) cout2*cij ; coutendl; else for(i = 0; i ArraySize0; i+) for(j = 0; j ArraySize3; j+) coutcij ; coutendl; if(myid = 0) endwtime = MPI_Wtime(); cout程序运行时间为:; coutendwtime-startwtimeendl; MPI_Finalize();2改变上述并行程序中三重循环的顺序,统计不同循环顺序的运行时间,性能及效率,将结果填写在下表中
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1