N
is 4, также N_glob
. Это бывает того же размера. p
равно 4.MPI_Gather 2D-массив
Вот небольшая часть кода:
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
подматрицы, и я пытаюсь собрать их все в процессе корня, где глобальная матрица ждет их. Однако, это просто вызовет ошибку, какие-нибудь идеи?
Я получаю ошибку сегм:
BAD ОКОНЧАНИЕ одного из ваших приложений обрабатывает PID 29058 работает на linux16 код выхода: 139 ваше приложение нагружен на EXIT STRING: ошибки сегментации (сигнал 11)
EDIT:
Я нашел этот вопрос MPI_Gather segmentation fault, и я инициализировал 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);
Вы пробовали использовать отладчик? – EkcenierK
Hmm @KLibby Я обновляю. – gsamaras
Где это _hung_? На какой строке кода? Вы имеете в виду, что функция никогда не возвращается? – ryyker