【问题标题】:Segmentation fault by using MPI_Scatter and MPI_Gather使用 MPI_Scatter 和 MPI_Gather 的分段错误
【发布时间】:2020-11-08 20:33:28
【问题描述】:

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

===================================================================================
=   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

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

#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();
}

有人可以帮忙吗?

【问题讨论】:

  • 您能解释一下您为构建和运行此代码所做的工作吗?
  • 我正在使用这个:mpich.org/downloads 编译:mpic++ -o main.out main.cpp 运行:mpirun -np 'number of the threads''main.out 文件的绝对路径'

标签: c++ mpi


【解决方案1】:

我认为这是你的错误:

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

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

【讨论】:

  • 这样的小事......非常感谢!
猜你喜欢
  • 2013-10-24
  • 2017-05-25
  • 1970-01-01
  • 1970-01-01
  • 2012-12-01
  • 2020-11-20
  • 2015-08-10
  • 2017-02-26
  • 2021-04-08
相关资源
最近更新 更多