0

I have already looked for answers about MPI and dynamic allocation, but there is still an error in my code.

I think the pairs send/receive work well. The problem is probably due to the identical part when I want to do some basic operations. I can't specify indices of the array, otherwise I get this error:

[lyomatnuc09:07574] * Process received signal *

[lyomatnuc09:07575] * Process received signal *

[lyomatnuc09:07575] Signal: Segmentation fault (11)

[lyomatnuc09:07575] Signal code: Address not mapped (1)

[lyomatnuc09:07575] Failing at address: 0x60

The basic code that reproduce the error is below :

int **alloc_array(int rows, int cols) {
    int *data = (int *)malloc(rows*cols*sizeof(int));
    int **array= (int **)malloc(rows*sizeof(int*));
    for (int i=0; i<rows; i++)
        array[i] = &(data[cols*i]);

    return array;
}

int main(int argc, char *argv[])
{
    MPI_Init(&argc, &argv); //initialize MPI operations
    MPI_Comm_rank(MPI_COMM_WORLD, &rank); //get the rank
    MPI_Comm_size(MPI_COMM_WORLD, &size); //get number of processes
    MPI_Datatype columntype;
    MPI_Type_vector(10, 1, 10, MPI_INT, &columntype);
    MPI_Type_commit(&columntype);
    start_time = MPI_Wtime();     

    if (rank == 0) 
    {
        int **A;
        A = alloc_array(10,10);
        for ( int i =1 ;i<size;i++)
        {
            MPI_Send(&(A[0][0]), 10*10, MPI_INT, i, 1, MPI_COMM_WORLD);
        }
    } else if (rank >= 1) {
        int **A2;
        A2 = alloc_array(10,10);
        MPI_Recv(&(A2[0][0]), 10*10, MPI_INT, 0, 1, MPI_COMM_WORLD, &status);
        for (int i =0; i<10; i++)
        {
            for ( int j=0; j<10;i++)
            {
                A2[i][j]=i*j;//bug here
            }
        }
    }//end slaves task
    MPI_Finalize();
    return 0;
}
Wesley Bland
  • 8,816
  • 3
  • 44
  • 59
  • It doesn't hurt either. What hurts is the inconsistency of sometimes using a new line for the braces and sometimes not. As long as it's consistent either way is acceptable. – barq Feb 18 '15 at 14:51
  • 3
    Regardless, the problem is this line: `for ( int j=0; j<10;i++)`. You're incrementing `i` instead of `j`. – Wesley Bland Feb 18 '15 at 14:56
  • 2
    Also, don't forget to free your `MPI_Type`. – Wesley Bland Feb 18 '15 at 14:57

0 Answers0