Многопоточный процесс MPI, внезапно завершающийся

Я пишу программу MPI (Visual Studio 2k8 + MSMPI), которая использует Boost::thread, чтобы порождать два потока на процесс MPI, и столкнулась с проблемой, которую мне трудно отследить.

Когда я запускаю программу с: mpiexec -n 2 program.exe, один из процессов внезапно завершается:

job aborted:
[ranks] message

[0] terminated

[1] process exited without calling finalize

---- error analysis -----

[1] on winblows
program.exe ended prematurely and may have crashed. exit code 0xc0000005


---- error analysis -----

Я понятия не имею, почему первый процесс внезапно завершается, и не могу понять, как отследить причину. Это происходит, даже если я помещаю процесс с нулевым рангом в бесконечный цикл в конце всех своих операций... он просто внезапно умирает. Моя основная функция выглядит так:

int _tmain(int argc, _TCHAR* argv[])
{
    /* Initialize the MPI execution environment. */
    MPI_Init(0, NULL);

    /* Create the worker threads. */
    boost::thread masterThread(&Master);
    boost::thread slaveThread(&Slave);

    /* Wait for the local test thread to end. */
    masterThread.join();
    slaveThread.join();

    /* Shutdown. */
    MPI_Finalize();
    return 0;
}

Где master а также slave функции выполняют произвольную работу перед завершением. Я могу подтвердить, что главный поток, по крайней мере, подходит к концу своих операций. Ведомый поток всегда тот, который не был выполнен до того, как выполнение было прервано. Используя операторы печати, создается впечатление, что подчиненный поток на самом деле не сталкивается ни с какими ошибками... он радостно движется и просто теряется в аварии.

Итак, есть ли у кого-нибудь идеи для:
а) Что может быть причиной этого?
б) Как мне отладить его?

Спасибо!

Редактировать:

Размещение минимальных версий функций Master/Slave. Обратите внимание, что цель этой программы - исключительно для демонстрационных целей... поэтому она не делает ничего полезного. По сути, главные потоки отправляют фиктивную полезную нагрузку подчиненному потоку другого процесса MPI.

void Master()
{   
    int  myRank;
    int  numProcs;
    MPI_Comm_size(MPI_COMM_WORLD, &numProcs);
    MPI_Comm_rank(MPI_COMM_WORLD, &myRank);

    /* Create a message with numbers 0 through 39 as the payload, addressed 
     * to this thread. */
    int *payload= new int[40];
    for(int n = 0; n < 40; n++) {
        payload[n] = n;
    }

    if(myRank == 0) {
        MPI_Send(payload, 40, MPI_INT, 1, MPI_ANY_TAG, MPI_COMM_WORLD);
    } else {
        MPI_Send(payload, 40, MPI_INT, 0, MPI_ANY_TAG, MPI_COMM_WORLD);
    }

    /* Free memory. */
    delete(payload);
}

void Slave()
{
    MPI_Status status;
    int *payload= new int[40];
    MPI_Recv(payload, 40, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &status);

    /* Free memory. */
    delete(payload);
}

1 ответ

Решение

Вы должны использовать потокобезопасную версию среды выполнения MPI. следить за публикациями MPI_Init_thread,

Другие вопросы по тегам