下面的程序接收一个 3x3 矩阵作为用户输入,并检查它是否对角占优。然后根据结果返回 yes 或 no。
在检查它是否对角占优时,我依赖于这个伪代码。
flag = yes For all rows needed sum = 0 for all numbers of the same row MINUS the diagonal sum+= next number if sum <= diagonal_element then {flag=όχι; break;}
我的代码是这样的。
#include <stdio.h>
#include <mpi.h>
#include <stdlib.h>
#define N 3
int main(int argc, char** argv) {
MPI_Init(&argc, &argv);
int my_rank, p;
MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
MPI_Comm_size(MPI_COMM_WORLD, &p);
int final_res;
int matrixA[N][N];
int loc_matrix[N / p][N];
int loc_num = N / p;
if (my_rank == 0) {
printf("Enter matrix elements:\n");
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
scanf("%d", &matrixA[i][j]);
}
}
}
MPI_Scatter(matrixA, N * loc_num, MPI_INT, loc_matrix, N * loc_num, MPI_INT, 0, MPI_COMM_WORLD);
int loc_res = 1;
for (int i = 0; i < loc_num; i++) {
int row_sum = 0;
for (int j = 0; j < N; j++) {
if (j != i + my_rank * loc_num) {
row_sum += abs(loc_matrix[i][j]);
}
}
if (abs(loc_matrix[i][i]) <= row_sum) {
loc_res = 0;
break;
}
}
MPI_Allreduce(&loc_res, &final_res, 1, MPI_INT, MPI_LAND, MPI_COMM_WORLD);
if (my_rank == 0) {
if (final_res) {
printf("yes\n");
} else {
printf("no\n");
}
}
MPI_Finalize();
return 0;
}
我将矩阵的每一行分布为 N*N/p。我的支票有问题吗?就像我在 for 循环中使用的行数一样?
第一个问题是,正如 Victor 指出的那样,您需要处理 N 不是 p 的倍数的情况。因此,您需要将
int loc_num = N / p;
更改为 int loc_num = (N - 1) / p + 1;
,并在全局 i
大于 N
时中断循环。
第二个问题是
if (abs(loc_matrix[i][i]) <= row_sum)
是错误的。 loc_matrix[i][i]
不是对角元素。 loc_matrix[i][global_i]
是,其中 global_i = i + my_rank * loc_num
。