使用 MPI_Scatter 和 MPI_Gather 的分段错误

Segmentation fault by using MPI_Scatter and MPI_Gather

我正在尝试计算矩阵元素的逐元素乘法。 但是我遇到了这个错误,不知道该怎么办。

===================================================================================
=   BAD TERMINATION OF ONE OF YOUR APPLICATION PROCESSES
=   PID 16855 RUNNING AT kevlinsky-PC
=   EXIT CODE: 139
=   CLEANING UP REMAINING PROCESSES
=   YOU CAN IGNORE THE BELOW CLEANUP MESSAGES
===================================================================================
YOUR APPLICATION TERMINATED WITH THE EXIT STRING: Segmentation fault (signal 11)
This typically refers to a problem with your application.
Please see the FAQ page for debugging suggestions

任务是在进程之间拆分它,计算结果并return它到零进程。 代码示例:

#include <iostream>
#include <math.h>
#include "mpi.h"

int main(int argc, char *argv[]){
    MPI_Init(&argc, &argv);
    int rank, size;
    MPI_Comm_size(MPI_COMM_WORLD, &size);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);

    const int n = 4;

    int arrayA[n][n];
    int arrayB[n][n];
    for (int i = 0; i < n; i++){
        for (int j = 0; j < n; i++) {
            arrayA[i][j] = (rand() % 1000) - 500;
        }
        for (int j = 0; j < n; i++) {
            arrayB[i][j] = (rand() % 1000) - 500;
        }
    }

    int getbufA[n];
    int getbufB[n];

    int arrayC[n][n];
    int bufC[n];

    MPI_Scatter(&arrayA, n, MPI_INT, &getbufA, n, MPI_INT, 0, MPI_COMM_WORLD);
    MPI_Scatter(&arrayB, n, MPI_INT, &getbufB, n, MPI_INT, 0, MPI_COMM_WORLD);

    for (int i = 0; i < n; i++) {
        bufC[i] = getbufA[i] * getbufB[i];
    }

    MPI_Gather(&bufC, n, MPI_INT, &arrayC, n, MPI_INT, 0, MPI_COMM_WORLD);

    if (rank == 0) {
        printf("MATRIX C \n");
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                printf("%d ", arrayC[i][j]);
            }
            printf("\n");
        }
    }

    MPI_Finalize();
}

有人可以帮忙吗?

我认为这是你的错误:

for (int j = 0; j < n; i++) {
    arrayA[i][j] = (rand() % 1000) - 500;
}

您需要在此循环中 j++。你在两个地方有这个错误。 j 永远不会递增并保持 0,并且 i 会无限递增(因为循环的条件是基于 j),所以很快你就会越界对于数组,因此出现分段错误。