Rami Far
Rami Far

Reputation: 404

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

Here is my code I want to multiply a 2D array with a vector array:

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

This same program is working fine when I have static array, But with dynamic I got this error.

E:\MS(CS)\2nd Semester\Parallel Programing\programs\arr_multi\Debug>mpiexec -n 4 arr_multi.exe Enter rows and columns: 3 2

job aborted: [ranks] message

[0-1] terminated

[2] process exited without calling finalize

[3] terminated

---- error analysis -----

[2] on RAMISHA-PC arr_multi.exe ended prematurely and may have crashed. exit code 0xc0000005

---- error analysis -----

I declared an array with contiguous location and my rows are divided correctly among processes. I think I have problem with my data structure and tried many solutions but in vain.

Upvotes: 0

Views: 13267

Answers (1)

rustyx
rustyx

Reputation: 85341

First and foremost, there are ways to debug an MPI application, which should really be your top priority. A general approach for multi-process applications is to pause at the beginning of your application e.g. with a getchar() then attach to each process with a debugger as described here:

  • compile, link and start running your MPI program (you may wish to put a read statement early on to hold the program while you do the next steps)
  • attach to one of the currently running MPI processes: Debug - Attach to Process brings up a dialogue box which lists Available Processes. You should see NUM instances (where N is from mpiexec -n NUM) of your executable. Select all of these and click on Attach. You can now debug by adding breakpoints etc. To move between MPI processes use the Process drop-down menu just above the code listing.

Having said that, at least one of the problems is with this part: int **array = new int*[(close - start)*cols]; (in the receive part of the application). You allocate the first dimension but not the second, so all pointers in the first dimension are uninitialized.

Change it to something like:

        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;

Or if you really want to use a 2D array, copy the initialization code from the sending part:

        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];
        }

The second problem is that v_array, being a global is not initialized in your receiver processes. Remember that in MPI each process is an independent program. So you should initialize v_array always, i.e. regardless of pro_id.

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

Upvotes: 2

Related Questions