【DOC】-矩阵相乘的并行算法的设计与实现
矩阵相乘的并行算法的设计与实现 仲恺农业工程学院实验报告纸
计算机科学与工程学院(院、系) 网络工程 专业 083 班 组 并行计算 应用试验 课
实验三 矩阵相乘的并行算法的设计与实现 一、 实验目的
理解和掌握矩阵相乘的并行算法的设计思想以及实现原理 二、 实验内容
编译和运行一个两矩阵相乘算法的并行程序 三、 实验步骤
1 使用vi编辑器输入并行计算的代码,保存在multi.c中 #include
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); 第 1 页 共 7 页
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(\= %d\\n\a[i][j]=i+j; for(i=0;i averow=NRA/numworkers; extra=NRA%numworkers; offset=0; mtype=FROM_MASTER; for(dest=1;dest<=numworkers;dest++) { rows=(dest<=extra)?averow+1:averow; printf(\ MPI_Send(&offset,1,MPI_INT,dest,mtype,MPI_COMM_WORLD); MPI_Send(&rows,1,MPI_INT,dest,mtype,MPI_COMM_WORLD); count=rows*NCA; 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(\{ printf(\printf(\第 2 页 共 7 页 if(taskid>MASTER) { mtype=FROM_MASTER; source=MASTER; printf(\ MPI_Recv(&offset,1,MPI_INT,source,mtype,MPI_COMM_WORLD,&status); printf(\ MPI_Recv(&rows,1,MPI_INT,source,mtype,MPI_COMM_WORLD,&status); printf(\ count=rows*NCA; MPI_Recv(&a,count,MPI_DOUBLE,source,mtype,MPI_COMM_WORLD,&status); printf(\ count=NCA*NCB; MPI_Recv(&b,count,MPI_DOUBLE,source,mtype,MPI_COMM_WORLD,&status); printf(\ for(k=0;k c[i][k]=c[i][k]+a[i][j]*b[j][k]; } mtype=FROM_WORKER; printf(\ MPI_Send(&offset,1,MPI_INT,MASTER,mtype,MPI_COMM_WORLD); MPI_Send(&rows,1,MPI_INT,MASTER,mtype,MPI_COMM_WORLD); MPI_Send(&c,rows*NCB,MPI_DOUBLE,MASTER,mtype,MPI_COMM_WORLD); printf(\ } MPI_Finalize(); return 0; } 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 四、 实验结果 第 3 页 共 7 页 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