2015-12-30 2 views
1

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

Вы пробовали использовать отладчик? – EkcenierK

+0

Hmm @KLibby Я обновляю. – gsamaras

+0

Где это _hung_? На какой строке кода? Вы имеете в виду, что функция никогда не возвращается? – ryyker

ответ

3

Переменная global_grid не инициализируется в других, чем ранга 0 рангов. Таким образом, это уравнение

&(global_grid[0][0]) 

или это один:

global_grid[0] 

приводит к ошибке сегментации, поскольку он пытается получить доступ к первому элементу global_grid.

Просто сделайте два вызова MPI_Gather, один для ранга 0 и один для остальных:

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

Вы правы, спасибо Мартину! Итак, как должен выглядеть мой 'MPI_Gather()'? – gsamaras

+0

@gsamaras Добавлен вызов 'MPI_Gather'. –

+0

Мартин благодарит, что сделал трюк. Теперь я должен фактически отправить данные, которые мне нужны, в глобальную матрицу, поэтому мне нужно некоторое объяснение. Только первый MPI_Gather работает, а тот, что в другом случае, ничего не делает? После небольшого эксперимента, похоже, что нет. Я также сделал следующий вопрос: http://stackoverflow.com/questions/34545278/mpi-gather-the-central-elements-into-a-global-matrix – gsamaras

Смежные вопросы