MPI

发布时间 2023-09-23 23:19:28作者: 13763857269
 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();//并行结束