Ошибка шины в MPI_Finalize - PullRequest
       26

Ошибка шины в MPI_Finalize

0 голосов
/ 13 октября 2011

Я пишу программу 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;
}

1 Ответ

0 голосов
/ 13 октября 2011

Я не уверен, является ли это причиной, но MPI_Reduce обычно составляет одну строку, нет необходимости писать две строки.Попробуйте, чтобы увидеть, поможет ли это.

MPI_Reduce(&check, &receive, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);
if(myRank == 0){
     std::cout << "The total time was: " << MPI_Wtime() - startTime << " \n";
     std::cout << "The checksum was: " << receive << " \n";
     printArray();
}
...