1 #include<mpi.h> 2 int myrank, numprocs; 3 4 MPI_Init(&argc, &argv); // 并行开始 5 MPI_Comm_size(MPI_COMM_WORLD, &numprocs);//获取总线程数 6 MPI_Comm_rank(MPI_COMM_WORLD, &myrank); //获取线程 id 7 MPI_Status status; 8 9 bA = new double[bm * p]; 10 B = new double[p * n]; 11 bC = new double[bm * n]; 12 //该方法是把A分块,B整体保留 13 int bm = m / numprocs; 14 //bm是分块的大小,是分块的rows 15 //numprocs是总的线程数 16 17 MPI_Scatter(A, bm * p, MPI_DOUBLE, bA, bm *p, MPI_DOUBLE, 0, MPI_COMM_WORLD); 18 //把A里面bm*p的数据给bA,再散播 19 MPI_Bcast(B, p * n, MPI_DOUBLE, 0, MPI_COMM_WORLD); 20 //把B里面n*p的数据给线程0 21 mutiple(bA, B, bC, bm, p, n); 22 //对分块里的数据进行相乘 23 MPI_Gather(bC, bm * n, MPI_DOUBLE, C, bm * n, MPI_DOUBLE, 0, MPI_COMM_WORLD); 24 //把分块里算完的数据合并起来 25 26 void mutiple(double *A, double *B, double *matResult, int m, int p, int n)//分块里的计算 27 { 28 for(int i=0; i<m; i++){ 29 for(int j=0; j<n; j++){ 30 double temp = 0; 31 for(int k=0; k<p; k++){ 32 temp += A[i*p+k] * B[k*n + j]; 33 } 34 matResult[i*n+j] = temp; 35 } 36 } 37 } 38 MPI_Finalize();//并行结束