c parallel-processing mpi send distributed-computing

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