Processo MPI multithreado de repente
-
18-09-2019 - |
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);
}
Solução
Você precisa usar a versão segura do thread do MPI Runtime. Leia sobre MPI_Init_thread
.