MPI_Gather 2D array

N es 4, también lo esN_glob. Resulta ser del mismo tamaño.p es 4.

Aquí hay una pequeña porción del código:

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);

donde tengop submatrices y estoy tratando de reunirlos a todos en el proceso raíz, donde la matriz global los espera. Sin embargo, solo arrojará un error, ¿alguna idea?

Estoy recibiendo una falla seg:

MALA TERMINACIÓN DE UNO DE SUS PROCESOS DE APLICACIÓN PID 29058 CORRIENDO EN linux16 CÓDIGO DE SALIDA: 139 SU SOLICITUD TERMINADA CON LA CADENA DE SALIDA: Falla de segmentación (señal 11)

EDITAR:

Encontré esta preguntaMPI_Gather fallo de segmentación e inicialicéglobal_grid a NULL, pero sin suerte. Sin embargo, si lo hago:

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

entonces todo funciona. Pero, ¿no debería vivir la matriz global solo en el proceso raíz?

EDIT_2:

Si lo hago:

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

entonces se estrellará aquí:

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