mpi矩阵乘法代码实现c++版本(打印矩阵并输出耗费时间)
时间: 2023-12-19 10:04:53 浏览: 137
MPI实现矩阵乘法
以下是一个简单的 MPI 矩阵乘法代码的实现:
```
#include <stdio.h>
#include <stdlib.h>
#include <mpi.h>
#define N 1000
int main(int argc, char *argv[]) {
int rank, size, i, j, k;
double start, end;
double A[N][N], B[N][N], C[N][N];
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
if (rank == 0) {
// 初始化 A 和 B
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++) {
A[i][j] = i + j;
B[i][j] = i * j;
}
}
start = MPI_Wtime();
// 将 A 和 B 分发给其它进程
for (i = 1; i < size; i++) {
MPI_Send(A[0], N * N, MPI_DOUBLE, i, 0, MPI_COMM_WORLD);
MPI_Send(B[0], N * N, MPI_DOUBLE, i, 0, MPI_COMM_WORLD);
}
// 计算自己的部分
for (i = 0; i < N / size; i++) {
for (j = 0; j < N; j++) {
C[i][j] = 0;
for (k = 0; k < N; k++) {
C[i][j] += A[i][k] * B[k][j];
}
}
}
// 接收结果
for (i = 1; i < size; i++) {
MPI_Recv(C[i * N / size], N * N / size, MPI_DOUBLE, i, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
}
end = MPI_Wtime();
// 打印结果并输出耗费时间
printf("Time: %f\n", end - start);
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++) {
printf("%f ", C[i][j]);
}
printf("\n");
}
} else {
// 接收 A 和 B
MPI_Recv(A[0], N * N, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
MPI_Recv(B[0], N * N, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
// 计算自己的部分
for (i = rank * N / size; i < (rank + 1) * N / size; i++) {
for (j = 0; j < N; j++) {
C[i][j] = 0;
for (k = 0; k < N; k++) {
C[i][j] += A[i][k] * B[k][j];
}
}
}
// 发送结果
MPI_Send(C[rank * N / size], N * N / size, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD);
}
MPI_Finalize();
return 0;
}
```
这个代码会在主进程中初始化 A 和 B,然后将它们分发给其它进程。每个进程会计算自己部分的结果,然后将结果发送给主进程。主进程会等待所有进程都完成计算,然后将结果打印出来并输出耗费时间。
希望这个回答能够帮到你!
阅读全文