并行计算实验二报告.docx
《并行计算实验二报告.docx》由会员分享,可在线阅读,更多相关《并行计算实验二报告.docx(17页珍藏版)》请在冰点文库上搜索。
![并行计算实验二报告.docx](https://file1.bingdoc.com/fileroot1/2023-5/10/ccddad1d-27ac-49ac-90c1-0d272531a347/ccddad1d-27ac-49ac-90c1-0d272531a3471.gif)
并行计算实验二报告
广东技术师范学院实验报告
学院:
计算机科学学院
专业:
计算机科学与技术
班级:
成绩:
姓名:
学号:
组别:
组员:
实验地点:
工业中心203
实验日期:
指导教师签名:
预习情况
操作情况
考勤情况
数据处理情况
实验
(二)项目名称:
并行程序设计
一、实验目的
在一个局域网中建立能够互相通信的两台计算机,实现两台计算机并行运算。
二、实验内容:
1.编写一个计算矩阵乘积的并行程序。
统计采用不同优化选项编译该程序生成的代码的运行时间,根据程序的计算量和运行时间计算出程序的实际浮点性能(以MFLOPS为单位)和效率(实际性能/处理器峰值性能),并将结果填写在下表中(根据需要加行)。
提示:
用“time程序名”可以得到程序的运行时间。
优化选项
运行时间/s
性能/MFLOPS
效率/%
减少矩阵初始化的循环次数
0.000978616
0.637
51.9
去掉不相关的输出
0.00102164
0.956
77.9
源程序代码:
#include"mpi.h"
#include
#include
#include
#include
constintN=10,M=10,H=10,P=10;
voidmain(intargc,char*argv[])
{
inti,j,k,t;
inta[N][M];//矩阵A
intb[M][P];//矩阵B
longintc[N][P];//结果矩阵
intArraySize[4];//矩阵的行数和列数
intmyid,rank,numprocs,namelen;
doublemypi,pi;
doublestartwtime,endwtime;
charprocessor_name[MPI_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(processor_name,&namelen);
ArraySize[0]=N;ArraySize[1]=M;ArraySize[2]=H;ArraySize[3]=P;
ofstreamsinput;
sinput.open("sinput.txt");//新建一个sinput.txt
//**************************************************************
//使用的代码
/*for(i=0;i{
for(j=0;j{
sinput<}
}
cout<cout<for(i=0;i{
for(j=0;j{
sinput<}
}
*/
//**************************************************************
cout<<"Process:
"<"<if(myid==0)
{
t=10000;
startwtime=MPI_Wtime();
}
if(rank==0)
{
//******************************************************
ifstreamin("sinput.txt");
//cout<<"请输入矩阵a的行列数:
\n行数:
";
//cin>>ArraySize[0];
//ArraySize[0]=N;
//cout<<"列数:
";
//cin>>ArraySize[1];
//ArraySize[1]=M;
//cout<<"请输入矩阵b的行列数:
\n行数:
";
//cin>>ArraySize[2];
//ArraySize[2]=H;
//cout<<"列数:
";
//cin>>ArraySize[3];
//ArraySize[3]=P;
//**********************************************
/*if(ArraySize[0]>N||ArraySize[1]>M)
{
cout<<"你输入的矩阵a过大!
";
exit(0);
}
if(ArraySize[2]>M||ArraySize[3]>P)
{
cout<<"你输入的矩阵b过大!
";
exit(0);
}
*/
if(ArraySize[1]!
=ArraySize[2])
{
cout<<"你输入的两个矩阵不可以相乘!
\n";
exit(0);
}
//*****************************************
/*for(i=0;i{
for(j=0;j{
c[i][j]=0;//初始化矩阵c
}
}
*/
//********************************
srand((unsigned)time(NULL));//初始化随机数生成器
cout<<"随机生成a矩阵:
"<for(i=0;i{
for(j=0;j{
in>>a[i][j];
a[i][j]=rand()%100;//是生成0到100之间的随机数,做矩阵a的元素
cout<}
cout<}
//********************************************************
cout<<"随机生成b矩阵:
"<for(i=0;i{
for(j=0;j{
in>>b[i][j];
b[i][j]=rand()%100;//生成0到100之间的随机数,做矩阵b的元素
cout<
}
cout<}
}
//****************************************************
//i-j-k优化算法
/*for(i=0;i{
for(j=0;j{
for(k=0;k{
c[i][j]=c[i][j]+a[i][k]*b[k][j];//计算
}
}
}
*/
//*******************************************
//****************************************************
//j-k-i优化算法
for(j=0;j{
for(k=0;k{
for(i=0;i{
c[i][j]=0;
c[i][j]=c[i][j]+a[i][k]*b[k][j];//计算
}
}
}
//*******************************************
//对矩阵b转置可以节省存储空间
/*for(i=0;i{
for(j=0;j
{
temp=B[i][j];
B[i][j]=B[j][i];
B[j][i]=temp;
}
}
*/
MPI_Reduce(&mypi,&pi,1,MPI_DOUBLE,MPI_SUM,0,MPI_COMM_WORLD);
if(rank==0)
cout<<"矩阵a与矩阵b的乘积为:
"<if(numprocs-1)
{
for(i=0;i{
for(j=0;j{
cout<<2*c[i][j]<<"";
}
cout<}
}
else
{
for(i=0;i{
for(j=0;j{
cout<}
cout<}
}
if(myid==0)
{
endwtime=MPI_Wtime();
cout<<"程序运行时间为:
";
cout<}
MPI_Finalize();
}
2.改变上述并行程序中三重循环的顺序,统计不同循环顺序的运行时间,性能及效率,将结果填写在下表中。
循环顺序
运行时间/s
性能/MFLOPS
效率/%
I,J,K
0.000973867
0.838
68.3
I,K,J
0.000992584
0.869
70.8
J,K,I
0.00125351
0.934
76.1
J,I,K
0.00106103
0.802
65.4
K,I,J
0.00123954
0.902
73.5
K,J,I
0.00124681
0.976
79.6
3、实验分析与结论
在宿舍与同学无法实现双机或多机并行计算,各个主机在vc++中编译生成已通过,但是最后实现多机运算时失败,各个主机都能单机运行,而如今没有上机课,实验上交时间期限将近,无法到机房实现并行计算,因此,本实验只给出单机运算的结果。
之前在上机课时弄了个手动输入的小矩阵,但因矩阵太小,回到宿舍修改代码随机生成比较大的矩阵,却是不能实现多机运算了。