Я пишу программу MPI для класса параллельных вычислений.У меня работает код, и он выдает правильный результат, но когда я пытаюсь вызвать MPI_Finalize с более чем одним процессом, я получаю ошибку Buss.Я запускаю это на OS X через среду PTP в Eclipse.Ошибка выглядит следующим образом:
[Fruity:49034] *** Process received signal ***
[Fruity:49034] Signal: Bus error (10)
[Fruity:49034] Signal code: (2)
[Fruity:49034] Failing at address: 0x100336d7e
[Fruity:49034] [ 0] 2 libSystem.B.dylib 0x00007fff865cc1ba _sigtramp + 26
[Fruity:49034] [ 1] 3 ??? 0x0000000000000000 0x0 + 0
[Fruity:49034] [ 2] 4 libSystem.B.dylib 0x00007fff86570c27 tiny_malloc_from_free_list + 1196
[Fruity:49034] [ 3] 5 libSystem.B.dylib 0x00007fff8656fabd szone_malloc_should_clear + 242
[Fruity:49034] [ 4] 6 libopen-pal.0.dylib 0x0000000100187b9f opal_memory_base_open + 527
[Fruity:49034] [ 5] 7 libSystem.B.dylib 0x00007fff8656f98a malloc_zone_malloc + 82
[Fruity:49034] [ 6] 8 libSystem.B.dylib 0x00007fff8656dc88 malloc + 44
[Fruity:49034] [ 7] 9 libSystem.B.dylib 0x00007fff8657846d asprintf + 157
[Fruity:49034] [ 8] 10 libopen-rte.0.dylib 0x000000010013aebc orte_schema_base_get_job_segment_name + 108
[Fruity:49034] [ 9] 11 libopen-rte.0.dylib 0x000000010013d899 orte_smr_base_set_proc_state + 57
[Fruity:49034] [10] 12 libmpi.0.dylib 0x0000000100063758 ompi_mpi_finalize + 312
[Fruity:49034] [11] 13 Assignment31 0x0000000100002642 main + 491
[Fruity:49034] [12] 14 Assignment31 0x0000000100001688 start + 52
[Fruity:49034] *** End of error message ***
mpirun noticed that job rank 0 with PID 49033 on node Fruity.local exited on signal 15 (Terminated).
1 additional process aborted (not shown)
Вот основная функция моего кода.Я уверен, что здесь есть некоторые плохие практики C ++ (я не использовал его годами и самоучка), но он выдает правильные значения.Если мне нужно опубликовать остальную часть файла, я могу это сделать.Я просто не хотел ставить этот огромный вопрос, если есть что-то явно не так.Я получаю сообщение об ошибке только при вызове этой функции, и только когда у меня запущено более одного процесса.Вот моя функция doItered.Предполагается заменить каждое значение матрицы, которая не находится на краю матрицы, максимумом самого себя и его четырех соседей.Предполагается, что значения будут обновлены после завершения всего обновления (таким образом, использование массива temp).
void doIteration(){
int pos;
double* temp = new double[end - start + 1];
for(pos = start; pos <= end; pos++){
int i, row, col;
double max;
convertToRowCol(pos, &row, &col);
if(isEdgeNode(row, col))
continue;
int dependents[4];
getDependentsOfPosition(pos, dependents);
max = a[row][col];
for(i = 0; i < 4; i++){
if(isInvalidPos(dependents[i]))
continue;
int dRow, dCol;
convertToRowCol(dependents[i], &dRow, &dCol);
max = std::max(max, a[dRow][dCol]);
}
temp[pos] = max;
}
for(pos = start; pos <= end; pos++){
int row, col;
convertToRowCol(pos, &row, &col);
if(! isEdgeNode(row, col))
a[row][col] = temp[pos];
}
delete [] temp;
}