仲恺农业工程学院实验报告纸
计算机科学与工程学院(院、系) 网络工程 专业 083 班 组 并行计算应用试验 课
学号:200810224311 姓名:李志冬 实验日期:2011-05-19 教师评定
实验三 矩阵相乘的并行算法的设计与实现
一、
实验目的
理解和掌握矩阵相乘的并行算法的设计思想以及实现原理 二、
实验内容
编译和运行一个两矩阵相乘算法的并行程序 三、
实验步骤
1 使用vi编辑器输入并行计算的代码,保存在multi.c中 #include
#define MASTER 0
#define FROM_MASTER 1 #define FROM_WORKER 2 MPI_Status status;
int main(int argc, char *argv[]) { int numtasks, taskid, numworkers, source, dest, nbytes, mtype,
intsize, dbsize, rows, averow,extra,offset, i,j,k, count;
double a[NRA][NCA],b[NCA][NCB],c[NRA][NCB]; intsize = sizeof(int); dbsize = sizeof(double); MPI_Init(&argc,&argv);
MPI_Comm_rank(MPI_COMM_WORLD,&taskid); MPI_Comm_size(MPI_COMM_WORLD,&numtasks); numworkers = numtasks-1; if(taskid==MASTER) { printf(\ for(i=0;i MPI_Send(&a[offset][0],count,MPI_DOUBLE,dest,mtype,MPI_COMM_WORLD); count=NCA*NCB; MPI_Send(&b,count,MPI_DOUBLE,dest,mtype,MPI_COMM_WORLD); offset=offset+rows; } mtype=FROM_WORKER; for(i=1;i<=numworkers;i++) { source = i; MPI_Recv(&offset,1,MPI_INT,source,mtype,MPI_COMM_WORLD,&status); MPI_Recv(&rows,1,MPI_INT,source,mtype,MPI_COMM_WORLD,&status); count=rows*NCB; MPI_Recv(&c[offset][0],count,MPI_DOUBLE,source,mtype,MPI_COMM_WORLD,&status); } printf(\ for(i=0;i 2 编译multi.c mpicc –o multi.o multi.c 3 启动mpd后台程序 mpd& 4 在单机上运行multi.o mpirun –np 10 ./multi.o 5 在多台计算机上运行multi.o (1) 编辑并行计算的主机文件nodelist node1:5 node2:4 node3:8 (2) 运行并行计算程序 mpirun -machinefile nodelist -np 2 ./multi.o 四、 实验结果 单机运行结果: Master=0,mtype=1 Master=0,mtype=1 Number of worker tasks = 9 sending 7 rows to task 1 sending 7 rows to task 2 sending 7 rows to task 3 sending 7 rows to task 4 sending 7 rows to task 5 sending 7 rows to task 6 sending 7 rows to task 7 sending 7 rows to task 8 sending 6 rows to task 9 Master=0,mtype=1 offset=0 rows=7 a[0][0]=0.000000e+00 b= after computer after send Master=0,mtype=1 offset=7 rows=7 a[0][0]=7.000000e+00 b= after computer after send Master=0,mtype=1 offset=14 rows=7 a[0][0]=1.400000e+01 b= after computer after send Master=0,mtype=1 offset=28 rows=7