Почему MPI не завершится изящно? - PullRequest
1 голос
/ 07 декабря 2011

Всякий раз, когда я пытаюсь завершить свою программу MPI, я получаю ошибки, подобные следующим:

[mpiexec] HYDT_dmxu_poll_wait_for_event (./tools/demux/demux_poll.c:70): assert (!(pollfds[i].revents & ~POLLIN & ~POLLOUT & ~POLLHUP)) failed
[mpiexec] main (./pm/pmiserv/pmip.c:221): demux engine error waiting for event
[mpiexec] HYDT_bscu_wait_for_completion (./tools/bootstrap/utils/bscu_wait.c:99): one of the processes terminated badly; aborting
[mpiexec] HYDT_bsci_wait_for_completion (./tools/bootstrap/src/bsci_wait.c:18): bootstrap device returned error waiting for completion
[mpiexec] HYD_pmci_wait_for_completion (./pm/pmiserv/pmiserv_pmci.c:352): bootstrap server returned error waiting for completion
[mpiexec] main (./ui/mpich/mpiexec.c:294): process manager error waiting for completion

Иногда вместо этого появляется glibc ошибка "двойное освобождение или повреждение"Каждый процесс является однопоточным, и каждый процесс наверняка вызывает MPI_Finalize ().Есть идеи, что здесь может пойти не так?

Ответы [ 2 ]

2 голосов
/ 07 декабря 2011

Я написал небольшую тестовую программу, которая должна завершиться без ошибок. Пожалуйста, попробуйте запустить его. Если он завершается корректно, значит, проблема в вашем коде.

#include <mpi.h>
#include <cstdio>

int main(int argc, char *argv[])
{
    MPI_Init(&argc, &argv);
    int my_rank;
    MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
    int finalize_retcode = MPI_Finalize();
    if(0 == my_rank) fprintf(stderr, "Process, return_code\n");
    fprintf(stderr, "%i, %i\n", my_rank, finalize_retcode);
    return 0;
}
1 голос
/ 29 января 2013

Я только что столкнулся с подобной проблемой.

    MPI_Request* req = (MPI_Request*) malloc(sizeof(MPI_Request)*2*numThings*numItems);
    int count;
    for( item in items ) {
       count = 0;
       for( thing in things ) {
          MPI_Irecv(<sendBufF>, 1, MPI_INT, <src>, <tag>, MPI_COMM_WORLD, &req[count++]);
          MPI_Isend(<recvBufF>, 1, MPI_INT, <dest>, <tag>, MPI_COMM_WORLD, &req[count++]);
       }
    } 

    MPI_Status* stat = (MPI_Status*) malloc(sizeof(MPI_Status)*2*numThings*numItems);
    MPI_Waitall(count, req, stat);

Вызов MPI_Waitall(...) осуществляется со значением count, которое меньше числа выполненных Isend и recv;что приводит к тому, что сообщения не принимаются.Перемещение count=0 за пределы цикла for устранило ошибку MPI_Finalize(...).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...