文档库 最新最全的文档下载
当前位置:文档库 › 并行计算实验二报告

并行计算实验二报告

并行计算实验二报告
并行计算实验二报告

广东技术师范学院实验报告

实验(二)项目名称:并行程序设计

一、实验目的

在一个局域网中建立能够互相通信的两台计算机,实现两台计算机并行运算。

二、实验内容:

1.编写一个计算矩阵乘积的并行程序。统计采用不同优化选项编译该程序生成的代码的运行时间,根据程序的计算量和运行时间计算出程序的实际浮点性能(以MFLOPS为单位)和效率(实际性能/处理器峰值性能),并将结果填写在下表中(根据需要加行)。

提示:用“time程序名”可以得到程序的运行时间。

源程序代码:

#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 a[N][M]; //矩阵A

int b[M][P]; //矩阵B

long int c[N][P]; //结果矩阵

int ArraySize[4]; //矩阵的行数和列数

int myid, rank, numprocs, namelen;

double mypi, pi;

double startwtime, endwtime;

char processor_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;

ofstream sinput;

sinput.open("sinput.txt"); //新建一个sinput.txt

//**************************************************************

//使用的代码

/* for(i = 0; i < ArraySize[0]; i++)

{

for(j = 0; j < ArraySize[1]; j++)

{

sinput << rand() % 100 <<" ";

}

}

cout<

cout<

for(i = 0; i < ArraySize[2]; i++)

{

for(j = 0; j < ArraySize[3]; j++)

{

sinput << rand() % 100 <<" ";

}

}

*/

//************************************************************** cout<<"Process:"<

if(myid == 0)

{

t = 10000;

startwtime = MPI_Wtime();

}

if(rank == 0)

{

//****************************************************** ifstream in("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 < ArraySize[0]; i++)

{

for(j = 0; j < ArraySize[3]; j++)

{

c[i][j]=0; //初始化矩阵c

}

}

*/

//********************************

srand((unsigned)time( NULL )); //初始化随机数生成器

cout<<"随机生成a矩阵:"<

for(i = 0; i < ArraySize[0]; i++)

{

for(j = 0; j < ArraySize[1]; j++)

{

in>>a[i][j];

a[i][j]=rand() % 100; // 是生成 0 到 100 之间的随机数,做矩阵a的元素

cout<

}

cout<

}

//******************************************************** cout<<"随机生成b矩阵:"<

for(i = 0; i < ArraySize[2]; i++)

{

for(j = 0; j < ArraySize[3]; j++)

{

in>>b[i][j];

b[i][j]=rand() % 100; // 生成 0 到 100 之间的随机数,做矩阵b的元素

cout<

}

cout<

}

}

//****************************************************

//i-j-k优化算法

/* for(i = 0; i < ArraySize[0]; i++)

{

for(j = 0; j < ArraySize[3]; j+=numprocs) //k++

{

for(k = 0; k < ArraySize[1]; k++)

{

c[i][j] = c[i][j] + a[i][k] * b[k][j]; //计算}

}

}

*/

//*******************************************

//****************************************************

//j-k-i优化算法

for(j = 0; j < ArraySize[3]; j++)

{

for(k = 0; k < ArraySize[1]; k+=numprocs) //k++

{

for(i = 0; i < ArraySize[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 < ArraySize[0]; i++)

{

for(j = 0; j < ArraySize[3]; j++)

{

cout<<2*c[i][j]<<" ";

}

cout<

}

}

else

{

for(i = 0; i < ArraySize[0]; i++)

{

for(j = 0; j < ArraySize[3]; 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

相关文档