我正在寫一個MPI程序(Visual Studio 2k8 + MSMPI),它使用Boost ::線程爲每個MPI進程產生兩個線程,並且遇到了問題,我遇到了問題跟蹤下。多線程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
功能結束之前做一些工作隨心所欲。我可以證實,主線程至少已經到達了操作的末尾。從屬線程始終是在執行中止之前未完成的線程。使用print語句,似乎slave線程沒有實際發生任何錯誤......它很高興地移動,只是在崩潰中被取出。
那麼,有沒有人有任何想法:
a)什麼可能導致這種情況?
b)我應該如何去調試它?
非常感謝!
編輯:
發佈最低版本的主/從功能。請注意,這個程序的目標純粹是爲了演示目的...所以它沒有做任何有用的事情。本質上,主線程向另一個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);
}
可能是主站或從站功能的問題。請發佈複製問題的那些函數的最小*版本。如果幸運的話,當你嘗試減少問題時會發現問題。 – 2010-03-09 21:45:19