MPI標準3.0表示在第5.13節該MPI_Bcast使用線程(OpenMP的)在MPI
最後,在多線程實現中,一個可以在一個過程中多於一個, 同時執行,集體通信呼叫。在 這些情況下,用戶有責任確保在同一進程中通過兩個不同的集體 通信調用同時使用相同的通信器。
我寫了下面的程序不正確地執行(但編譯)和轉儲芯
void main(int argc, char *argv[])
{
int required = MPI_THREAD_MULTIPLE, provided, rank, size, threadID, threadProcRank ;
MPI_Comm comm = MPI_COMM_WORLD ;
MPI_Init_thread(&argc, &argv, required, &provided);
MPI_Comm_size(comm, &size);
MPI_Comm_rank(comm, &rank);
int buffer1[10000] = {0} ;
int buffer2[10000] = {0} ;
#pragma omp parallel private(threadID,threadProcRank) shared(comm, buffer1)
{
threadID = omp_get_thread_num();
MPI_Comm_rank(comm, &threadProcRank);
printf("\nMy thread ID is %d and I am in process ranked %d", threadID, threadProcRank);
if(threadID == 0)
MPI_Bcast(buffer1, 10000, MPI_INTEGER, 0, comm);
If (threadID == 1)
MPI_Bcast(buffer1, 10000, MPI_INTEGER, 0, comm);
}
MPI_Finalize();
}
我的問題是:兩個線程中的每個進程具有線程ID 0和線程ID 1柱的可以在根進程(即進程0)中作爲MPI_Send()進行廣播調用。我將它解釋爲MPI_Send()的兩個循環,其中目標是其餘進程。目標進程還會在線程ID 0和線程ID 1中發佈MPI_Bcast()。這些可以被兩個線程中的每個進程發佈爲兩個MPI_Recv()。由於MPI_Bcast()是相同的 - 在接收由進程0(根)發送的消息時,應該沒有匹配的問題。但是這個程序仍然不起作用。爲什麼?是否有可能在同一個傳播者上的不同/相同的集體上混淆了信息?而且由於MPI(mpich2)認爲這種可能性,它不允許同一個通信器上的兩個集體同時等待嗎?
謝謝您抽出時間詳細回答。 –
第一:我檢查了提供的值,它是MPI_THREAD_MULTIPLE。第二:我故意看到哪個線程在哪個進程中THIRD:再次故意,因爲我想MPI_Bcast()看起來相同。第四:你對二進制和二叉樹的實現是正確的,但我期望2進程只有他們會直接去做一個簡單的SEND和RECV。您對碎片做了一個很好的說明 - 我已經將它添加到了我的想法中:) FIFTH:某處MPI_Bcast()使用標記,因爲我可以通過MPI_ANY_TAG發佈MPI_Back()和MPI_Recv()。非常感謝! –