MPI and multidimensional array allocation in C

后端 未结 1 1255
星月不相逢
星月不相逢 2021-01-23 12:47

I\'m try to use MPI_Scatter, sending rows of matrix(that are dynamically allocated), but it sending only one row, in others are junk. When I use static memory allocation - every

1条回答
  •  野趣味
    野趣味 (楼主)
    2021-01-23 13:25

    This isn't an MPI issue, it's a C and multidimensional arrays issue.

    The problem is that in C there's no guarantee that your allocated matrix is actually P*P contiguous ints. So when you try to scatter P*P ints starting at matrix[0][0], who knows what you're sending out.

    This code:

    matrix = new int *[P];
    for(int i = 0; i < P; i ++)
        matrix[i] = new int [P];
    

    Allocates first an array of P pointers-to-int, and then sets each one to a pointer where has been allocated P ints. But there's no guarantee at all that matrix[1] starts where matrix[0] ends. If you want to do this - and you do, both for MPI and normally for multi-d arrays in technical computing applications generally - you have to manually allocate the contiguous block of memory and have matrix point into it:

    matrix = new int *[P];
    int *data = new int [P*P];
    for(int i = 0; i < P; i ++)
        matrix[i] = &(data[P*i]);
    

    And then the scatter should work.

    Note too that you should be using delete, not free(), to deallocate memory allocated with new.

    0 讨论(0)
提交回复
热议问题