MPI_Gather 2D массив

N это 4, так этоN_glob, Это бывает того же размера.p это 4.

Вот небольшая часть кода:

float **global_grid;
float **gridPtr; 
lengthSubN = N/pSqrt;
subN = lengthSubN + 2;
grid = allocate2D(grid, subN, subN);
..
MPI_Type_contiguous(lengthSubN, MPI_FLOAT, &rowType);
MPI_Type_commit(&rowType);
..
gridPtr = grid;
..
MPI_Barrier(MPI_COMM_WORLD);
if(id == 0) {
    global_grid = allocate2D(global_grid, N_glob, N_glob);
}
MPI_Barrier(MPI_COMM_WORLD);
MPI_Gather(&(gridPtr[0][0]), 1, rowType,
           &(global_grid[0][0]), 1, rowType, 0, MPI_COMM_WORLD);
MPI_Barrier(MPI_COMM_WORLD);
if(id == 0)
    print(global_grid, N_glob, N_glob);

где яp субматрицы, и я пытаюсь собрать их все в корневом процессе, где их ожидает глобальная матрица. Однако, это просто выдаст ошибку, есть идеи?

Я получаю ошибку сегмента:

ПЛОХОЕ ПРЕКРАЩЕНИЕ ОДНОГО ИЗ ВАШИХ ПРОЦЕССОВ ПРИЛОЖЕНИЯ PID 29058, ВЫХОДЯЩИЙ НА ВЫХОДЕ linux16: 139 ВАШЕ ПРИЛОЖЕНИЕ, ПРЕКРАЩЕННОЕ ВЫХОДНОЙ СТРОКОЙ: Ошибка сегментации (сигнал 11)

РЕДАКТИРОВАТЬ:

Я нашел этот вопросMPI_Gather ошибка сегментации и я инициализировалglobal_grid NULL, но не повезло. Однако, если я сделаю:

//if(id == 0) {
    global_grid = allocate2D(global_grid, N_glob, N_glob);
//}

тогда все работает. Но не должна ли глобальная матрица жить только в корневом процессе?

EDIT_2:

Если я сделаю:

if(id == 0) {
    global_grid = allocate2D(global_grid, N_glob, N_glob);
} else {
    global_grid = NULL;
}

тогда он рухнет здесь:

MPI_Gather(&gridPtr[0][0], 1, rowType,
                global_grid[0], 1, rowType, 0, MPI_COMM_WORLD);

Ответы на вопрос(1)

Ваш ответ на вопрос