2010-03-09 103 views
0

我正在寫一個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; 
} 

masterslave功能結束之前做一些工作隨心所欲。我可以證實,主線程至少已經到達了操作的末尾。從屬線程始終是在執行中止之前未完成的線程。使用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); 
} 
+0

可能是主站或從站功能的問題。請發佈複製問題的那些函數的最小*版本。如果幸運的話,當你嘗試減少問題時會發現問題。 – 2010-03-09 21:45:19

回答

1

你必須使用線程安全版本的mpi運行時。 在MPI_Init_thread上閱讀。

+0

好的,檢查出來。它看起來像我所在的系統不支持MPI_THREAD_MULTIPLE;它只能達到MPI_THREAD_SERIALIZED。 我擰了嗎? – bhilburn 2010-03-09 23:10:37

+0

作爲一個粗略的猜測,「序列化」意味着只要您使用某種關鍵段鎖定來保護您的MPI調用,您就可以保證一次只有一個線程正在進行MPI調用。 – 2010-03-09 23:46:14

+0

@HokieTux 很難說。在我看來,從同一個mpi等級發送/接收不是一個好的設計,但我不知道你的細節。嘗試設計解決方案,以便不會同時發送和接收數據,可能使用威脅信號/共享內存 – Anycorn 2010-03-10 00:11:02