2012-04-09 55 views
0

基本上我想要實現這樣的事情:
如何使兩個線程的兩個進程接收,在MPI中相互發送?

Process 1 
    Thread 1 
    Receive X from process 2 
    Thread 2 
    Receive Y from process 2 
Process 2 
    Thread 1 
    Send X to process 1 
    Thread 2 
    Send Y to process 1 
在MPI

與並行線程庫C語言。
我已經在PVM中做過,這裏是源代碼:
master.c:http://pastebin.com/wwEie7gn,
slave.c:http://pastebin.com/gfeCkcss
我試圖做的事:
prog.c:http://pastebin.com/tCVKN3fe
不知何故接收器線程沒有收到任何東西。我不知道問題是什麼。我希望有人能告訴我做到這一點的正確方法。
我正在運行沒有線程支持的MPI編譯。

+0

爲什麼不生成4個進程? – suszterpatt 2012-04-09 18:55:42

+0

你需要閱讀:http://www.mpi-forum.org/docs/mpi-20-html/node162.htm#Node162 – Anycorn 2012-04-09 19:00:19

+0

@suszterpatt後來我希望這些線程使用pthreads共享內存空間。 – wieczorek1990 2012-04-12 16:00:21

回答

0

您想對兩個消息使用不同的標籤,例如,您可以使用接收者線程的(已知?)ID標記消息。然後,進程1中的每個線程都會發送一個接收,其ID爲標記,並且該接收只會匹配指向該特定線程的消息。

請注意,MPI 2.2提供有限的與線程的互操作性。默認情況下,大多數MPI實現不是線程安全的。例如,打開MPI需要在配置期間明確啓用全線程支持(默認情況下禁用)。您需要至少具有MPI_THREAD_SERIALIZED線程級別,如provided參數MPI_Thread_init(或MPI_Query_thread)中返回的那樣,以便能夠在不同線程中進行MPI調用。如果您的MPI庫僅提供MPI_THREAD_SINGLEMPI_THREAD_FUNNELED級別,那麼您運氣不佳,無法在主線程之外進行MPI調用。如果提供的級別爲MPI_THREAD_SERIALIZED,則可以從任何線程進行MPI調用,但必須明確地串行化調用,即確保不會同時進行兩個或更多調用(例如,使用臨界區或互斥體)。如果提供的級別是MPI_THREAD_MULTIPLE那麼你有完全的多線程支持,並且可以從任何線程和任何時間點進行MPI調用。

相關問題