Pergunta

Estou escrevendo um programa MPI (Visual Studio 2K8 + MSMPI) que usa o Boost :: Thread para gerar dois threads por processo MPI e ter tido um problema, estou tendo problemas para rastrear.

Quando eu administro o programa com: mpiexec -n 2 program.exe, um dos processos de repente termina:

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 -----

Não tenho idéia de por que o primeiro processo está de repente e não consigo descobrir como rastrear o motivo. Isso acontece mesmo se eu colocar o processo zero em um loop infinito no final de todas as suas operações ... ele morre de repente. Minha principal função se parece com a seguinte:

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;
}

Onde o master e slave As funções fazem algum trabalho arbitrário antes de terminar. Posso confirmar que o tópico principal, no mínimo, está chegando ao fim de suas operações. O fio escravo é sempre o que não é feito antes que a execução seja abortada. Usando declarações de impressão, parece que o fio escravo não está realmente atingindo erros ... Ele está felizmente se movendo e é retirado no acidente.

Então, alguém tem alguma idéia para:
a) O que poderia estar causando isso?
b) Como devo depurar?

Muito obrigado!

Editar:

Publicando versões mínimas das funções mestre/escravo. Observe que o objetivo deste programa é puramente para fins de demonstração ... por isso não está fazendo nada útil. Essencialmente, os threads mestres enviam uma carga útil fictícia para o segmento de escravos do outro processo 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);
}
Foi útil?

Solução

Você precisa usar a versão segura do thread do MPI Runtime. Leia sobre MPI_Init_thread.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top