通过 MPI 集体通信检查二维矩阵是否严格对角占优

问题描述 投票:0回答:1

下面的程序接收一个 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 循环中使用的行数一样?

c parallel-processing mpi scatterview
1个回答
0
投票
  1. 第一个问题是,正如 Victor 指出的那样,您需要处理 N 不是 p 的倍数的情况。因此,您需要将

    int loc_num = N / p;
    更改为
    int loc_num = (N - 1) / p + 1;
    ,并在全局
    i
    大于
    N
    时中断循环。

  2. 第二个问题是

    if (abs(loc_matrix[i][i]) <= row_sum)
    是错误的。
    loc_matrix[i][i]
    不是对角元素。
    loc_matrix[i][global_i]
    是,其中
    global_i = i + my_rank * loc_num

© www.soinside.com 2019 - 2024. All rights reserved.