C++ 程序过早结束,可能已崩溃。退出代码0xc0000005

C++ 程序过早结束,可能已崩溃。退出代码0xc0000005,c++,parallel-processing,mpi,C++,Parallel Processing,Mpi,这是我的代码,我想将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, &a

这是我的代码,我想将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;
}
#包括
#包括
使用名称空间std;
int v_数组[10];
int CHU大小、开始、关闭;
国际关系;
int行,cols;
int main(int argc,char*argv[])
{
int专业id,tot专业;
MPI_Init(&argc,&argv);
MPI通信等级(MPI通信世界和专业id);
MPI通信大小(MPI通信世界和tot专业);
如果(pro_id==0){
cout>行>>列;
整数**数组=新整数*[行];
int size1=行*列;
数组[0]=新整数[size1];
对于(int j=1;jgetchar()
然后使用调试器连接到每个进程,如下所述:

  • 编译、链接并开始运行您的MPI程序(您可能希望在执行下一步时,尽早放置
    read
    语句以保留程序)
  • 附加到当前运行的一个MPI进程:调试-附加到进程将弹出一个对话框,列出可用进程。您应该看到
    NUM
    实例(其中
    N
    来自
    mpiexec-N NUM
    )选择所有这些并单击“附加”。现在可以通过添加断点等进行调试。要在MPI进程之间移动,请使用代码列表上方的进程下拉菜单
话虽如此,这个部分至少有一个问题:
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;
首先也是最重要的是,有一些方法可以调试MPI应用程序,这应该是您的首要任务。多进程应用程序的一般方法是在应用程序开始时暂停,例如使用
getchar()
然后使用调试器连接到每个进程,如下所述:

  • 编译、链接并开始运行您的MPI程序(您可能希望在执行下一步时,尽早放置
    read
    语句以保留程序)
  • 附加到当前运行的一个MPI进程:调试-附加到进程将弹出一个对话框,列出可用进程。您应该看到
    NUM
    实例(其中
    N
    来自
    mpiexec-N NUM
    )选择所有这些并单击“附加”。现在可以通过添加断点等进行调试。要在MPI进程之间移动,请使用代码列表上方的进程下拉菜单
话虽如此,这个部分至少有一个问题:
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;

当您使用调试器时,程序崩溃时是在哪一行?我无法摆脱这样的感觉,即您使用
MPI\u send
发送的内容与使用
MPI\u Recv
接收的内容不同。请记住,
array
在两个分支中都是指针数组,通常不能在进程之间传输指针(即使是从同一个程序创建的)。请不要粘贴文本的屏幕截图,请粘贴文本本身。当您使用调试器执行程序时,每次一行,并检查每个步骤上所有变量的值,您进行了哪些观察?在非根列组上,您是否应该访问
array[i-start][j]
相反?您的调试语句也不正确。一般来说,您应该
MPI\u Scatterv(数组,…)
并且您不需要传输
开始
关闭
cols
。当您使用调试器时,程序崩溃时是在哪一行?我无法动摇这样的感觉,即您使用
MPI\u发送
发送的内容与使用
MPI\u Recv
接收的内容不同。请记住
array
这两个分支都是指针数组,通常不能在进程之间传输指针(即使是从同一个程序创建的)。请不要粘贴文本的屏幕截图,粘贴文本本身,并在使用调试器执行程序时,一次粘贴一行,并检查进程上所有变量的值
        for (int i = 0; i < rows; i++) {
            v_array[i] = 1;
        }