程序过早结束,可能已经崩溃了.退出代码0xc0000005

program ended prematurely and may have crashed. exit code 0xc0000005

本文关键字:崩溃 退出 0xc0000005 代码 结束 程序      更新时间:2023-10-16

这是我的代码,我想用向量数组乘以2D数组:

#include<iostream>
#include<mpi.h>
using namespace std;
int v_array[10] ;
int ch_size, start, close;
int res ;
int rows, cols;
int main(int argc, char *argv[])
{
    int pro_id, tot_pros;
    MPI_Init(&argc, &argv); 
    MPI_Comm_rank(MPI_COMM_WORLD, &pro_id); 
    MPI_Comm_size(MPI_COMM_WORLD, &tot_pros); 
    if (pro_id == 0) {
        cout << "Enter rows and columns: ";
        cin >> rows >> cols;
        int **array = new int*[rows];
        int size1 = rows * cols;
        array[0] = new int[size1];
        for (int j = 1; j < rows; j++) {
            array[j] = &array[0][j*cols];
        }
        for (int i = 0; i < rows; i++) {
            v_array[i] = 1;
            for (int j = 0; j < cols; j++) {
                array[i][j] = 1;
            }
        }
        for (int i = 1; i < tot_pros; i++) {
            ch_size = (rows / (tot_pros - 1));
            start = (i - 1) * ch_size;
            if (((i + 1) == tot_pros) && ((rows % (tot_pros - 1)) != 0)) {
                close = rows;
            }
            else {
                close = start + ch_size;
            }
            MPI_Send(&start, 1, MPI_INT, i, 1, MPI_COMM_WORLD);
            MPI_Send(&close, 1, MPI_INT, i, 2, MPI_COMM_WORLD);
            MPI_Send(&cols, 1, MPI_INT, i, 4, MPI_COMM_WORLD);
            MPI_Send(&array[start][0], ch_size *cols, MPI_INT, i, 3, MPI_COMM_WORLD);
        }
    }
    else
     {
        int cols;
        MPI_Recv(&start, 1, MPI_INT, 0, 1, MPI_COMM_WORLD, MPI_STATUSES_IGNORE);
        MPI_Recv(&close, 1, MPI_INT, 0, 2, MPI_COMM_WORLD, MPI_STATUSES_IGNORE);
        MPI_Recv(&cols, 1, MPI_INT, 0, 4, MPI_COMM_WORLD, MPI_STATUSES_IGNORE);
        int **array = new int*[(close - start)*cols];
        MPI_Recv(array, (close - start) *cols , MPI_INT, 0, 3, MPI_COMM_WORLD, MPI_STATUSES_IGNORE);
        for (int i = start; i < close; i++) {
            for (int j = 0; j < cols; j++) {
                cout << array[i]<<array[j];
                    res += array[i][j] * v_array[i];
                    cout << res;
                }
            }
         }
    MPI_Finalize(); 
    return 0;
}

当我有静态数组时,同一程序正常工作,但是有动态我得到了这个错误。

e: ms(cs(第二学期 Parallel 编程 program arr_multi debug> mpiexec -n 4 arr_multi.exe Enter 行和列:3 2

作业中断:[排名]消息

[0-1]终止

[2]未拨打最终确定的过程

[3]终止

----错误分析------

[2]在ramisha-pc arr_multi.exe上过早结束,可能有 坠毁。退出代码0xc0000005

----错误分析------

我声明了一个具有连续位置的数组,我的行正确分配给了进程。我认为我的数据结构有问题,并且尝试了许多解决方案,但徒劳无功。

首先,是调试MPI应用程序的方法,这确实是您的首要任务。多过程应用程序的一种一般方法是在应用程序开始时暂停,例如使用getchar(),然后用debugger附加到每个过程,如下所述在此处

  • 编译,链接并开始运行您的MPI程序(您可能希望在执行下一步时尽早放置read语句以保存该程序(
  • 附加到当前运行的MPI过程之一: debug - 附加到Process 提出一个列出可用过程的对话框。您应该看到可执行文件的NUM实例(其中N来自mpiexec -n NUM(。选择所有这些,然后单击附加。现在,您可以通过添加断点等进行调试。要在MPI进程之间移动,请使用代码列表上方的Process下拉菜单。

说,至少有一个问题是:int **array = new int*[(close - start)*cols];(在申请的接收部分中(。您分配第一个维度,而不是第二个维度,因此第一个维度中的所有指示都不是原始化的。

将其更改为:

        int *array = new int[(close - start) * cols];
        MPI_Recv(array, (close - start) *cols, MPI_INT, 0, 3, MPI_COMM_WORLD, MPI_STATUSES_IGNORE);
        for (int i = start; i < close; i++) {
            for (int j = 0; j < cols; j++) {
                cout << array[(i - start) * cols];
                res += array[(i - start) * cols] * v_array[i];
                cout << res;
            }
        }
        delete[] array;

或者如果您真的想使用2D数组,请从发送部分复制初始化代码:

        int rows = close - start;
        int **array = new int*[rows];
        int size1 = rows * cols;
        array[0] = new int[size1];
        for (int j = 1; j < rows; j++) {
            array[j] = &array[0][j*cols];
        }

第二个问题是,在接收器过程中,v_array是一个全局的初始化。请记住,在MPI中,每个过程都是一个独立的程序。因此,您应该始终初始化v_array,即不论pro_id

        for (int i = 0; i < rows; i++) {
            v_array[i] = 1;
        }