Я пишу программу 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);
}