广东技术师范学院实验报告
实验(二)项目名称:并行程序设计
一、实验目的
在一个局域网中建立能够互相通信的两台计算机,实现两台计算机并行运算。
二、实验内容:
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 )); //初始化随机数生成器