c - MPI_Gather 2D array
parallel-processing send (1)
N
es 4, también lo es N_glob
. Sucede que es 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 tengo p
submatrices y estoy tratando de reunirlos todos en el proceso raíz, donde la matriz global los espera. Sin embargo, arrojará un error, ¿alguna idea?
Estoy recibiendo un fallo seg:
MALA TERMINACIÓN DE UNO DE SUS PROCEDIMIENTOS DE APLICACIÓN PID 29058 EN EJECUCIÓN linux16 CÓDIGO DE SALIDA: 139 SU APLICACIÓN FINALIZÓ CON LA CADENA DE SALIDA: Error de segmentación (señal 11)
EDITAR:
Encontré esta pregunta en la falla de segmentación MPI_Gather e inicialicé global_grid
en NULL, pero no global_grid
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 la matriz global vivir 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 bloqueará aquí:
MPI_Gather(&gridPtr[0][0], 1, rowType,
global_grid[0], 1, rowType, 0, MPI_COMM_WORLD);
La variable global_grid
no se inicializa en rangos distintos al rango 0. Por lo tanto, esta ecuación
&(global_grid[0][0])
o este:
global_grid[0]
conduce a una falla de segmentación, porque intenta acceder al primer elemento de global_grid.
Simplemente haga dos llamadas a MPI_Gather
, una para el rango 0 y otra para los otros:
if(id == 0) {
MPI_Gather(gridPtr[0], 1, rowType, global_grid[0], 1, rowType, 0, MPI_COMM_WORLD);
} else {
MPI_Gather(gridPtr[0], 1, rowType, NULL, 0, rowType, 0, MPI_COMM_WORLD);
}