Вопрос

Я пишу программу 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);
}
Это было полезно?

Решение

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top